Hatred's Log Place

DON'T PANIC!

Nov 27, 2022 - 15 minute read - Programming Thinkpad

T530: восстанавливаем батарейку на контроллере R2J240_51F51

Вместо вводного слова: начала писать аж 16 сентября, а собрался закончить только 27 ноября (я появилось только 28)…

Короткое интро: на данный ноут больше не выпускают оригинальных батареек и купить, соответственно, их не возможно. А можно купить что-то на Aliexpress или (дороже и, скорее всего, хуже) на локальных площадках.

Но покупка на Ali тоже лотереей: первая батарея нормально себя вела, но кончилась очень быстро. Вторая, пришедшая, буквально недели три назад, прекрасно разряжалась, но отказалась заряжаться в моём нотбуке. Спор не заводил, китаец предложил выслать ещё одну батарейку, правда на 6 ячеек. К слову, прошивка, которая убеждает EC принимать любую батарейку, а не те, что в белом списке, тоже не помогла.

Текущая батарейка, заказанная под видом оригинальной (вот яж лох), ещё дышала (но отрубалась резко на заряде от 10% до 30%), поэтому решил попытаться что-то с ней сделать: у меня были контроллеры от старых, но рабочих батарей.

Кому интересно - под кат.

Вскрытие покажет…

Для начала вскрытие. Тут гуглите и смотрите ролики на Ютубе. У меня такая статистика:

  1. Оригинальные корпуса Lenovo: немного клея и много защёлок. Вскрыть без потерь очень трудно.
  2. Два неоригинала KingSenner с AliExpress. Защёлки, аккуратно вскрывается тонкой стальной лопаткой практически без потери потребительских свойств. Имеет смысл заказать хотя бы одну такую батарею, хотя бы ради корпуса на будущее.
  3. Неоригинал, купленный локально. Полный. Тотальный. Калл. Ой простите - клей. Хотя не, не простите. Но это дальше.

Контроллеры

На обоих оригинальных батарейках у меня был контроллер R2J240_51F51. Первый контроллер куда-то утерян.

На первой батарейке от KingSenner стоял BG8030A. С этим контроллером умеют работать нежадные версии Be2Works.

На второй батарейке от KingSenner, которая отказалась заряжаться, контроллер был, как на оригинальных, R2J240_51F51, но как показало вскрытие:

  1. там был сгоревшим предохранитель, вместо него сделан жучок
  2. замечено отсутствие одной микросхемы под номером IC3. Идентифицировать по маркировке не удалось.

Вот две платы для сравнения:

А вот IC3, с маркировкой Q5H D6 133, который идетифицировать не получилось:

В общем у меня создалось впечатление, что KingSenner занимается перепаковкой оригинальных батарей разной степени успешности, при этом, если на первом контроллере предохранитель был целым, то но этом не удосужились его заменить.

Маркировка предохранителя: 12AH3:

Временно можно его восстановить при помощи сплава Розе (проверено - переплавляется встроенным нагревателем). Для этого аккуратно снимаем пластиковую крышку пассатижами (справа на картинке, с уже переплавленной перемычкой из сплава Розе):

И вот картинка руководство с просторов интернетов (тема на Радиокоте):

И последний неоригинал… Собран на самобытном китайском контроллере. Как его хачить и восстанавливать - хз. Хотя документация полностью доступна. Ещё он не лочится.

Сам контроллер: SH36600AX:

Это в той батарее, которая у меня стояла последней и которая отрубалась в неожиданные моменты времени.

Идея

Идея была в том, что взять пакет батарей из пришедшей KingSenner и подключить к другому контроллеру.

Первой попыткой стал BQ8030.

Софт

Как я понимаю, тут вариантов не очень много. Есть Bw2Works, который стоит 20к рублей за лицензию. Есть Украинский софт, тоже не бесплатный, а оплатить его, по понятным причинам, уже не получится. Есть ребята из Тайваня (???) которые разблокируют батарею удалённо через RDP, ставят временный софт и тоже хотят денежек (такие переводы тоже могут быть проблемными, не проверял).

Есть нежадная версия Be2Works, которая работает только в WinXP и прекрасно чувствует себя в QEmu под KVM. Тогда как под VirtualBox ругается, что запущена под виртуалкой.

Из самого дешёвого и доступного, работает через контроллеры USB-SMBus CP2112, доступные тоннами на AliExpress.

И есть разработки Karosium (Viktor):

В качестве программатора использует отладочную плату на FX2LP. Стоит, к слову, ощутимо дешевле CP2112.

Волей судеб, у меня потерялся куда-то мой FX2LP, а из доступного был приобретён локально (чисто из соображений экономии времени) CP2112 с надеждой управиться через Be2Works. Забегая вперёд: Be2Works не помог, поэтому я модифицировал SMBusb для работы как с FX2LP, так и с CP2112. Точнее со вторым только под Linux, при использовании модуля i2c-dev:

sudo modprobe i2c-dev

Ссылки на наработки (я добавил CMake ещё):

mkdir build
cd build
cmake -DDISABLE_FIRMWARE=On \
      -DDISABLE_TOOLS=Off \
      -DENABLE_FX2LP_PROGRAMMER=On \
      -DENABLE_I2CDEV_PROGRAMMER=On
make
make install

Но работать с ним нужно в ручном режиме. Т.е. сканируем, делаем дамп EEPROM, правим в HEX редакторе, зашиваем обратно. Не забываем оригинальный дамп сохранить.

CP2112

Перед тем, как запускать его на Windows (с Be2Works) скачайте официальный софт и заблокируйте все изменяемые параметры. Иначе можете окирпичить его для работы с Be2Works. С тулами от Karosium это не страшно. Но всё же. Имейте ввиду.

Батареи

Итак, главное правило:

  1. Отпаиваем от ПЛЮСОВОГО (+) до МИНУСОВОГО (-) вывода в сторону понижения потенциала
  2. Припаиваем от МИНУСОВОГО (-) до ПЛЮСОВОГО (+) вывода в сторону повышения потенциала

При этих условиях скорее всего не пережжёте предохранитель и не заблокируете контроллер.

Ещё вариант, это проводить все манипуляции с контроллером без подключенной батареи, подключив лабораторник по такой схеме, выставив ограничение по току в 10-30mA (такого тока не хватить принудительно пережечь предохранитель)

BQ8030

Чип завёлся. Прочитался в Be2Works и SMBusb. Но не смог получить на выходе питание. Будто закрыт какой-то ключ. Или сгорел. Я не помню историю этой платы, осталось ли питание перед вскрытием батареи и чип отключился после отпайки батарей, или нет. Не важно, сходу запустить не смог.

Предохранитель, к слову, целый, имеет такой вид:

Схема такая:

Маркировка: SEFUSE D6X / D6T ( datasheet)

Вообще, у Каросима (aka Viktor) есть целая статья, посвященная предохранителям: The weird fuses in laptop batteries

R2J240 51F51

Прошивка LGC. На чипе просто маркировка 51F51, выяснить, что это именно R2J240 составило определённых трудов. Предохранитель там 12AH3 (смотреть выше). Оказался сгоревшим. И правда, у меня эта батарея отказала не постепенно, а именно ВНЕЗАПНО. Как оказалось, сдохла средняя секция. Именно что сдохла. Напряжение там около нуля вольт.

Что ещё можно сказать про модификацию 51F51?

  1. Это другой корпус: TSSOP38
  2. Как следствие - другое расположение пинов BOOT и RESET.
  3. Это другое расположение данных в EEPROM (но общий подход сохраняется).

Be2Works ничего с этим чипом сделать не смог, а вот с SMBusb решил поиграться. Как писал выше, я потерял свой FX2LP, так что первое, что сделал, это адаптировал его для работы в том числе и с CP2112 (точнее любимый подобным адаптером, но другие не пробовал).

Корпус имеет вид:

Первый вывод - справа снизу.

Все изыскания по этой микросхеме я выложил в комментариях к соответствующей статье Viktor’а ( Hacking the R2J240 with LGC firmware). Здесь продублирую на русском языке. Да и что бы бложик немного разбавить.

Методом логических изысканий, измерений мультиметром (что бы не закоротить землю с VCC), были найдены следующими пины:

  1. Pin 3 - VCC, 3.3В
  2. Pin 10 - BOOT, 4.7k pull-up резистор к VCC. Active LOW. Т.е. притягивать нужно к земле.
  3. Pin 13 - RESET, 5.6k pull-up резистор к VCC. Active LOW.

Что более важно, именно для этой сборки, это на какие доступный тестовые точки (TP, Test Point) выведены эти ножки: в них куда удобнее целиться по сравнению с тонкими выводами самой микросхемы:

  1. BOOT - TP1, её видно на фото выше: левее и ниже микросхемы, с той же стороны.
  2. RESET - TP14, она расположена на обратной стороны платы, примерно под микросхемой. Добраться можно даже когда плата установлена в посадочные места.

Для подстраховки, подтягивайте BOOT и RESET не напрямую к земле, а через резистор 1kOm.

Следующими особенностями данной микросхемы является то, что она не отвечает на запрос в регистр CMD_READ_CLEAR_STATUS_REG, через который софт может мониторить процесс очистки (Erase) EEPROM перед записью. Но сама очистка работает, главное подождать. Поэтому софт был немного подправлен, что бы учитывать этот нюанс.

Итак, первое, что нам нужно - снять дамп EEPROM.

$ smbusb_r2j240flasher --device i2c:///dev/i2c-7 -d eep2.bin -p df2

Сразу посмотрим отчёт для нерабочей батарейки:

$ ./smbusb_sbsreport --device i2c:///dev/i2c-7

SMBusb Firmware Version: 0.0.0  
-------------------------------------------------  
Manufacturer Name:          LGC  
Device Name:                LNV-45N101  
Device Chemistry:           LIO  
Serial Number:              31366  
Manufacture Date:           2016.12.06  

Manufacturer Access:        1002  
Remaining Capacity Alarm:   840 mAh(/10mWh)  
Remaining Time Alarm:       3 min  
Battery Mode:               0000  
At Rate:                    0 mAh(/10mWh)  
At Rate Time To Full:       65535 min  
At Rate Time To Empty:      65535 min  
At Rate OK:                 1  
Temperature:                23.65 degC  
Voltage:                    11183 mV  
Current:                    0 mA  
Average Current:            0 mA  
Max Error:                  0 %  
Relative State Of Charge    0 %  
Absolute State Of Charge    0 %  
Remaining Capacity:         0 mAh(/10mWh)  
Full Charge Capacity:       0 mAh(/10mWh)  
Run Time To Empty:          65535 min  
Average Time To Empty:      65535 min  
Average Time To Full:       65535 min  
Charging Current:           0 mA  
Charging Voltage:           0 mV  
Cycle Count:                3  
Cell 0 voltage:             3724 mV  
Cell 1 voltage:             3723 mV  
Cell 2 voltage:             3736 mV  
Cell 3 voltage:             0 mV

Меня тут сразу смутило “Charging Current” и “Charging Voltage” установленные в ноль. Как далее оказывается и значение “Manufacturer Access” 1002 ничего хорошего не говорит.

Внешний вид дампа EEPROM:

$ hexdump -Cv eep2.bin    
00000000  00 00 00 00 00 00 00 00  ff ff ff ff ff ff ff ff  |................|  
00000010  4c 4e 56 2d 34 35 4e 31  30 31 31 00 00 00 00 00  |LNV-45N1011.....|  
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|  
00000030  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000040  48 03 a8 03 03 00 00 00  00 00 00 00 03 00 03 00  |H...............|  
00000050  00 00 00 00 00 00 00 00  00 00 00 23 00 00 00 00  |...........#....|  
00000060  00 00 00 68 18 d8 00 00  00 00 00 17 10 2a 00 71  |...h.........*.q|  
00000070  01 00 00 00 00 00 ff ff  d5 4c 00 00 00 00 00 00  |.........L......|  
00000080  00 00 8b 11 2b 28 ae 0c  7f 01 00 00 00 00 00 00  |....+(..........|  
00000090  48 03 a8 03 03 00 00 00  00 00 00 00 03 00 03 00  |H...............|  
000000a0  00 00 00 00 00 00 00 00  00 00 00 23 00 00 00 00  |...........#....|  
000000b0  00 00 00 68 18 d8 00 00  00 00 00 17 10 2a 00 71  |...h.........*.q|  
000000c0  01 00 00 00 00 00 ff ff  d5 4c 00 00 00 00 00 00  |.........L......|  
000000d0  00 00 8b 11 2b 28 ae 0c  7f 01 00 00 00 00 00 00  |....+(..........|  
000000e0  48 03 a8 03 03 00 00 00  00 00 00 00 03 00 03 00  |H...............|  
000000f0  00 00 00 00 00 00 00 00  00 00 00 23 00 00 00 00  |...........#....|  
00000100  00 00 00 68 18 d8 00 00  00 00 00 17 10 2a 00 71  |...h.........*.q|  
00000110  01 00 00 00 00 00 ff ff  d5 4c 00 00 00 00 00 00  |.........L......|  
00000120  00 00 8b 11 2b 28 ae 0c  7f 01 00 00 00 00 00 00  |....+(..........|  
00000130  48 03 a8 03 03 00 00 00  00 00 00 00 03 00 03 00  |H...............|  
00000140  00 00 00 00 00 00 00 00  00 00 00 23 00 00 00 00  |...........#....|  
00000150  00 00 00 68 18 d8 00 00  00 00 00 17 10 2a 00 71  |...h.........*.q|  
00000160  01 00 00 00 00 00 ff ff  d5 4c 00 00 00 00 00 00  |.........L......|  
00000170  00 00 8b 11 2b 28 ae 0c  7f 01 00 00 00 00 00 00  |....+(..........|  
00000180  48 03 a8 03 03 00 00 00  00 00 00 00 03 00 03 00  |H...............|  
00000190  00 00 00 00 00 00 00 00  00 00 00 23 00 00 00 00  |...........#....|  
000001a0  00 00 00 68 18 d8 00 00  00 00 00 17 10 2a 00 71  |...h.........*.q|  
000001b0  01 00 00 00 00 00 ff ff  d5 4c 00 00 00 00 00 00  |.........L......|  
000001c0  00 00 8b 11 2b 28 ae 0c  7f 01 00 00 00 00 00 00  |....+(..........|  
000001d0  48 03 a8 03 03 00 00 00  00 00 00 00 03 00 03 00  |H...............|  
000001e0  00 00 00 00 00 00 00 00  00 00 00 23 00 00 00 00  |...........#....|  
000001f0  00 00 00 68 18 d8 00 00  00 00 00 17 10 2a 00 71  |...h.........*.q|  
00000200  01 00 00 00 00 00 ff ff  d5 4c 00 00 00 00 00 00  |.........L......|  
00000210  00 00 8b 11 2b 28 ae 0c  7f 01 00 00 00 00 00 00  |....+(..........|  
00000220  48 03 a8 03 03 00 00 00  00 00 00 00 03 00 03 00  |H...............|  
00000230  00 00 00 00 00 00 00 00  00 00 00 23 00 00 00 00  |...........#....|  
00000240  00 00 00 68 18 d8 00 00  00 00 00 17 10 2a 00 71  |...h.........*.q|  
00000250  01 00 00 00 00 00 ff ff  d5 4c 00 00 00 00 00 00  |.........L......|  
00000260  00 00 8b 11 2b 28 ae 0c  7f 01 00 00 00 00 00 00  |....+(..........|  
00000270  48 03 a8 03 03 00 00 00  00 00 00 00 03 00 03 00  |H...............|  
00000280  00 00 00 00 00 00 00 00  00 00 00 23 00 00 00 00  |...........#....|  
00000290  00 00 00 68 18 d8 00 00  00 00 00 17 10 2a 00 71  |...h.........*.q|  
000002a0  01 00 00 00 00 00 ff ff  d5 4c 00 00 00 00 00 00  |.........L......|  
000002b0  00 00 8b 11 2b 28 ae 0c  7f 01 00 00 00 00 00 00  |....+(..........|  
000002c0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
000002d0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
000002e0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
000002f0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000300  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000310  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000320  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000330  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000340  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000350  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000360  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000370  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000380  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
00000390  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
000003a0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
000003b0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
000003c0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
000003d0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
000003e0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|  
000003f0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|

Наглядно видно несколько идентичных секций, неиспользуемые данные, очевидно - 0xFF.

Первые 16 байт, кроме того, отвечают за включение секции: каждый байт содержит или FF или 00, реже - другое значение. Если FF, то секция с соответствующим номером не используется и там можно записать FF в качестве значений. Это нам поможет сэкономить на составление карты регистров: кто за что отвечает.

Для начала, сохраняем оригинальный дамп, на случай восстановления.

Вооружаемся HEX редактором. Пригодится любой. Я пользовался встроенным в Midnight Commander. Неплох ImHEX. А может кому-то окажется достаточным и Okteta из KDE.

Далее, первые 16 байт, кроме самого первого выставляем в FF, а первый - 00.

Затем все данные со смещения 00000090 делаем FF.

После чего приступаем к экспериментам: изменяем значения, записываем, запрашиваем репорт, смотрим, что и как поменялось.

Пара советов по подбору:

  1. Часто (но не всегда) данные в Little Endian, стоит учитывать, если значение не помещаются в один байт (0..255).
  2. Используйте программерский калькулятор для перевода значений из Dec в Hex. Мне люто нравится калькулятор из Gnome. Это единственное, что там просто огонь пламенный.
  3. Для начала пытаемся найти значения из Report, по току, остаточной ёмкости, число циклов разряда/заряда, и т.п.
  4. Потом начинаем менять другие значения, лучше байт за раз. Если поменялось значение больше 255, возможно, что рядом вторая часть этого числа.
  5. Ну и надеемся на удачу.

У меня, в результате изысканий получилась такая карта:

Смещение / Offset Размер/Size в байтах Описание/Description
0x40 2 Remain Capacity Alarm, mAh
0x44 2 Remain Time Alarm, min
0x48 2 FCC (см ниже), mWh
0x46 2 Battery Mode
0x4C 2 Cycle Count, as is
0x60-0x63 1 TBD: влияют на “Relative state of charge”, “Absolute state of charge” и “Remain Capacity”, алгоритм неясен. Не трогаем
0x6B 1 Похоже флаговый регистр, отвечающий в том числа за блокировку батареи (бит 4)

По хорошему нам нужно отредактировать FCC - Full Charge Capacity. Она не кодируется. Для перевода mAh в mWh, нужно умножить ёмкость в mAh на Design Voltage и поделить на 10. Для батареи по схеме 3S3P (как 9-cell батарея на Thinkpad T530), Design Voltage - 11.1В.

Пример расчёта для ёмкости 6000 mAh:

6000 * 11.1 / 10 = 6660, округляем до целого и в HEX: 0x1A04

Записываем значение в 0x48 в виде 04 1A.

Второй полезный регистр, это флаговый 0x6B. Судя по всему он и содержит в себе флаг ошибки и он же влияет на цифру в SBS Report в поле “Manufacturer Access”. Исходное значение здесь было 0x17. Я поменял на 0x03 и значение в “Manufacturer Access” изменилось с 1002 на 0018, кроме того значения “Charging Current” из нуля стало 3500mA, а “Charging Voltage” из нуля стало 13050mV и батарея начала заряжаться. Методом исключения, выяснил, что за блокировку отвечает бит 4.

Да, смещения (aka регистры, как я их иногда называю) даны относительно начала файла внутри первой секции. Если по какой-то причине вы решили редактировать ВСЕ секции, то правильные смещения высчитайте сами.

Калибровка

Про Windows не скажу, для Thinkpad T530 в Linux можно воспользоваться встроенной возможность в TLP:

tlp recalibrate

Подробнее: https://www.buggycoder.com/thinkpad-battery-calibration/

Рекомендую эту процедуру провести 2-3 раза.

Материалы

Без информации в интернете я бы не смог побороть недуг моей батарейки, поэтому оставлю материалы тут, вдруг кому потребуется для своих исследований: