完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
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命令来查看是否有电源在供电 |
|
|
|
只有小组成员才能发言,加入小组>>
4484个成员聚集在这个小组
加入小组3327 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4260 浏览 1 评论
4287 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 10:21 , Processed in 0.559168 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号