深圳市航顺芯片技术研发有限公司
直播中

rosa

12年用户 1232经验值
私信 关注
[问答]

电池驱动调试常见问题有哪些?怎么解决?

Android电池服务如何启动?是怎么运行的?
电池驱动调试常见问题有哪些?怎么解决?

回帖(1)

陈俊

2021-9-26 15:01:57
1.概述:
Android电池服务,用来监听内核上报的电池事件,并将最新的电池数据上报给系统,系统收到新数据后会去更新电池显示状态、剩余电量等信息。如果收到过温报警和低电报警,系统会自动触发关机流程,保护电池和机器不受到危害。
Android电池服务的启动和运行流程:





Android电池服务的源码结构
Frameworkbaseservicesjavacomandroidserver
├── SystemServer.java
创建BatteryServices、PowerManagerService、ActivityManagerService
├── BatterySevices.java
监听底层上报的battery事件,广播电池发生改变的消息
Frameworkbaseservicesjavacomandroidserveram
├── ActivityManagerService.java
创建BatteryStatsService
├── BatteryStatsService.java
统计和记录电池参数的信息
Frameworkbaseservicesjavacomandroidserverpower
├── PowerManagerService.java
监听电池发生变化的广播消息,并调节系统的电源状态,例如亮屏
Frameworkbasecorejavacominternalos
├── BatteryStatsImpl.java
统计和记录电池参数的信息,并通知其他模块
Systemcorehealthd
├── 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命令来查看是否有电源在供电





举报

更多回帖

发帖
×
20
完善资料,
赚取积分