电池驱动调试总结

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命令来查看是否有电源在供电 

猜你喜欢

转载自blog.csdn.net/u010783226/article/details/84344823
今日推荐