Вместо вводного слова: начала писать аж 16 сентября, а собрался закончить только 27 ноября (я появилось только 28)…
Короткое интро: на данный ноут больше не выпускают оригинальных батареек и купить, соответственно, их не возможно. А можно купить что-то на Aliexpress или (дороже и, скорее всего, хуже) на локальных площадках.
Но покупка на Ali тоже лотереей: первая батарея нормально себя вела, но кончилась очень быстро. Вторая, пришедшая, буквально недели три назад, прекрасно разряжалась, но отказалась заряжаться в моём нотбуке. Спор не заводил, китаец предложил выслать ещё одну батарейку, правда на 6 ячеек. К слову, прошивка, которая убеждает EC принимать любую батарейку, а не те, что в белом списке, тоже не помогла.
Текущая батарейка, заказанная под видом оригинальной (вот яж лох), ещё дышала (но отрубалась резко на заряде от 10% до 30%), поэтому решил попытаться что-то с ней сделать: у меня были контроллеры от старых, но рабочих батарей.
Кому интересно - под кат.
Вскрытие покажет…
Для начала вскрытие. Тут гуглите и смотрите ролики на Ютубе. У меня такая статистика:
- Оригинальные корпуса Lenovo: немного клея и много защёлок. Вскрыть без потерь очень трудно.
- Два неоригинала KingSenner с AliExpress. Защёлки, аккуратно вскрывается тонкой стальной лопаткой практически без потери потребительских свойств. Имеет смысл заказать хотя бы одну такую батарею, хотя бы ради корпуса на будущее.
- Неоригинал, купленный локально. Полный. Тотальный. Калл. Ой простите - клей. Хотя не, не простите. Но это дальше.
Контроллеры
На обоих оригинальных батарейках у меня был контроллер R2J240_51F51. Первый контроллер куда-то утерян.
На первой батарейке от KingSenner стоял BG8030A. С этим контроллером умеют работать нежадные версии Be2Works.
На второй батарейке от KingSenner, которая отказалась заряжаться, контроллер был, как на оригинальных, R2J240_51F51, но как показало вскрытие:
- там был сгоревшим предохранитель, вместо него сделан жучок
- замечено отсутствие одной микросхемы под номером 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 это не страшно. Но всё же. Имейте ввиду.
Батареи
Итак, главное правило:
- Отпаиваем от ПЛЮСОВОГО (+) до МИНУСОВОГО (-) вывода в сторону понижения потенциала
- Припаиваем от МИНУСОВОГО (-) до ПЛЮСОВОГО (+) вывода в сторону повышения потенциала
При этих условиях скорее всего не пережжёте предохранитель и не заблокируете контроллер.
Ещё вариант, это проводить все манипуляции с контроллером без подключенной батареи, подключив лабораторник по такой схеме, выставив ограничение по току в 10-30mA (такого тока не хватить принудительно пережечь предохранитель)
BQ8030
Чип завёлся. Прочитался в Be2Works и SMBusb. Но не смог получить на выходе питание. Будто закрыт какой-то ключ. Или сгорел. Я не помню историю этой платы, осталось ли питание перед вскрытием батареи и чип отключился после отпайки батарей, или нет. Не важно, сходу запустить не смог.
Предохранитель, к слову, целый, имеет такой вид:
Схема такая:
Маркировка: SEFUSE D6X / D6T ( datasheet)
Вообще, у Каросима (aka Viktor) есть целая статья, посвященная предохранителям: The weird fuses in laptop batteries
R2J240 51F51
Прошивка LGC. На чипе просто маркировка 51F51, выяснить, что это именно R2J240 составило определённых трудов. Предохранитель там 12AH3 (смотреть выше). Оказался сгоревшим. И правда, у меня эта батарея отказала не постепенно, а именно ВНЕЗАПНО. Как оказалось, сдохла средняя секция. Именно что сдохла. Напряжение там около нуля вольт.
Что ещё можно сказать про модификацию 51F51?
- Это другой корпус: TSSOP38
- Как следствие - другое расположение пинов BOOT и RESET.
- Это другое расположение данных в EEPROM (но общий подход сохраняется).
Be2Works ничего с этим чипом сделать не смог, а вот с SMBusb решил поиграться. Как писал выше, я потерял свой FX2LP, так что первое, что сделал, это адаптировал его для работы в том числе и с CP2112 (точнее любимый подобным адаптером, но другие не пробовал).
Корпус имеет вид:
Первый вывод - справа снизу.
Все изыскания по этой микросхеме я выложил в комментариях к соответствующей статье Viktor’а ( Hacking the R2J240 with LGC firmware). Здесь продублирую на русском языке. Да и что бы бложик немного разбавить.
Методом логических изысканий, измерений мультиметром (что бы не закоротить землю с VCC), были найдены следующими пины:
- Pin 3 - VCC, 3.3В
- Pin 10 - BOOT, 4.7k pull-up резистор к VCC. Active LOW. Т.е. притягивать нужно к земле.
- Pin 13 - RESET, 5.6k pull-up резистор к VCC. Active LOW.
Что более важно, именно для этой сборки, это на какие доступный тестовые точки (TP, Test Point) выведены эти ножки: в них куда удобнее целиться по сравнению с тонкими выводами самой микросхемы:
- BOOT - TP1, её видно на фото выше: левее и ниже микросхемы, с той же стороны.
- 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.
После чего приступаем к экспериментам: изменяем значения, записываем, запрашиваем репорт, смотрим, что и как поменялось.
Пара советов по подбору:
- Часто (но не всегда) данные в Little Endian, стоит учитывать, если значение не помещаются в один байт (0..255).
- Используйте программерский калькулятор для перевода значений из Dec в Hex. Мне люто нравится калькулятор из Gnome. Это единственное, что там просто огонь пламенный.
- Для начала пытаемся найти значения из Report, по току, остаточной ёмкости, число циклов разряда/заряда, и т.п.
- Потом начинаем менять другие значения, лучше байт за раз. Если поменялось значение больше 255, возможно, что рядом вторая часть этого числа.
- Ну и надеемся на удачу.
У меня, в результате изысканий получилась такая карта:
Смещение / 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 раза.
Материалы
Без информации в интернете я бы не смог побороть недуг моей батарейки, поэтому оставлю материалы тут, вдруг кому потребуется для своих исследований:
- На первом месте софт и изыскания Karosium’а:
http://www.karosium.com/p/smbusb.html
- Конкретно для моей батарейки на R2J240:
https://www.karosium.com/2016/08/hacking-r2j240-lgc.html
- Там же в комментах скинули ссылку на живой дам для 51F51, который несколько помог: https://yadi.sk/d/nJM6Hbfk3S9qnL (но этот файл может протухнуть в любой момент времени)
- Софт: https://github.com/karosium/smbusb
- Моя версия с поддержкой I²C dev (проверено только с CP2112): https://github.com/h4tr3d/smbusb
- Конкретно для моей батарейки на R2J240:
https://www.karosium.com/2016/08/hacking-r2j240-lgc.html
- Официальный софт для CP2112:
https://www.silabs.com/interface/usb-bridges/classic/device.cp2112?tab=softwareandtools
- искать:
- SimplicityStudio-5.tgz
- USBXpressHostSDK-Linux.tar - тут можно утилитой командной строки залочить параметры.
- искать:
- Описание флагов батареи:
BATTERY FLAGS DESCRIPTION
- Локально: BATTERY FLAGS DESCRIPTION
- Один из тредов про батарейки: http://monitor.espec.ws/section34/printview177710.html, тут я нашёл Test Point, куда BOOT и RESET выведены.