BQ27541 Hibernate Mode Disabling

13
How to set Hibernate I&V mode (bq27541-v200) in kernel driver

description

This is the manual method to disable Hibernate mode in fuel gauge BQ27541.

Transcript of BQ27541 Hibernate Mode Disabling

Page 1: BQ27541 Hibernate Mode Disabling

How to set Hibernate I&V

mode (bq27541-v200) in kernel driver

Page 2: BQ27541 Hibernate Mode Disabling

1、 前言:因原始規格訂在電量達 3.2V時由GaugeIC自行判斷並進入Hibernate模式,造成許多DUT在放電達該標準後便無法充電並開啟。有鑑於電池包裝廠在出廠時已寫入該值至其韌體中,若需更換則必須整機回收並拆機進行更新,故嘗試以『軟體升級』之方式來進行。

2、 原理:Hibernate模式為系統關機時自動進入之一種狀態,主要是以極低電能的存在方式讓GaugeIC在即將回復到Normal前的一種待命行為。在目前我們遇到的『過放後無法開啟DUT』(即便是有插著AC Adapter)一類問題,都是因為在為脫離Hibernate模式前直接以AC充電的方式,嘗試回復之。但根據 TI的 datasheet所描述,Hibernate模式是一種自動回復的機制,在尚未脫離之前直接充電,便會造成此一問題。而此時的解法只能透過GaugeIC reset的方式,才有辦法讓GaugeIC回復運作模式。

以下引述 datasheet中所提及之解決方法:

Page 3: BQ27541 Hibernate Mode Disabling

3、 步驟:

1. 確認目前系統狀態根據以下說明驗證目前Hibernate I&V 之出廠設定值,若不為零,即為本文需要更動

之主要條件:將Hibernate I&V 兩欄位更新為 0。

2. 官方工具更新流程根據官方流程作為下一階段建置的主要概念,截錄以下摘要為重要步驟:

(1) 確認GaugeIC保護模式是否為UNSEALED/SEALED?(2) 取得特定廠商(Sanyo/LG)之UNSEALED密碼。(3) 開啟 block data flash “control”區塊之寫入權限。

The gauge will remain in HIBERNATE mode until any communication activity appears on the

communication lines Upon exiting HIBERNATE mode, the [HIBERNATE] bit of CONTROL_STATUS is

cleared. Since any communication activity wakes up the gauge from HIBERNATE mode, the host is

required to set the [HIBERNATE] bit of the CONTROL_STATUS register to allow gauge to re-enter

HIBERNATE mode.

Because the fuel gauge is dormant in HIBERNATE mode, the battery should not be charged or

discharged in this mode, because any changes in battery charge status will not be measured. If

necessary, the host equipment can draw a small current (generally infrequent and less than 1mA, for

purposes of low-level monitoring and updating); however, the corresponding charge drawn from the

battery will not be logged by the gauge. Once the gauge exits to NORMAL mode, the IT algorithm will

take about 3 seconds to re-establish the correct battery capacity and measurements, regardless of the

total charge drawn in HIBERNATE mode. During this period of re-establishment, the gauge reports

previously calculated values prior to entering HIBERNATE mode. The host can identify exit from

HIBERNATE mode by checking if Voltage() < Hibernate Voltage or [HIBERNATE] bit is cleared by the

gauge.

If a charger is attached, the host should immediately take the fuel gauge out of HIBERNATE mode

before beginning to charge the battery. Charging the battery in HIBERNATE mode will result in a

notable gauging error that will take several hours to correct.

Page 4: BQ27541 Hibernate Mode Disabling

(4) “寫入欲更新之 Sub Class”位址。(須轉 10進制為 16進制)(5) ”寫入欲更新之 block offset”位址。(須轉 10進制為 16進制)(6) 讀取Sub Class中所有欄位之現值並加總。(7) 計算更動後之 checksum。(公式 = 255 - sum%256)(8) 搭配計算出之 checksum來寫入新值至特定欄位,進行更新。(9) 讀取寫入新值後之欄位的新值進行確認。(10) 確認GaugeIC再次進入保護模式(SEALED)。

3. 編組軟體更新程式以下所有片段皆為運行在A500/510/701專案之原始碼,依各階段的目標敘述之。

(1) 確認GaugeIC保護模式是否為UNSEALED/SEALED?GaugeIC在出廠後都會鎖定在SEALED模式,我們必須將狀態切換成UNSEALED模式,才有辦法進行寫入的動作,而寫入時需依照 high/low byte的順序填入,每寫完一組後需留給GaugeIC特定時間以確保穩定性。以下為例:Sayno的密碼為 1640-6303,將 40寫入 0x00,而 16寫至 0x01,並留置 1秒當作緩衝,接續動作依此類推。

Page 5: BQ27541 Hibernate Mode Disabling

(2) 取得特定廠商(Sanyo/LG)之UNSEALED密碼。參照 datasheet page.22 Security class裡 sub class為 112之欄位,即為各家廠商出廠之密碼預設值。

(3) 開啟 block data flash “control”區塊之寫入權限。(4) “寫入欲更新之 Sub Class”位址。(須轉 10進制為 16進制)(5) ”寫入欲更新之 block offset”位址。(須轉 10進制為 16進制)

A. 寫入 00至 0x61。B. 寫入 44至 0x3e。(SubClass 68轉 16進制後為 0x44)C. 寫入 00至 0x3fD. 確認Hibernate I&V兩欄位是否可讀取?

Page 6: BQ27541 Hibernate Mode Disabling

E. 錯誤讀取處理

(6) 讀取Sub Class中所有欄位之現值並加總。列出該Sub Class裡所有欄位之現值,因Hibernate I&V即將設為 0,故這兩個欄位不列入加總變數 sum的計算中。

Page 7: BQ27541 Hibernate Mode Disabling

(7) 計算更動後之 checksum。checksum公式 = 255 - sum%256

(8) 搭配計算出之 checksum來寫入新值至特定欄位,進行更新。A. 寫入 00至 0x4b、0x4c以更新 Hibernate I 為 0。

B. 寫入 00至 0x4d、0x4e以更新 Hibernate V 為 0。C. 寫入 checksum至 0x60以完成更新後的比對。

Page 8: BQ27541 Hibernate Mode Disabling

(9) 讀取寫入新值後之欄位的新值進行確認。

(10) 確認GaugeIC再次進入保護模式(SEALED)。

4、 驗證:以下說明為確認 Fuel Gauge IC 是否已成功將 Hibernate I 與 M 寫入為 0(紅色字樣為指令,藍色字樣為說明。)

1. 進入 debug system 目錄

stanbirg@stanbirg:~/codebase/image/ICS-PIM$ ./adb shell (進入 adb shell)shell@android:/ $ cd sys/BatControl/ (切換路徑至 sys/BatControl) shell@android:/sys/BatControl $ ls -al (查看可用命令,如下所示。)

-rw-r--r-- root root 4096 2011-12-16 06:44 BatCapacity

-rw-r--r-- root root 4096 2011-12-16 06:44 BatCurrent

Page 9: BQ27541 Hibernate Mode Disabling

-rw-r--r-- root root 4096 2011-12-16 06:44 BatEnergyNow

-rw-r--r-- root root 4096 2011-12-16 06:44 BatHealth

-rw-r--r-- root root 4096 2011-12-16 06:44 BatPowerAVG

-rw-r--r-- root root 4096 2011-12-16 06:44 BatStatus

-rw-r--r-- root root 4096 2011-12-16 06:44 BatTemperature

-rw-r--r-- root root 4096 2011-12-16 06:44 BatVoltage

-rw-r--r-- root root 4096 2011-12-16 06:44 ChargerReset

-rw-r--r-- root root 4096 2011-12-16 06:44 CheckLGHI

-rw-r--r-- root root 4096 2011-12-16 06:44 CheckSYHI

-rw-r--r-- root root 4096 2011-12-16 06:44 DisableHibernate

-rw-r--r-- root root 4096 2011-12-16 06:44 GaugeReset

-rw-r--r-- root root 4096 2011-12-16 06:44 SealStatus

2. 檢查電池是否已重寫過 Hibernate 模式

CheckSYHI 是用以幫助 check 電池是否為 Sayno pack 的指令,使用如下:shell@android:/sys/BatControl $ cat CheckSYHI (執行後印出以下訊息)

write SY pw1 = 0

write SY pw2 = 0

0x61 = 0

0x3e = 0

0x3f = 0

FIRMWARE = 0

0x61 = 0

0x3e = 0

0x3f = 0

Page 10: BQ27541 Hibernate Mode Disabling

Hibernate I (0x4b) = 800(I 不為 0的話就是沒重新寫過!!!)

Hibernate V (0x4d) = b80b(V不為 0的話就是沒重新寫過!!!)

Change to Sealed Mode = 0

結論:目前這顆電池尚未重寫 Hibernate I&V,請跳到【3. 透過手動方式重寫 Hibernate I&V】進行寫入之動作。

當然,我們不會知道目前手上的機器是 LG 還 Sayno 的電池 pack,所以當你執行了 CheckLGHI (或 CheckSYHI)這個指令後,所得到的訊息裡有 -121 的值,就代表這顆電池不是 LG (或 Sayno) 的,如下所示:

shell@android:/sys/BatControl $ cat CheckLGHI (執行後印出以下訊息)

write LG pw1 = 0

write LG pw2 = 0

0x61 = -121

0x3e = -121

0x3f = 0

FIRMWARE = 0

0x61 = -121

0x3e = -121

0x3f = 0

Hibernate I (0x4b) = 0

Hibernate V (0x4d) = 0

Change to Sealed Mode = 0

結論:目前這顆電池不是 LG的,故請改以 CheckSYHI 指令再試一次。

如果你的電池已經有重寫過了,那你會得到的訊息如下:shell@android:/sys/BatControl $ cat CheckSYHI (執行後印出以下訊息)

write SY pw1 = 0

write SY pw2 = 0

0x61 = 0

0x3e = 0

Page 11: BQ27541 Hibernate Mode Disabling

0x3f = 0

FIRMWARE = 0

0x61 = 0

0x3e = 0

0x3f = 0

Hibernate I (0x4b) = 0 (已寫入為 0)

Hibernate V (0x4d) = 0 (已寫入為 0)

Change to Sealed Mode = 0

結論:目前這顆電池已成功將 Hibernate 模式改寫,不會再出現 IC 暫時失能的問題!

3. 透過手動方式重寫 Hibernate I&V

原則上目前的OS已在開機時自動判斷是否需要重寫,下述方法是【當你的機器從過出現 IC 暫時失能】的情況下,且在開機過程中又因未知原因(ex: I2C fail)而未重寫過,參照如下:

shell@android:/sys/BatControl $ cat DisableHibernate (執行時間約 6秒)

write SY pw1 = 0

write SY pw2 = 0

0x61 = 0

0x3e = 0

0x3f = 0

Hibernate I (0x4b) = 800(I 不為 0的話就是沒重新寫過!!!)

Hibernate V (0x4d) = b80b(V不為 0的話就是沒重新寫過!!!)

0x61 = 0

0x3e = 0

0x3f = 0

=========== 0x40 = a =========

Page 12: BQ27541 Hibernate Mode Disabling

(自動根據電池 pack 計算 checksum)=========== 0x41 = f0 =========

=========== 0x42 = 0 =========

=========== 0x43 = a =========

=========== 0x44 = 5 =========

=========== 0x45 = 0 =========

=========== 0x46 = 32 =========

=========== 0x47 = 1 =========

=========== 0x48 = c2 =========

=========== 0x49 = 14 =========

=========== 0x4a = 14 =========

=========== 0x4b = 0 =========

=========== 0x4c = 8 =========

=========== 0x4d = b =========

=========== 0x4e = b8 =========

=========== 0x4f = 32 =========

=========== 0x50 = 0 =========

=========== 0x51 = 0 =========

=========== 0x52 = 0 =========

=========== 0x53 = 0 =========

=========== 0x54 = 0 =========

=========== 0x55 = 0 =========

=========== 0x56 = 0 =========

=========== 0x57 = 0 =========

=========== 0x58 = 0 =========

=========== 0x59 = 0 =========

=========== 0x5a = 0 =========

Page 13: BQ27541 Hibernate Mode Disabling

=========== 0x5b = 0 =========

=========== 0x5c = 0 =========

=========== 0x5d = 0 =========

=========== 0x5e = 0 =========

=========== 0x5f = 0 =========

=========== sum = 258 =========

=========== CHECKSUM = a7 ========= (計算 checksum 完成)0x61 = 0

0x3e = 0

0x3f = 0

Clear Hibernate I (0x4b) = 0

(清除並寫入 I為 0)Clear Hibernate I (0x4c) = 0 (清除並寫入 I為 0)Clear Hibernate V (0x4d) = 0 (清除並寫入V為 0)Clear Hibernate V (0x4e) = 0 (清除並寫入V為 0)Checksum (0x60) = a7,

Hibernate I (0x4b) = 0 (已寫入為 0)Hibernate V (0x4d) = 0 (已寫入為 0)

Change to Sealed Mode = 0

結論:目前這顆電池已成功將 Hibernate 模式手動改寫,不會再出現 IC 暫時失能的問題!

4. 請確認電池已上鎖至 SEALED 模式

shell@android:/sys/BatControl $ cat SealStatus (執行後印出以下訊息)FAS = 4000 , SS = 2000

Reset status = 240

結論:FAS/SS 的值不等於 0,即代表目前這顆電池已上鎖。