夜雨聆风学习资料网

ARTICLE · 1057149

安卓驱动[10]电池充电链路(以我的板子为例)

安卓驱动[10]电池充电链路(以我的板子为例)

电源 / 充电 / 电池链路(Power / Charging / Battery)

一、硬件与现状

器件清单

充电 IC:BQ25895(TI),挂 I2C2,地址 0x6a

驱动:drivers/power/supply/bq25890_charger.c

电量计:CW2015(Cellwise),挂 I2C2,地址 0x62

驱动:drivers/power/supply/cw2015_battery.c

PMIC:RK806(RK8xx 系列)

驱动:drivers/mfd/rk806-core.c

二、内核层:kernel-6.1/drivers/power/supply/

2.1 power_supply 核心框架(kobject / sysfs)

文件:power_supply_core.c

power_supply_changed(第 123 行)— 状态变化通知,触发 uevent 上报

power_supply_get_property(第 1130 行)— 读属性

power_supply_set_property(第 1144 行)— 写属性

power_supply_get_property_from_supplier(第 408 行)— 从上级 supply 取属性

power_supply_deferred_register_work(第 147 行)— 延迟注册工作队列

2.2 充电 IC 驱动:bq25890_charger.c

初始化流程

bq25890_probe(1396)— 驱动入口

→ bq25890_fw_probe(1217)— 解析 DTS 参数

→ bq25890_hw_init(838)— 硬件初始化

→ bq25890_rw_init_data(796)— 写入初始配置

→ bq25890_irq_probe(1154)— 注册中断

运行时

bq25890_irq_handler_thread(761)— 中断下半部,处理插拔与状态变化

→ __bq25890_handle_irq(727)— 中断处理核心

bq25890_power_supply_get_property(469)— 上报电压/电流/充电状态

bq25890_power_supply_set_property(628)— 设置充电参数

bq25890_get_chip_state(693)— 读芯片状态寄存器

bq25890_chip_reset(773)— 复位芯片

2.3 电量计驱动:cw2015_battery.c

入口与周期任务

cw_bat_probe(667)— 驱动入口

cw_bat_work(423)— 周期任务,约 5 秒更新一次

数据更新

cw_update_soc(369)— 更新 SOC

cw_update_voltage(382)— 更新电压

cw_update_charge_status(349)— 更新充电状态

cw_update_time_to_empty(410)— 更新剩余时间

cw_update_profile(99)— 加载电池曲线

上报与读写

cw_battery_get_property(485)— 上报容量/电压等属性

cw_get_capacity_leve(471)— 容量等级

cw_read_word / cw_write(86)— I2C 底层读写

2.4 PMIC 充电(备选路径)

rk817_charger.c — RK817 充电

rk817_battery.c — RK817 电量

rk818_charger.c / rk818_battery.c — RK818 对应驱动

三、HAL 层:hardware/rockchip/health/

3.1 Health.cpp

初始化

Health::Health(56)— 构造

Health::OnInit(352)— 初始化

属性读取

GetProperty(70)— 读内核 sysfs 属性

Health::getCapacity(105)— 电量百分比

Health::getChargeCounterUah(93)— 电荷计数

Health::getCurrentNowMicroamps(97)— 当前电流

Health::getChargeStatus(113)— 充电状态

Health::getHealthInfo(171)— 汇总全量信息上报

策略与更新

Health::setChargingPolicy(118)— 设置充电策略

Health::getChargingPolicy(134)— 读取充电策略

Health::update(314)— 周期更新

Health::OnHealthInfoChanged(331)— 状态变化回调

3.2 ChargerUtils.cpp(关机充电 / charger mode)

ChargerShouldKeepScreenOn(22)— 判断是否保持屏幕点亮

ChargerIsOnline(26)— 判断是否接入充电器

ChargerInitConfig(35)— 初始化配置

ChargerModeMain(94)— 关机充电模式主函数

四、框架层

BatteryService

路径:

frameworks/base/services/core/java/com/android/server/BatteryService.java

职责:Android 电池服务(Java 层)

关机充电界面

路径:system/core/healthd/healthd_mode_charger.cpp

BatteryMonitor

路径:system/core/healthd/BatteryMonitor_v1.cpp

职责:读 /sys/class/power_supply/ 下的属性

Health AIDL 接口

路径:

hardware/interfaces/health/aidl/android/hardware/health/IHealth.aidl

五、完整链路

App(BatteryManager)   BatteryService.java                  frameworks/base/services/   IHealth AIDL                         hardware/interfaces/health/   Health.cpp(HAL)                     hardware/rockchip/health/   BatteryMonitor_v1.cpp                system/core/healthd/   读 /sys/class/power_supply/   power_supply_core.c                  kernel-6.1/drivers/power_supply/      ├─ bq25890_charger.c(充电 IC)   ├─ cw2015_battery.c(电量计)   └─ rk817_charger.c / battery.c(PMIC 充电,备选)   I2C / SPI 硬件

六、调试入口

内核 sysfs(最直接)

cat /sys/class/power_supply/*/uevent              # 列出全部属性cat /sys/class/power_supply/battery/capacity      # 电量百分比cat /sys/class/power_supply/battery/status        # 充电状态cat /sys/class/power_supply/battery/voltage_now   # 电压cat /sys/class/power_supply/bq25890-charger/online # 是否插入充电器

内核日志

dmesg | grep -iE 'bq2589|cw2015|power_supply|charger|battery'

HAL 与框架

logcat -s healthd BatteryServicedumpsys battery

相关学习资料