Baterie do notebooků s obvody BQ2092 a BQ2040 (a možná dalšími)

Obsah

Ke stažení

Ať už se pustíte kteroukoli cestou, budete si muset sletovat adaptér/sondu na paralelní port (viz níže). Bohužel, ne všechny čipsety paralellních portů s tímto svérázným adaptérem a driverem i2c-pport fungují. Jsou známy konkrétní desktopové a serverové čipsety, které pro tento účel nejsou použitelné. I "použitelné" čipsety je třeba napřed správně nastavit v BIOS SETUPu - i2c adaptér většinou funguje s čipsetem v režimu "normal" nebo "SPP". Obecně velmi tolerantní jsou zřejmě notebookové čipsety. Podrobnosti hledejte v souboru help.txt přiloženém k prográmkům.

Vedle utilit, ušitých na míru konkrétnímu čipu (BQ2092 nebo BQ2040), obsahuje CD také prográmek pro všeobecné použití jménem "eeprom", převzatý z balíku lm_sensors, který slouží ke čtení a zápisu i2c CMOS Flash EEPROMek z rodiny 24cXX (24c01 až 24c16) - nejen v "chytrých" bateriích.
Konkrétě v případě "chytrých baterií" nás proto utilita eeprom neomezuje na konkrétní bateriové čipy - vedle výše zmíněných dvou čipů využívá externí sériovou EEPROM i mnoho dalších čipů, včetně nedokumentovaných. Podmínkou je, že řídící obvod používá právě paměť z rodiny 24cXX. Tato paměť neobsahuje spustitelný kód (ani ve spojení s mikrokontroléry pro všeobecné použití) - obvykle používaná 24c01 je sotva dost velká, aby pobrala počáteční kalibrační parametry a proměnné týkající se stavu baterie, které je třeba uchovat nezávisle na napájení řídícího čipu. Tyto parametry a proměnné lze upravovat.

VAROVÁNÍ:

Zapojení adaptérů pro ovladač i2c-pport

U obvodů rodiny BQ (a patrně i u dalších) existují dvě sběrnice, na které se lze připojit: externí SMBus na konektoru baterky a interní I2C pro komunikaci s Flash EEPROM.
Zapojení je takřka totožné, nicméně pro snazší přepojování při repasi doporučuji vyrobit dva samostatné adaptéry.

Obrázky konektorů byly přejaty z výborného webu Hardware Book. Konektory jsou zobrazeny tak, jako když se postavíte zezadu k počítači a civíte na jeho konektory. Čísla pinů jsou kromě toho obvykle vyražena do plastových součástí konektorů.

SMBus - externí port

Piny na paralelním portu mají následující význam:
14) SDA
16) SCL
18) zem (vlastně kterýkoli vývod z rozmezí 18-25)


(Foto)

Interní I2C na eepromku

Tento adaptér není nezbytně nutný pro reset BQ2092.

24C0XCanon 25
418
514
616
24C0XPS2 keyb.
84
24C0XAT keyb.
85

(Foto)

Všimněte si tenkých lakovaných drátů pro přiletování k nožičkám EEPROM.

Jak zkonfigurovat a zkompilovat linuxový kernel a nainstalovat i2c/lm_sensors

Jestliže jste stáhli hotové CD, můžete tuto kapitolu rovnou přeskočit.

Jestliže jste se rozhodli kompilovat zdrojové kódy, budete muset podstoupit celou proceduru kompilace a instalace kernelu:

cd /usr/src/linux      (ať už tento symlink ukazuje kamkoli)
make mrproper          (pozor, maže .config - napřed ho zazálohujte)
make symlinks
make menuconfig
make dep
make
make bzImage
make modules
make modules_install

Jestliže necháte zapnuté "verzování" modulů, kompilační systém při každém spuštění "make dep" vygeneruje náhodný řetězec (magic number), kterým pak "orazítkuje" (odekoruje) všechny symboly v kernelových modulech. Což Vás donutí po každém spuštění 'make dep' ještě explicitně rekompilovat a reinstalovat veškeré potřebné externí moduly, tj. např. i2c a lm_sensors. V opačném případě pokusy o natažení modulu (insmod) skončí chybovou hláškou ve smyslu "undefined symbol function_name_335cxxt434()."

Pokyny pro konfiguraci a instalaci kernelu a lm_sensors se liší mezi řadami Linuxu 2.2 vs. 2.4. Moje prokazatelně funkční konfigurace vypadají takto: RedHat Linux 2.2.14 + i2c-2.6.4 a RedHat Linux 2.4.18 + i2c-2.7.0 + lm_sensors 2.7.0. U některých detailů netuším, zda je přičíst navrub verzím i2c či kernelu, takže je uvádím společně v kombinacích, které mi fungovaly.

Balíky i2c a lm_sensors by měly být k dispozici na adrese www.lm-sensors.nu. Poznámka: NEZAPÍNEJTE v konfiguraci kernelu originální i2c ovladače, které jsou standardní součástí Vaší distribuce - jedná se o zastaralé verze, důrazně se doporučuje download výše uvedených verzí nebo verze aktuální.

Existují asi tři různé cesty, jak lze zkompilovat i2c a lm_sensors. Vaše zdrojáky kernelu nejméně naruší patrně klasická externí/modulární kompilace: "tar xvzf tarball.tgz", "make" a "make install". Tímto způsobem se balíky zkompilují do podoby externích modulů, které se nainstalují na správná místa. Ještě je třeba spustit "depmod -a", což mimochodem distribuce Linuxu provádí automaticky při každém startu (alespoň v RedHatu to tak funguje).
Alternativně lze patchnout strom zdrojáků kernelu a drivery natvrdo monoliticky zakompilovat - což je ovšem poměrně zbytečné. Externí modulární instalace je vůči stromu zdrojáků kernelu šetrnější a tedy bezpečnější, u mně opakovaně bez problémů zafungovala a takto nainstalované i2c balíky fungují bez odmlouvání.

Pro kompilaci i2c/lm_sensors budete potřebovat balíky python, bison, byacc a flex.

Linux 2.2 + i2c-2.6.4

Doporučuji nechat zapnutý ovladač pro paralelní port a vypnout ovladač pro tiskárnu. Tomu v `make menuconfig' odpovídají volby "general setup"->"Parallel port support", "general setup"->"PC-style hardware", vypnout "Character devices"->"Parallel printer support". Ve standardním jádře je modul pro tiskárnu zapnutý, následkem čehož se pak odmítá zavést modul i2c-pport (device in use) - pochopitelně, protože paralelní port je obsazený tiskárnovým ovladačem.

Balík lm_sensors nepotřebujete - stačí holá podpora i2c v kernelu, tj. balík i2c.

Jakmile máme jádro bez tiskárnového ovladače, a i2c moduly nainstalované, můžeme moduly zavést:

modprobe i2c-core
modprobe i2c-dev
modprobe i2c-pport

Výše uvedený postup a kód zafungovaly na následující sestavě: RedHat 6.2 CZ s víceméně původním jádrem 2.2.14 a původním kompilátorem (GCC 2.91.66). To vše na notebooku Compaq Presario 1622 :)

Linux 2.4 + i2c-2.7.0

Zdá se, že je třeba v konfiguraci kernelu zcela vypnout podporu pro paralelní port.

Musíte zkompilovat a nainstalovat jak i2c tak lm_sensors.

Je třeba zavést následující moduly:

modprobe i2c-core
modprobe dmi_scan
modprobe i2c-algo-bit
modprobe i2c-dev
modprobe i2c-proc
modprobe i2c-pport

Výše uvedený postup a kód zafungovaly na následující sestavě:
RedHat 8.0 s překonfigurovaným kernelem 2.4.18 (původní 2.4.18-14 z dílny RedHatu) a původní GCC kompilátor (RedHat GCC 3.2-7).
Vše bylo zkompilováno na stolním PC s čipsetem VIA KT333 a procesorem Athlon XP 1700+. Bohužel jsem software musel následně spouštět na jiných strojích, protože paralelní port čipsetu VIA KT333 nepodporoval i2c-pport.

Speciální zařízení pro i2c v adresáři /dev

Dokumentace u balíku i2c dále popisuje, jak pomocí příkazu mknod vytvořit zařízení /dev/i2c*, pokud je ještě nemáte. Je pouze třeba vědět major a minor number. Zkuste 'cat /proc/devices' - zjistíte major number (a ostatně také zda se i2c ovladač správně zavedl). Minor čísla začínají od nuly vzestupně. Stejně ale nejspíš prakticky využijete jedině /dev/i2c0. Já jsem zařízení od přírody měl, takže jsem je nemusel vytvářet.

Původní příběh o BQ2092

Úvodem

Tento materiál popisuje způsob, jak si lze s mnoha "chytrými" bateriemi z notebooků různých značek popovídat přes I2C - což může být například nevyhnutelné pro úspěšnou repasi baterie, tak jako v mém případě.

Před časem jsem koupil z druhé ruky notebook Compaq Presario 1622 - americký model, dovezený už jako šrot. Bylo potřeba repasovat baterii, což vypadalo jako "žádný problém". Repasovací firma si podle mechanického provedení repase dala skutečně záležet, přiložili měřící protokol dokládající perfektní funkčnost a kapacitu. Bohužel, když jsem baterii vložil do notebooku, nedala se používat - notebook nabíjel asi pět minut a prohlásil, že baterie je plně nabitá. Když jsem odpojil napájení, během pěti minut prohlásil baterii za vybitou a vypnul se.
Protože jsem s notebookem potřeboval okamžitě pracovat, odnesl jsem ho do značkového servisu. "To bude baterie. Za dva dny ji tady máte." Nutil jsem je, aby zkontrolovali, že to není nabíječkou v notebooku - než jim zaplatím nehoráznou sumu za originál baterku, která mi pak třeba bude na dvě věci. "No dobře - kolega se na to zítra podívá. Stejně to bude baterie. Naúčtujeme vám nějaké peníze za odbodnou opravu a v případě, že to výměna baterie nespraví, nebudeme ji od vás chtít zaplatit." Tak se i stalo. Bylo to skutečně baterií. Že jim to nakonec trvalo čtrnáct dní, to nebyl velký problém - a že jsem musel do servisu dvakrát, než mi ji vyskladnili, to beru jako místní folklór.
Protože šlo o pozáruční opravu / prodej materiálu, dostal jsem "vadnou" baterku z Compačího servisu zpátky. Takže jsem reklamoval repasi - bez problémů, repasovací firma se snažně omlouvala, prohlásili, že tam našli vadný článek a dodali ještě pečlivější měřící protokol.
Nicméně ani po vyřízené reklamaci se baterka neprobrala. Bohužel jsem nikde na webu ani přes známé nedostal formátovací utilitu (jak jsem později zjistil, asi by mi beztak nepomohla - viz níže technický popis). Takže jsem si plivl do dlaní a pustil jsem se do ní šroubovákem. Když jsem otevřel víko, v první řadě jsem uznale pokýval hlavou nad mechanickou fortelností repase - ti pánové od repasí nejsou břídilové.
Baterka měla rozumné napětí, na všech článkách přesně stejně. Podle napětí a typické vybíjecí křivky byla nabitá tak na 70 % - ačkoli notebook hlásil 0%. Taky dávala rozumný proud, aniž by napětí výrazněji pokleslo. Bohužel moje bastlící nádobíčko a časové omezení tady v Praze neumožňovalo podrobnější zkoumání - měření kapacity apod.
Zjistil jsem, že baterka obsahuje maličký plošák - na něm dva SMD švábi: jeden větší (DIL16) a jeden menší (DIL8). Tak jsem si pod silným světlem přečetl označení. Menší šváb je AT24C02 (zpaměti I2C sériová flash EEPROM od Atmelu) a větší šváb se jmenuje BQ2092. A ejhle - říkají tomu "gas gauge" (palivoměr), vyrábí to Texas Instruments (původně firma Unitrode, kterou TI koupili), a je od toho k dispozici datasheet. Opatrný optimismus :)
No nakonec jsem zjistil, že s BQ2092 se dá mluvit přes SMBUS (elektricky kompatibilní s I2C, příkazy SMBUS jsou podmnožinou I2C), že v té flashce má předprogramované počáteční hodnoty a ukládá si do ní runtime data - takže když člověk odpojí a připojí napájení (baterku), například i po výměně článků si pořád pamatuje starou kapacitu. A že se dá přes I2C resetovat (později jsem zjistil, že k dokončení resetu je třeba ještě odpojit a připojit baterku). A že ta I2C flashka je připojená k "privátnímu" I2C portu BQ2092, takže není zvenčí přímo přístupná. A že by se na ní dalo přímo připojit přes sondy na plšáku (in-circuit) a že se takto obvod dá zkalibrovat.
Taky jsem si vzpomněl, že nějaká podpora pro I2C je i pod Linuxem. V tom Linuxu je nejvíc softu napsaného pro ovládání různých vnitřních periferií počítače, jako jsou měřidla teploty chladičů a otáček větráků, televizní a rádiové tunery a bůhví co ještě. Dalo mi trochu práce najít ovladač pro paralelní port od Daniela Smolíka. Taky jsem měl kliku, že už jsem si trochu nabil ústa o konflikty při includování divokých header fajlů v GNU C/C++ - takže se mi podařilo uchodit přímé includování jaderných headrů z user space, které je podmínkou pro použití knihoven I2C funkcí (maker). No ale nakonec jsem si s tou baterkou hezky popovídal - vypsal jsem si z ní spoustu dat, podařilo se mi z nich většinu interpretovat, nakonec jsem ji i resetnul.

A měl jsem kliku - už pouhý reset baterku velmi uspokojivě zprovoznil :) Ačkoli by možná zasloužila kalibraci - ale na to nemám čas a asi ani vybavení.

Takže v dalším odstavci předkládám podrobnější technické informace.

Stručný technický popis

Moje baterie obsahuje články NiMH, jmenovitá kapacita je 3800 mAh, napětí 9,6V (osm článků). Výrobcem je taiwanský OEM dodavatel, firma GLW. Vedle modelu Presario 1600 se dá se použít i do modelu Presario 1200. Do téhož notebooku existuje také novější NIMH model 4,5 Ah a také Li-Ion baterie (3,6 Ah/14.4V). Čili nabíječka v notebooku je asi poměrně inteligentní. Firma GLW vyrábí baterie do spousty různých modelů notebooků různých značek. Osobně jsem svého času spekuloval, jak je asi zapojena Li-Ion baterie ve služebním notebooku Compaq Armada M700 - tvarově je jiná, ale má stejný počet vývodů, stejné je napájecí napětí notebooku (18,5 V) a zběžné měření multimetrem tehdy dávalo údaje, které jsou hodně podobné tomu, co jsem dnes viděl u starší NIMH baterie.

Baterii řídí v ní zabudovaný IO BQ2092, který s notebookem komunikuje přes SMBus/I2C.

Tenhle obrázek je jenom náhled - schéma v plné kvalitě najdete v katalogovém listu od Texas Instruments. Katalogový list si stáhněte - budete ho beztak potřebovat, pokud budete chtít interpretovat data přečtená z baterie. Někde v aplikačních poznámkách na tomtéž webu je také vzorová deska plošných spojů, nápadně podobná té, kterou jsem našel ve své baterce - jenom výkonový rezistor na převod protékajícího proudu na napětí je na vzorové desce realizován klikatým spojem, kdežto v mé baterii je osazena skutečná SMD součástka. Kromě plošáku a článků obsahuje baterie ještě termistor vyvedený přímo na vnější konektor (přestože sám obvod BQ2092 obsahuje čidlo teploty a tento údaj je k dispozici přes I2C) a také tavnou pojistku - je zapojena v sérii s články a ukrytá někde mezi nimi. Na vnějším konektoru mé baterie naopak není vyvedeno napětí na odečítacím rezistoru. Na plošném spoji jsou zajímavé čtyři LED diody pro indikaci stavu nabití, která se zobrazí při stisknutí tlačítka "DISPLAY".
Na stránkách TI jsou i další příbuzné obvody (např. zastaralý BQ219, modernější BQ2040 a další) - viz "product folder" nazvaný "gas gauges". Princip komunikace přes I2C a zřejmě i sada příkazů budou podobné. V newsech jsou zmínky, že BQ2092 je v notebookových baterkách velmi rozšířený. Podle dokumentace umí NIMH i Li-ION baterie. Proto soudím, že zde prezentované informace mohou být použitelné i pro mnoho jiných značek a modelů notebooků.

Dále je třeba vyřešit, jak baterii připojit k počítači. To se dá zařídit přes paralelní port. Interní propoj není zdokumentovaný, takže ho nelze použít - baterie bude muset ven z notebooku, abychom se dostali k jejím vývodům. Budeme potřebovat konektor Canon 25 samec, kus kabelu nebo pár drátků (tři žíly) a několik plíšků libovolného původu, které poslouží jako nožové kontakty. A pochopitelně se neobejdeme bez páječky a kusu cínu a kalafuny.

Baterie má pět vývodů - viz obrázek. Uvnitř jsou zapojeny následovně:

  1. +U(batt) = kladný pól baterie - připojeno přímo na kladný pól prvního článku
  2. SMBC neboli SCL (SM Bus Clock, Serial CLock)
  3. SMBD neboli SDA (SM Bus Data, Serial DAta)
  4. termistor(+). Druhá nožička je spojena se zemí (vývod č.5).
  5. zem = záporný pól baterie. Vlastně téměř - mezi tímto vývodem a zápornou elektrodou posledního článku je vložen rezistor na odečítání proudu (0,05 Ohmu). Čili tento vývod je připojený na plošák, odkud je takřka přímo propojený na poslední článek.

Na paralelním portu jsou vývody zapojeny takto (pro ovladač i2c-pport od pana Daniela Smolíka z linuxového balíku I2C):

14) SDA
16) SCL
18) zem (vlastně kterýkoli vývod z rozmezí 18-25)

Suma sumárum, vývody paralelního portu a baterie je třeba propojit takto:

BaterieCanon 25
216
314
518

Pokud potřebujete zkompilovat upravené jádro a nainstalovat i2c/lm_sensors, přečtěte si o tom příslušnou kapitolu.

No a nakonec je třeba si s baterkou popovídat. Osobně jsem za nejsnazší považoval napsat jednoduchý prográmek v Cčku. Zkoušel jsem C++, ale kompilátor si vylámal zuby na jaderných hlavičkových souborech - které je třeba prasecky přímo includovat, takže kolidují s něčím ve standardních knihovnách jako <iostream>. Holé Cčko se krotilo o poznání lépe. Moje kusy kódu přikládám. Jsou to dva prográmky, které by měly stačit na přečtení dat z registrů BQ2092 a reset švába. Z nějakých obskurních důvodů je potřeba to kompilovat s optimalizací - např. `cc -O2 read_batt.c -o read_batt'. Výstup prográmku read_batt.c vypadá zhruba takto: čerstvá originální baterie a repasovaná baterie před resetem.
Z baterie (BQ2092) lze vytáhnout spoustu údajů - okamžité napětí a proud, teplotu, kolik si šváb myslí že je momentální reálná využitelná kapacita baterie, stav nabití, napětí na které se nabíjí a vybíjí plus práh pro včasné varování že baterie je prázdná. Většina hodnot je kódována jako 16bitové číslo, vyjadřující nějakou veličinu v "mili"jednotkách - např. napětí v miliVoltech nebo teplotu v miliKelvinech. Pozor, některé hodnoty jsou kódovány jinak - například dolní prahová napětí jsou kódována jako binární doplněk 16bitové hodnoty v milivoltech. U některých hodnot jsem zaznamenal, že patrně neodpovídají dokumentaci. IO BQ2092 má také spoustu adresovatelných registrů, které objektivně obsahují nějaká data, ale nejsou v dokumentaci zmíněné. Podrobný popis významu jednotlivých registrů najdete v katalogovém listu.

Dokumentace je také poměrně strohá pokud se týče resetu baterie - což ovšem člověk zjistí teprve ve chvíli, kdy se o reset pokusí. První překvapení je, že BQ2092 po přijetí příkazu "RESET" ani nedokončí I2C transakci - takže ovladač v linuxu zahlásí chybu operace. Nicméně reset podle všeho proběhne - přesněji, IO se dostane do podivného nedokumentovaného stavu, kdy LEDky (které jinak slouží pro rychlou kontrolu nabití) indikují patrně nějaké debugovací informace, a jejich stav lze ovlivňovat tlačítkem "DISPLAY". V tomto stavu šváb nekomunikuje přes I2C. Teprve po krátkém odpojení od baterie se reset dokončí. V prvním nabíjecím cyklu notebook nesprávně indikuje stav nabití - ovšem po prvním cyklu by se mělo počítadlo srovnat (BQ2092 si spočítá, kolik do baterky přiteklo a odteklo mezi dolním a horním prahovým napětím). Doporučuji baterii resetovat ve chvíli, kdy je úplně vybitá - chování počítadla v prvním cyklu je pak relativně srozumitelné. Jinak je ale v zásadě jedno, při jakém stavu nabití baterii zresetujete - kromě prvního cyklu tento faktor nemá žádný vliv.

Další poznatky a poznámky na okraj

Vedle linuxového I2C lze na hardware serveru stáhnout utilitku pod Windows (ve slovenštině), která na I2C umí prý spoustu věcí - zápisy, čtení, dokonce makra složená z několika akcí... zřejmě by výpis údajů z baterky a její reset zvládla taky levou zadní. Nicméně nemám čas ji zkoušet a tedy nemám ověřeno zapojení adaptéru na paralelní port. Pro úplnost dodávám, že dost možná existuje pro I2C na paralelním portu nějaká komponenta do Delphi. Vedle výše uvedeného primitivního pasivního zapojení lze najít na síti několik různých aktivních zapojení na paralelní a sériový port.

V průběhu hrátek s baterkou potřebujeme baterii pokud možno úplně vybít. Pokud na to nemáme nějaké samostatné vybavení (byť improvizované), je třeba nechat úplné vybití na notebooku. Problém je s chytřejšími operačními systémy (Windows a Linux), které nekompromisně uspí počítač v momentě, kdy palivoměr ukáže nulu (resp. začne signalizovat "včasné varování", což je obvykle ještě o něco později). My potřebujeme baterii vybít až na dno - tj. do stavu, kdy BQ2092 detekuje "tvrdý" spodní práh a vyvolá přes I2C vypnutí notebooku (aby se baterie nepoškodila nadměrným vybitím). Toho lze dosáhnout tak, že počítač nabootujeme do holého DOSu - a nejlépe mu ještě vypneme mixerem od zvukové karty PC speaker, aby nás neotravoval teskným pištěním, že brzo umře.

Mám podezření, že přinejmenším u některých modelů notebooků není sladění BQ2092 s APM BIOSem notebooku a s operačním systémem právě optimální. Už například skutečnost, že v baterii je diskrétní termistor vyvedený samostatně ven, přestože šváb obsahuje čidlo teploty s digitálním výstupem v miliKelvinech, je poněkud zarážející (ostatně výrobce baterií GLW se od doporučení Unitrode/TI také v několika nepodstatných bodech odchýlil). Možná je to snaha o větší spolehlivost (viz potíže s baterkami, které se prý občas vzňaly). Horší je, jak notebook s baterkou nakládá - což je konec konců částečně také vina uživatele. Konkrétně, obě baterky, čerstvá originálka i repasovaná, si stěžují, že je notebook nevybíjí úplně do dna. A že tedy údaj o stavu nabití nemusí úplně odpovídat - protože se odvozuje od protékajících miliampérů, které se integrují v průběhu času mezi plným nabitím a plným vybitím - plus minus autobus, jsou tam ještě nějaké čarodějné korekce. Konkrétně BQ2092 toto signalizuje konkrétním alarmovým bitem v jistém stavovém registru - plnou interpretaci se lze dočíst v katalogovém listu. Domnívám se, že je možné, že i když člověk baterku pečlivě vybije s použitím hloupého DOSu, možná že APM BIOS notebooku zastaví vybíjení na základě údaje o okamžitém napětí ještě dříve, než BQ2092 dosáhne spodního prahového napětí, které považuje za okamžik úplného vybití. S ohledem na správnou funkci "palivoměru" a ostatně i na využívání baterie a minimalizaci paměťového jevu (jakkoli je sporný) by se totiž nabíjení a vybíjení mělo takto natvrdo zastavit teprve v momentě, kdy sám BQ2092 usoudí, že napětí překročilo příslušnou prahovou hodnotu - o čemž jednak informuje stavovými bity v jistém registru a druhak posílá "broadcasty" po I2C na definovanou I2C adresu nabíječky v notebooku (vstoupí na moment do role I2C bus mastera, přestože normálně je slave). Pochopitelně když uživatel nedbá na úplné vybíjení baterie, nelze z tohoto nedostatku vinit výrobce palivoměru, baterie, notebooku nebo operačního systému. Pak se ovšem nelze příliš divit, když se baterie v notebooku chovají po čase tak, že notebook natvrdo chcípne ve chvíli, kdy palivoměr hlásí ještě přes 50 procent. Pozorováno u jednoho hodně drahého služebního notebooku, u mnoha různých kusů ve firmě, s Li-Ion baterkami. Tedy zas až tak pochopitelné a omuvitelné tohle chování není - vypadá to, že palivoměr sice notebook vypne kvůli naprostému vybití baterie, ale údaj o odhadnuté zbytkové kapacitě si neupraví, což by za těchto okolností rozhodně měl.
Bohužel jsem tehdy neměl a ani v tomto případě nemám po ruce vybavení (a čas), abych tyhle věci mezi nebem a zemí změřil, analyzoval, oddebugoval apod. Speciálně netuším, jak bych holýma rukama a běžným bastlířským nádobíčkem odposlechl komunikaci na I2C mezi baterkou a notebookem.

Dokumentace BQ2092 mluví také o tom, že nejlepší přesnosti lze dosáhnout doladěním počátečních parametrů ve flashce (kalibrací) - BQ2092 má několik programovatelných parametrů, jako je zisk a stejnosměrná chyba čidla napětí a proudu, kterými lze vynulovat reálné nedokonalosti jak vstupů samotného IO, tak externích součástek (nepřesnosti rezistorů). Obsah inicializačních dat ve flashce je opět popsán v dokumentaci BQ2092. Při repasi ale asi nemá příliš smysl se v těchto údajích pitvat - možná je vhodné pro kontrolu základní fuknce porovnat údaje o napětí a proudu hlášené švábem s údaji, které si změříme na rozebrané baterce solidním multimetrem.
Navíc flashka není přes vnější SMBus (I2C) port baterky přímo přístupná, protože není na téže sběrnici. BQ2092 má totiž pro flashku samostatný I2C port, který není vyveden na vnější konektor baterie. Ani přes registry BQ2092 se na obsah flashky nedá přímo dostat. Šváb sice z flashky některé údaje do svých registrů přímo přebírá, ovšem většina registrů je za normálních okolností read-only (i když možná ne tak docela, viz dokumentace k resetu baterie) a v každém případě není jisté, jakého výsledku bychom dosáhli násilnou změnou parametrů za běhu palivoměru. Pokud bychom se tedy rozhodli trochu poladit kalibrovatelné parametry ve flashce, znamená to, že se na ni musíme napřed připojit in-circuit - napíchnout se sondami na SDA, SCL a také na napájení, které BQ2092 flashce dodává jenom ve chvílích, kdy s ní komunikuje (jinak ji nenapájí). A pak palivoměr zresetovat, aby si počáteční hodnoty natáhl.

Proč musíme baterku připojovat přes paralelní port? Protože jsem nikde nenašel zmínku, že by sběrnice I2C od baterky byla přístupná z operačního systému notebooku. Skoro bych řekl, že I2C končí na nabíječce zabudované v notebooku (která je patrně řízena nějakým mikrokontrolérem). Tušímže jsem někde zaslechl zmínku, že u některých notebooků si s baterkou povídá ten samý mikrokontrolér, který obsluhuje klávesnici - a že snad na baterku touto cestou vidí APM BIOS. V každém případě nevím, jak bych se touto cestou k I2C dostal - dokumentace neexistuje, v balíkách i2c a LM-sensors jsem ovladače nenašel.


K tomuto materiálu jsem dostal vyjádření od představitele jedné firmy, která se repasemi zabývá. Protože se nevyjádřil k mému dotazu, zda chce být na webu podepsán či nikoli, ponechám jeho sdělení anonymní a adresu na přání sdělím.

Vážený pane,
děkuji Vám za materiály tykající se resetu Li-ion bateríí.
 
Nutnost resetovat tento typ baterií je nám známa,  protože kontrolním čipem
(jak Vy říkáte "palivoměrem"), jsou vybaveny v podstatě všechny baterie
tohoto typu. 
Většina notebooků provede reset baterie automaticky při výměně.
U ostatních notebooků je potřeba postupovat podle návodu pro výměnu baterií,
který je součástí dokumentace ke konkrétnímu počítači. Pokud jste
postupoval podle návodu k Vašemu notebooku a přesto k resetu baterie
nedošlo, měl by tuto situaci řešit značkový servis Vašeho počítače.
Pokud, jak říkáte, jste se na značkový servis obrátil a ani oni reset
baterie neprovedli a Vám se to podařilo přes paralerní port, jistě stojí
za úvahu na čí straně je chyba.
V zásadě platí, že pokud lze baterii resetovat přes paralerní port,
lze ji resetovat i přes konkrétní notebook.
 
Pro úplnost informací je třeba dodat, že existují i baterie, které jsou
osazeny čipy, které resetovat nelze, resp. lze je resetovat pouze v případě,
že při výměně baterií byly použity naprosto stejné články a to nejen co do
napětí a kapcity, ale i co do typu - výrobce článků.
  
Uvítal bych, kdybyste pro úplnost informací doplnil své web stránky i
o toto vyjádření k problému resetu repasovaných baterií.

Něco navrch o BQ2040

BQ2040 je dalším členem rodiny bateriových řídících čipů ("palivoměrů") od firmy Benchmarq (později Unitrode, nyní Texas Instruments), které jsou kompatibilní se standarem SBS. Tak jako ostatní členové rodiny má poměrně podrobný datasheet, který popisuje všechny SMBus "příkazy" (SBS registry) a také mapu externí paměti 24c01 (sériová I2C Flash EEPROM).

Stejně jako BQ2092, i BQ2040 má zdokumentovaný (v detailech odlišný) postup vedoucí k resetu, opět závislý na ochraně proti zápisu. Na základě praktických zkušeností to ovšem vypadá, že "zdokumentovaný reset" nefunguje, a to dokonce ani po odstranění ochrany proti zápisu, což už samo o sobě vyžaduje manipulaci s externí pamětí 24c01.

Naštěstí se zdá, že existuje náhradní řešení - je třeba přepsat údaj o "skutečné kapacitě" v externí paměti Flash 24c01. Jedná se o jediné 16bitové slovo, které obsahuje naposledy naučenou kapacitu v mAh.

Povšimněte si prosím, že čipy BQ používají ke komunikaci s externí 24c01 "privátní" I2C sběrnici. Tato privátní sběrnice není dostupná přes SMBus piny ve vnějším konektoru baterie. To znamená, že pro hrátky s externí Flash pamětí potřebujeme připojit sondu (i2c adaptér pro paralelní port) přímo na nožičky 24c01, která se nachází na miniaturním plošném spoji v baterii. To lze provést nejsnáze asi pomocí páječky a tenkého lakovaného drátu (nebo pomocí nějaké nepájivé in-circuit sondy pro osmipinová SMD pouzdra, pokud taková věc existuje).

Má to ještě jeden nebo dva háčky.
Obvody z rodiny BQ šetří energii mj. i tím způsobem, že externí paměti Flash zapnou napájení vždy jenom na moment, když s ní potřebují komunikovat (číst nebo zapisovat). My ale nechceme, aby si řídící čip všiml, že jsme mu vyháčkovali EEPROMku, nebo aby nám do háčkování náhodně zasáhl, nebo aby naši novou hodnotu "skutečné kapacity" prostě ignoroval. Proto bude vhodnější po dobu naší manipulace s EEPROMkou odpojit řídící čip od napájení. Vedlejším důsledkem je, že v každém případě musíme EEPROMku napájet externě.
Řídící čipy z rodiny BQ naštěstí ve vypnutém stavu nijak nezatěžují výstup pro napájení EEPROMky proti zemi => není ani třeba přerušit původní napájecí spoj pro EEPROM na desce.
Zdroj napájení +5V získáme nejsnáze z PCčka, které používáme pro I2C komunikaci s baterií - bez otevírání krabice např. z Ucc pinu klávesnicového konektoru (AT nebo PS/2).

Shrneme-li dosavadní poznatky, měla by procedura resetu vypadat přibližně takto:

  1. Nastartujte Linux a natáhněte ovladač i2c-pport (plus ostatní potřebné moduly).
  2. Zjistěte hodnotu "skutečné kapacity", kterou o sobě baterie prohlašuje. Použijte k tomu i2c adaptér připojený k vnějšímu portu baterie a utilitu read_batt. Poté adaptér odpojte od baterie i od PC.
  3. Odpojte plošný spoj s řídícím čipem baterie od článků. (Současně můžete vyměnit staré články za nové).
  4. Připojte I2C adaptér k paměti 24c01.
  5. Připojte I2C adaptér k paralelnímu portu.
  6. Upravte obsah paměti 24c01 - buď pomocí utility šité na míru konkrétnímu řídícímu čipu, která přepíše konkrétní pozice v paměti, nebo pomocí obecné utility pro čtení a zápis I2C Flash EEPROM pamětí, ve spojení s hexa editorem (např. Midnight Commander - vestavěný hexa editor je dostupný přes F3 F4).
  7. Odpojte I2C adaptér od PC a odletujte ho od paměti 24c01.
  8. Připojte články k plošnému spoji s řídícím čipem baterie.
  9. Zkontrolujte "skutečnou kapacitu". Použijte k tomu i2c adaptér připojený k vnějšímu portu baterie a utilitu read_batt. Baterie by již měla ohlásit novou "skutečnou kapacitu".
  10. Nechte baterii proběhnout dvěma či třemi úplnými nabíjecími cykly v notebooku.

Odkazy na další literaturu

Domů