• (067) 767-03-55
  • ragerus@gmail.com

Емулятор DS2501 для ідентифікації БЖ ноутбуків Dell своїми руками.

Фірма Dell комплектує більшість своїх ноутбуків блоками живлення, які здатні передавати інформацію про себе в ноутбук. Для цього всередині блока живлення встановлено DS2501-сумісну мікросхему пам'яті (EEPROM), куди записано досить багато інформації про блок живлення - від потужності до серійного номера. Такі блоки живлення спілкуються з ноутбуком використовуючи протокол 1-Wire. Детальніше про це можна почитати наприклад тут.

Коли ви натискаєте кнопку вмикання ноутбука, він читає вміст EEPROM, що встановлена в БЖ і якщо отримана відповідь його влаштовує - нормально стартує. Якщо ж блок живлення має недостатню потужність, або в силу різних причин невірно ідентифікується, на екрані ноутбука ви бачите повідомлення про неможливість зарядки батереї і повільну роботу.

Щось на зразок такого:

Dell warning message

Така поведінка логічна - якщо ми не знаємо від чого живимося, то про всяк випадок обмежимо споживану потужність: не будемо заряджати батерею/перемкнемо процесор в режим енергозбереження/вимкнемо дискретну графіку/інше.

Зараз я спробую розказати, як можна зробити емулятор DS2501 EEPROM, куди можна записати потрібне нам значення потужності. Типовий випадок, коли такий емулятор стане в пригоді - використання док-станції. Ви по оказії придбали док, поставили в нього ноутбук, підключили блок живлення. Натискаєте кнопку вмикання і бачите екран, як на фото вище. Тільки ноут вимагає вже не 65Вт блока, а потужнішого, 120-240Вт. Хоча споживаний системою струм зріс на якихось 50мА. Таким чином виробник страхується, адже у дока є "потужні" USB порти, які можуть віддати струм в кілька ампер.

Інша ситуація, у клієнта, власника Dell Precision M4700, здох оригінальний 180Вт блок живлення. Заміни під рукою немає, оригінальні в роздрібній мережі вельми дорогі. Зато доступні 240Вт блоки живлення від HP. Не треба нічого переробляти, штекер ідентичний, лише з ідентифікацією швах.

Дехто із читачів запитає: "- Нащо цей весь цирк із мікросхемами пам'яті, байтами та іншим? Чи не простіше при потребі перепаяти мікруху із неробочого блока живлення та й усе?". Особливо популярні такі запитання на спеціалізованих форумах, де народ любить просторікувати про вартість часу майстра.

Із свого боку я зазначу, що готові, прошиті EEPROM-ки продаються як на E-Bay так і на Aliexpress. Та й місцеві бариги на OLX можуть допомогти. Але є, як завжди, нюанс. Як я казав вище, деякі ноути (Alienware) можуть захотіти від вас досить рідкісного БЖ з потужністю 240Вт. Який на тому ж E-Bay коштує від 40$+доставка.

Так от, в більшості продавців є в наявності EEPROM-ки в яких записане значення потужності 65 або 120Вт. Крім того, не кожен клієнт згодиться чекати, поки потрібна мікруха приїде до майстра.

Тому за діло. Як показала моя практика, переважна більшість ноутбуків Dell не читає весь вміст EEPROM, а обмежується трьома байтами починаючи із адреси 0x0008. Цих три байти є значенням потужності блока живлення. Тобто нам потрібно зімітувати DS2501 EEPROM в яку буде записано за вказаною адресою необхідне нам значення потужності.

На базі чого можна зробити емулятор? Самий простий варіант для пересічного ремонтника, як про мене - Arduino. Я не виключення, тому почав шукати проекти, які реалізують необхідну мені функціональність.

Перебравши кілька варіантів я зупинився на цьому проекті. Реалізація виявилася простою як дрючок.

Приклад скетча для Arduino, який розказує Dell-івському ноутбуку, що він живиться від 240Вт блока живлення.


		#include "OneWireHub.h"
		#include "DS2502.h"
		constexpr uint8_t pin_onewire   { 2 };
		constexpr uint8_t charger240W[3] = {0x32,0x34,0x30};
		auto hub       = OneWireHub(pin_onewire);
		auto dellCH    = DS2502( 0x28, 0x0D, 0x01, 0x08, 0x0B, 0x02, 0x0A);
		
		void setup()
		{
		  hub.attach(dellCH);
		  dellCH.writeMemory(charger240W, sizeof(charger240W), 0x08);
		}
		
		void loop()
		{
		  hub.poll();
		}
		

Як бачите, код тривіальний. Якщо залити це добро в наприклад Arduino Uno (яку я і використав) і на другий вивод підключити лінію ідентифікації БЖ, ваш ноутбук вирішить, що живиться від "цеглини" потужністю 240Вт.

Залишається одна проблема - як запхати ту Uno (або навіть Mini Pro) всередину блока живлення? Вихід є. Давайте замість фабричної "Ардуїнки" використаємо окремий мікроконтролер. Що у нас є малогабаритного? А от хоч ATtiny85. Дешевий, швидкий, маленький, доступний.

Як його запрограмувати із середовища Arduino можна почитати наприклад тут. Так, в якості програматора буде використовуватися та ж Arduino Uno, з якою ми щойно експериментували. Детальніше про використання Arduino Uno як програматора можна прочитати на офіційному сайті.

Я полінувався робити нормальний програматор, обмежився шматком макетної плати з DIP панелькою, до якої припаяв дротики, що віткнув в Uno.

Arduino as ISP

Тут є один момент, про якийсь чомусь не згадує більшість авторів. Для того, щоб ATtiny могла нормально працювати, їй треба розказати від чого вона тактується і на якій частоті. Ми будемо використовувати встроєний тактовий генератор, який працюватиме на 16МГц.

Отже вибираєте конфігурацію мікроконтролера, як на скріншоті і натискаєте "Burn bootloader".

Flashing fuses

Після цього можете заливати скетч як звичайно.

В результаті нехитрих маніпуляцій ми отримуємо мікроконтролер, який при продачі живлення послушно прикидається DS2501 EEPROM-кою.

Готову конструкцію я оформив так:

ATtiny on PCB

Схема:

Schematic

Так, стабілітрон на платі теж є, як і резистор. Вони призначені для захисту порту "тіньки" від всього нехорошого, що може прийти на нього. Все згідно схеми:

Back of PCB

Всередині блока живлення:

PCB in PSU

Наостанок хочу наголосити: тверезо оцінюйте споживаний ноутом струм. Адже зробивши емулятор, потужність самого блоку живлення ви не підвищите. Хоча кому я це розказую. :)

16.05.2018