MTK Linux充电管理实战:如何用power_supply_core.c实现自定义充电策略
MTK Linux充电管理实战基于power_supply_core.c的自定义策略开发指南在嵌入式设备开发中电源管理一直是影响用户体验的关键因素。MTK平台作为移动设备领域的主流方案其Linux内核中的power_supply子系统为开发者提供了高度灵活的充电管理框架。本文将深入探讨如何基于power_supply_core.c实现温度保护、快充协议适配等高级功能帮助开发者打造更智能的充电解决方案。1. MTK电源管理架构解析MTK平台的电源管理系统采用分层设计power_supply_core.c作为核心枢纽连接硬件驱动与上层应用。理解这一架构是进行自定义开发的基础。典型MTK充电子系统组成硬件抽象层直接操作PMIC、充电IC等硬件协议处理层实现QC/PD等快充协议策略控制层温度管理、充电曲线控制用户接口层通过sysfs暴露控制参数// 典型MTK充电驱动注册示例 static struct power_supply_desc mtk_charger_desc { .name mtk_charger, .type POWER_SUPPLY_TYPE_USB, .properties mtk_charger_props, .num_properties ARRAY_SIZE(mtk_charger_props), .get_property mtk_charger_get_property, .set_property mtk_charger_set_property, }; static int mtk_charger_probe(struct platform_device *pdev) { struct power_supply_config psy_cfg {}; psy_cfg.drv_data charger; charger-psy devm_power_supply_register(pdev-dev, mtk_charger_desc, psy_cfg); }关键数据结构对比结构体作用MTK特殊扩展power_supply_desc设备描述增加MTK专有属性power_supply_config配置参数包含平台特定回调power_supply_battery_info电池信息扩展温度曲线参数2. 设备树配置与硬件集成MTK平台通过设备树实现硬件参数的可配置化合理的设备树配置是充电策略实现的前提。典型电池节点配置battery { compatible simple-battery; voltage-min-design-microvolt 3200000; voltage-max-design-microvolt 4200000; energy-full-design-microwatt-hours 10000000; charge-full-design-microamp-hours 2500000; /* MTK扩展参数 */ ocv-capacity-table 4180 100 4100 95 4000 85 ; temp-resist-table 25 100 45 80 60 50 ; };充电器配置要点电源供应关系声明mtk_charger: charger { compatible mediatek,mt6360-charger; power-supplies mtk_charger; };温度传感器绑定thermal-zones { battery_thermal: battery-thermal { polling-delay-passive 1000; thermal-sensors battery_sensor; trips { battery_crit: battery-crit { temperature 60000; hysteresis 2000; type critical; }; }; }; };注意MTK平台通常需要配置多个phandle来建立充电器、电池和温度传感器之间的关联3. 温度保护机制实现温度管理是充电安全的核心MTK平台通过thermal子系统与power_supply的深度集成实现多级保护。分级温度控制策略45°C以下全速充电45-55°C线性降额55°C以上停止充电// 温度回调实现示例 static int mtk_charger_get_temp(struct power_supply *psy, int *temp) { struct mtk_charger *charger power_supply_get_drvdata(psy); int ret, raw_temp; ret iio_read_channel_processed(charger-adc_chan, raw_temp); if (ret 0) return ret; *temp raw_temp / 1000; // 转换为摄氏度 return 0; } static void mtk_charger_thermal_update(struct mtk_charger *charger) { int temp, current_ua; if (mtk_charger_get_temp(charger-psy, temp)) return; if (temp 55000) { current_ua 0; // 超温停止充电 } else if (temp 45000) { // 线性降额计算 current_ua charger-max_current * (55000 - temp) / 10000; } else { current_ua charger-max_current; } power_supply_set_input_current_limit(charger-psy, current_ua); }热管理注册流程实现thermal_cooling_device_opsstatic struct thermal_cooling_device_ops mtk_cooling_ops { .get_max_state mtk_charger_get_max_state, .get_cur_state mtk_charger_get_cur_state, .set_cur_state mtk_charger_set_cur_state, };在驱动中注册冷却设备static int mtk_charger_probe(struct platform_device *pdev) { charger-cdev thermal_of_cooling_device_register( pdev-dev.of_node, mtk-charger, charger, mtk_cooling_ops); }4. 快充协议适配开发MTK平台支持多种快充协议通过power_supply框架可以实现动态协议切换和电流协商。协议适配开发步骤检测协议类型enum mtk_charger_protocol { PROTOCOL_UNKNOWN, PROTOCOL_QC2, PROTOCOL_QC3, PROTOCOL_PD, }; static int mtk_charger_detect_protocol(struct mtk_charger *charger) { u32 reg_val; regmap_read(charger-regmap, MT6360_PD_STATUS, reg_val); if (reg_val QC30_DETECTED) return PROTOCOL_QC3; else if (reg_val QC20_DETECTED) return PROTOCOL_QC2; else if (reg_val PD_DETECTED) return PROTOCOL_PD; return PROTOCOL_UNKNOWN; }电流能力协商static int mtk_charger_negotiate_current(struct mtk_charger *charger) { int max_current; switch (charger-protocol) { case PROTOCOL_QC3: max_current 3000000; // 3A for QC3 break; case PROTOCOL_PD: max_current charger-pd_max_current; break; default: max_current 2000000; // 默认2A } // 应用温度降额 max_current min(max_current, charger-thermal_current); return power_supply_set_input_current_limit(charger-psy, max_current); }协议状态机实现stateDiagram [*] -- Detecting Detecting -- QC20: QC2.0 detected Detecting -- QC30: QC3.0 detected Detecting -- PD: PD detected QC20 -- Negotiating: VBUS valid QC30 -- Negotiating: VBUS valid PD -- Negotiating: Contract established Negotiating -- Charging: Current set Charging -- Error: Fault detected Charging -- [*]: Disconnected提示实际开发中需要处理各种异常情况如协议切换、超时等5. 高级充电策略实现基于power_supply框架我们可以实现更智能的充电策略提升用户体验和设备安全性。分段式充电曲线控制阶段条件动作涓流充电电压 3.0V限流100mA恒流充电3.0V ≤ 电压 4.1V最大电流充电恒压充电电压 ≥ 4.1V保持4.2V电流递减充满维持电流 50mA停止充电// 充电状态机实现 static void mtk_charger_state_machine(struct mtk_charger *charger) { int voltage, current, capacity; power_supply_get_property(charger-battery, POWER_SUPPLY_PROP_VOLTAGE_NOW, voltage); power_supply_get_property(charger-battery, POWER_SUPPLY_PROP_CURRENT_NOW, current); power_supply_get_property(charger-battery, POWER_SUPPLY_PROP_CAPACITY, capacity); switch (charger-state) { case STATE_TRICKLE: if (voltage 3000000) { // 3V charger-state STATE_CC; power_supply_set_charge_current(charger-psy, charger-cc_current); } break; case STATE_CC: if (voltage 4100000) { // 4.1V charger-state STATE_CV; power_supply_set_charge_voltage(charger-psy, 4200000); // 4.2V } break; case STATE_CV: if (current 50000) { // 50mA charger-state STATE_FULL; power_supply_set_charging_enabled(charger-psy, false); } break; } }用户空间协同设计通过sysfs暴露控制参数实现内核与用户空间的协同# 查看充电状态 cat /sys/class/power_supply/mtk_charger/status # 设置最大充电电流 (单位uA) echo 2000000 /sys/class/power_supply/mtk_charger/constant_charge_current_max # 启用/禁用充电 echo 1 /sys/class/power_supply/mtk_charger/charging_enabled动态策略调整实现static ssize_t charge_policy_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mtk_charger *charger dev_get_drvdata(dev); if (sysfs_streq(buf, performance)) { charger-cc_current 3000000; // 3A charger-cv_voltage 4200000; // 4.2V } else if (sysfs_streq(buf, longlife)) { charger-cc_current 1500000; // 1.5A charger-cv_voltage 4100000; // 4.1V } mtk_charger_state_machine(charger); return count; }在实际项目中我们发现温度采样频率对保护效果影响很大。MT6360等新型PMIC支持硬件温度监测配合内核的thermal框架可以实现更及时的保护。对于需要快速充电的场景建议采用QC3.0PD双协议支持并在设备树中正确配置各种温度阈值。