ARTICLE · 1057149
安卓驱动[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