电池驱动调试总结,电池服务+电量计驱动+调试方法

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命令来查看是否有电源在供电
这里写图片描述

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32 CubeMX进行配置的示例代码,用于驱动BQ3060芯片获取电池电量百分比: 1. 打开STM32 CubeMX,并创建一个新的工程。 2. 在"Pinout & Configuration"选项卡中,选择你的目标STM32芯片,并配置你所需的引脚。确保I2C引脚与BQ3060连接正确,并使能I2C外设。 3. 在"Middleware"选项卡中,使能"I2C"中间件,并配置相应的参数,例如I2C时钟频率、地址长度等。 4. 在"Project"选项卡中,选择你的编译器和工程路径,点击"Generate Code"生成代码。 5. 打开生成的工程,找到`main.c`文件,添加以下代码: ```c #include "main.h" #include "stdio.h" #include "i2c.h" #define BQ3060_ADDRESS 0x16 uint8_t read_bq3060_register(uint8_t reg) { uint8_t data; HAL_I2C_Mem_Read(&hi2c1, BQ3060_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, 100); return data; } float get_battery_percentage() { uint8_t soc_msb = read_bq3060_register(0x0C); uint8_t soc_lsb = read_bq3060_register(0x0D); uint16_t soc = (soc_msb << 8) | soc_lsb; float percentage = (float)soc / 256.0f * 100.0f; return percentage; } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); while (1) { float battery_percentage = get_battery_percentage(); printf("Battery Percentage: %.2f%%\n", battery_percentage); HAL_Delay(1000); } } ``` 这段代码在Cube生成的基础上添加了读取BQ3060芯片寄存器和计算电量百分比的函数。在`main()`函数中,通过调用`get_battery_percentage()`来获取电量百分比,并通过串口打印输出。 请确保你的Cube配置正确,并根据具体的STM32型号进行适配和调整。同时,确保正确连接STM32和BQ3060芯片,并根据BQ3060芯片的规格书进行进一步的配置和调试

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值