電池驅動調試總結,電池服務+電量計驅動+調試方法

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命令來查看是否有電源在供電
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章