深圳市航顺芯片技术研发有限公司
登录
直播中
rosa
12年用户
1232经验值
私信
关注
[问答]
电池驱动调试常见问题有哪些?怎么解决?
开启该帖子的消息推送
Android
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命令来查看是否有电源在供电
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命令来查看是否有电源在供电
举报
更多回帖
rotate(-90deg);
回复
相关问答
Android
默纳克系统
常见问题
有
哪些?
2021-11-15
4241
STM32
常见问题
有
哪些?怎么解决这些问题?
2021-04-19
1528
如何
调试
LCD Mipi?
调试
LCD Mipi
常见问题
有
哪些?
2022-03-10
5758
谁有PADS的
常见问题
?
2012-11-25
2189
请教protel存在的
常见问题
2012-05-31
3613
A4988步进电机
驱动
板
常见问题
有
哪些?
2021-10-19
3805
贴片电阻应用
常见问题
有
哪些?
2021-06-08
2309
一体化伺服电机出现的
常见问题
有
哪些?
有
什么解决办法?
2021-06-28
1772
直流无刷电机控制相关的
常见问题
有
哪些?
2021-09-24
1378
交流伺服电机飞车
常见问题
有
哪些解决办法?
2021-09-26
6877
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分