Rockchip RK3588 kernel dts解析之电源管理实战:从关机充电到电量计配置

张开发
2026/4/19 1:30:01 15 分钟阅读

分享文章

Rockchip RK3588 kernel dts解析之电源管理实战:从关机充电到电量计配置
1. RK3588电源管理实战入门第一次拿到RK3588开发板时最让我头疼的就是电源管理这块。特别是当产品需要支持双节电池、关机充电这些复杂功能时DTS配置简直像天书一样。经过几个项目的实战我总结出一套小白也能看懂的配置方法今天就从最基础的关机充电开始讲起。电源管理在嵌入式系统里就像人体的血液循环系统RK3588的DTS配置就是控制这个系统的神经中枢。以常见的平板电脑为例我们通常需要处理三种电源场景正常开机运行、低功耗休眠和关机充电状态。其中关机充电功能看似简单实际配置时却最容易踩坑。先看一个真实案例去年我们团队做的一款工业平板客户要求必须支持关机状态下显示充电动画并且要能根据电池电压自动唤醒系统。当时参考官方SDK里的配置结果发现充电电流始终上不去后来才发现是bq25703快充芯片的DTS节点配置有问题。这种问题如果提前了解DTS的配置逻辑其实半小时就能解决。2. 关机充电全配置指南2.1 charge-animation节点详解关机充电的核心是charge-animation节点这个节点相当于uboot和kernel之间的桥梁。先看一个经过实战验证的标准配置charge-animation { compatible rockchip,uboot-charge; rockchip,uboot-charge-on 1; // 关键参数1启用uboot充电 rockchip,android-charge-on 0; // 禁用android充电模式 rockchip,uboot-low-power-voltage 6800; // 低电压阈值(mV) rockchip,screen-on-voltage 6900; // 亮屏电压阈值 rockchip,uboot-exit-charge-level 2; // 电量百分比退出阈值 rockchip,uboot-exit-charge-auto 0; // 是否自动退出 rockchip,system-suspend 1; // 启用深度休眠 // 休眠时需要保持供电的模块 regulator-on-in-mem vdd_log_s0, vcc_2v0_pldo_s3; // 休眠时需要关闭的模块 regulator-off-in-mem vdd_gpu_s0, vdd_npu_s0; status okay; };这里有几个容易出错的参数需要特别注意uboot-low-power-voltage和screen-on-voltage的差值建议保持在100-200mV之间太小会导致屏幕频繁闪烁regulator-on-in-mem里必须包含DDR供电相关模块否则唤醒后会死机如果使用双节电池所有电压值都要按双节计算比如单节3.7V双节就是7.4V2.2 深度休眠的电源优化在关机充电时启用深度休眠可以大幅降低功耗实测能让整机功耗从200mA降到50mA以下。但配置不当会导致两种典型问题休眠后无法唤醒唤醒后外设异常通过regulator-on-in-mem和regulator-off-in-mem两个列表可以精确控制各电源域的状态。根据我们的经验以下模块必须保持供电DDR内存相关电源vdd2_ddr_s3等系统基础时钟电源vdd_1v8_pll_s0关键IO电源vcc_1v8_s3而GPU、NPU等计算单元完全可以关闭。有个小技巧先用rockchip-io-domain驱动检查各电源域状态再微调这两个列表。3. 电量计与快充协同配置3.1 CW2015电量计实战CW2015是RK3588常用的电量计芯片它的配置中最关键的是电池曲线参数。很多开发者直接拷贝官方demo的配置结果电量显示不准问题就出在cellwise,battery-profile这个参数上。cw201562 { compatible cellwise,cw2015; reg 0x62; cellwise,battery-profile /bits/ 8 0x17 0x67 0x6C 0x66 0x65 0x64 0x61 0x5B 0x5F 0x75 0x49 0x52 0x50 0x51 0x48 0x3D ... // 省略部分数据 ; cellwise,dual-cell 1; // 双节电池配置 cellwise,monitor-interval-ms 5000; // 采样间隔 power-supplies bq25703; // 关联快充芯片 };要获取准确的电池曲线建议联系电池供应商提供放电曲线数据用CW2015配套工具CWbatTool生成profile数组在系统运行时通过/sys/class/power_supply/cw2015/校准电量特别注意cellwise,dual-cell参数双节电池必须设为1否则电量计算会完全错误。3.2 BQ25703快充芯片调优BQ25703是支持PD协议的快充管理芯片它的DTS配置直接影响充电效率。以下是经过优化的配置模板bq25703: bq257036b { compatible ti,bq25703; reg 0x6b; interrupts RK_PD2 IRQ_TYPE_LEVEL_LOW; ti,charge-current 2500000; // 2.5A充电电流 ti,max-charge-voltage 8750000; // 双节8.75V ti,input-current 500000; // 默认输入电流 ti,input-current-dcp 2000000; // DC口输入 ti,minimum-sys-voltage 7400000; // 最低系统电压 ti,otg-voltage 5000000; // OTG输出5V pd-charge-only 0; // 允许PD充电数据传输 };常见问题排查充电电流上不去检查ti,input-current-dcp参数和Type-C口CC线配置充电时断时续确认interrupts引脚配置正确建议用示波器看中断信号无法快充检查PD协议是否协商成功可以通过内核日志看PD状态4. 无电池设备的特殊处理有些设备如电视盒子不需要电池但如果DTS中完全不配置电源管理节点Android系统会报错导致无法启动。这时需要添加test-power节点test-power { status okay; };这个空节点相当于告诉系统我们不需要电池管理。但要注意必须确保硬件上真的没有电池电路在Android系统中要禁用所有电池相关的服务系统关机后必须完全断电因为没有电池维持RTC时钟曾经有个项目因为这个节点没配置导致开机时间多了15秒就是因为系统在反复检测电池状态。后来加上这个节点后问题立即解决。5. 调试技巧与实战经验电源管理的调试离不开内核提供的调试工具推荐几个必用的debug方法查看电量计实时数据cat /sys/class/power_supply/cw2015/*监控充电状态变化dmesg | grep -i charger强制修改充电电流调试用echo 1500000 /sys/class/power_supply/bq25703/constant_charge_current检查电源域状态cat /sys/kernel/debug/regulator/regulator_summary在实际项目中我总结出几个避坑指南双节电池配置一定要所有电压参数x2关机充电动画不显示检查uboot的显示驱动是否初始化充电到80%就停止可能是电池温度保护触发系统唤醒后触摸屏失灵检查IO电源域是否正常恢复电源管理配置看似复杂但掌握DTS节点的设计逻辑后就能像搭积木一样组合出各种电源方案。建议新手从官方demo配置入手先用单个功能调通再逐步增加复杂功能。

更多文章