1. 程式人生 > >電池驅動除錯總結,電池服務+電量計驅動+除錯方法

電池驅動除錯總結,電池服務+電量計驅動+除錯方法

1.概述: Android電池服務,用來監聽核心上報的電池事件,並將最新的電池資料上報給系統,系統收到新資料後會去更新電池顯示狀態、剩餘電量等資訊。如果收到過溫報警和低電報警,系統會自動觸發關機流程,保護電池和機器不受到危害。 Android電池服務的啟動和執行流程:這裡寫圖片描述 Android電池服務的原始碼結構 Framework\base\services\java\com\android\server ├── SystemServer.java 建立BatteryServices、PowerManagerService、ActivityManagerService ├── BatterySevices.java 監聽底層上報的battery事件,廣播電池發生改變的訊息 Framework\base\services\java\com\android\server\am ├── ActivityManagerService.java 建立BatteryStatsService ├── BatteryStatsService.java 統計和記錄電池引數的資訊 Framework\base\services\java\com\android\server\power ├── PowerManagerService.java 監聽電池發生變化的廣播訊息,並調節系統的電源狀態,例如亮屏 Framework\base\core\java\com\internal\os\ ├── BatteryStatsImpl.java 統計和記錄電池引數的資訊,並通知其他模組 System\core\healthd ├── healthd.cpp 建立uevent socket,監聽核心上報的核心事件 ├── BatteryMonitor.cpp 初始化本地電池資料結構,將power_supply路徑下屬性節點路徑填充進去, ├── BatteryMonitor.h ├── BatteryPropertiesRegistrar.cpp 建立電池屬性監聽器,並將其註冊到Android的系統服務中 ├── BatteryPropertiesRegistrar.h這裡寫圖片描述

核心主要通過get_property這個函式指標來獲得驅動中的有關電池的資訊,而這個函式在核心中只給出了宣告,我們在寫驅動的時候要自己實現get_property函式,當核心需要驅動中電源資訊的時候就回調這個get_property函式。例如當核心需要驅動中的電量值時,會呼叫get_property,傳入獲取電量別的標誌,我們就把從電量計中讀取到的電量值返回給核心。這裡寫圖片描述這裡寫圖片描述

。另外,我們寫驅動程式的時候又要給使用者提供介面,核心中提供給使用者的介面就是sysfs,通過讀取sysfs檔案系統中檔案內容,就可以得到電源的資訊。核心主要通過兩個檔案power_supply_class.c和power_supply_core.c,我們呼叫其中的函式就可以把電源(電池,USB或AC)的資訊展現給使用者,有關電源的屬性寫在/sys/class/powersupply資料夾下(此資料夾為程式執行後所生成的)。

/sys/class/power_supply資料夾存放的是,電池驅動通過power_supply_register函式註冊的各個電源屬性名稱。這裡寫圖片描述

在安卓系統的命令列下輸入: cat /sys/class/power_supply/rk-bat/uevent:這裡寫圖片描述 電池系統從底層向Framework層上報資料的流程:這裡寫圖片描述

2.除錯手段:

獲取手機電池資訊 adb命令:adb shell dumpsys battery 得到資訊如下: AC powered: false USB powered: true Wireless powered: false status: 1 #電池狀態:2:充電狀態 ,其他數字為非充電狀態 health: 2 present: true level: 55 #電量: 百分比 scale: 100 voltage: 3977 current now: -335232 temperature: 335 #電池狀態 technology: Li-poly

改變手機電池狀態 切換手機電池為非充電狀態: adb shell dumpsys battery set status 1

改變手機電量 讓手機電量顯示百分百: adb shell dumpsys battery set level 100 讓手機電量顯示1: adb shell dumpsys battery set level 1 3.除錯遇到的問題: 1、現象:cw2015電池驅動編寫好後,電量一直顯示100不變,從電量暫存器中讀到的值也一直是100. 解決方法:cw2015電量計晶片, 不是上電就可以正常使用的,需要寫0xFF到0xA暫存器中,延遲10ms後,再寫0x0到0xA暫存器中,去啟動該晶片(晶片手冊並沒有說明此問題,自己寫了一個命令列讀寫電量計的程式,慢慢試出來的.)

2.現象:電池電量顯示正常,能正常更新, 驅動向電池的heathd層發的uevent事件中的,cw2015的充放電狀態和電量也都是正常的可以正常接收更新的狀態; 但是無論斷電還是上電,一直顯示是充電狀態的圖示。 解決方法:一開始以為是電池服務層有問題,追了很久。 後來發現是rk-816的電池驅動影響了電池充放電圖示的更新: rk-816驅動,一直檢測我的整個電池是相當於一個ac電源插入, 當我使用電池給板卡供電時,rk-816就更新我的/sys/class/power_supply/ac下的online狀態為1,。 而我的cw2015驅動,在電源斷電和上電時, 實時更新的是/sys/class/power_supply/rk-ac下的online狀態為0和1; 當斷電時, 我的cw2015驅動更新的/sys/class/power_supply/rk-ac為0時,而rk-816的/sys/class/power_supply/ac為1,這時,上層系統判斷是有ac插入的,電池充放電狀態圖示仍為充電。 可以使用adb shell dumpsys battery命令來檢視是否有電源在供電這裡寫圖片描述