1. power_supply_core.c的热管理机制解析在嵌入式设备开发中电池温度管理是确保安全性的关键环节。MTK平台的Linux Charger驱动通过power_supply_core.c实现了与内核热管理子系统的深度集成这套机制就像给充电系统装上了智能温控空调。当内核配置了CONFIG_THERMAL选项时驱动会自动注册thermal_zone_device。我曾在智能手表项目中发现这个热区设备的工作流程非常精妙驱动通过psy_register_thermal()扫描电源属性发现TEMP属性后立即创建热区设备内核热管理子系统开始周期性调用get_temp回调温度监控的实际代码路径是这样的static int power_supply_read_temp(struct thermal_zone_device *tzd, int *temp) { union power_supply_propval val; struct power_supply *psy tzd-devdata; // 调用驱动实现的get_property获取温度值 int ret psy-desc-get_property(psy, POWER_SUPPLY_PROP_TEMP, val); *temp val.intval * 100; // 转换为毫摄氏度 return ret; }动态调整充电限值的实战案例更值得关注。在平板电脑开发中我们通过thermal_cooling_device实现了三级温控策略40°C以下全速充电2000mA40-45°C降速至1500mA超过45°C切断充电这个功能的核心是ps_set_cur_charge_cntl_limit()函数static int ps_set_cur_charge_cntl_limit(struct thermal_cooling_device *tcd, unsigned long state) { struct power_supply *psy tcd-devdata; union power_supply_propval val {.intval state}; // 设置新的充电电流限制 return power_supply_set_property(psy, POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, val); }2. 事件通知链的运作原理电源事件通知机制就像设备内部的广播系统当充电状态变化时它能同时通知多个模块。我在调试快充协议时发现这个机制解决了模块间同步的大问题。通知链的核心数据结构是这样的static ATOMIC_NOTIFIER_HEAD(power_supply_notifier);典型的事件触发场景包括充电器插入/拔出电池电量达到阈值温度超过安全限值充电状态变化如从CC切换到CV注册通知器的正确姿势应该是static struct notifier_block psy_nb { .notifier_call psy_event_callback, }; // 在驱动初始化时注册 int ret power_supply_reg_notifier(psy_nb); // 记得在退出时注销 power_supply_unreg_notifier(psy_nb);实际项目中我遇到过的事件处理陷阱回调函数中不能执行耗时操作会阻塞其他通知需要处理重复通知的情况注意内存分配需要使用GFP_ATOMIC标志3. sysfs与用户空间的交互设计/sys/class/power_supply目录下的接口是用户空间获取电源状态的主要通道。在开发充电状态指示灯时我发现这些接口设计得非常实用。关键sysfs属性示例/sys/class/power_supply/battery/ ├── capacity # 当前电量百分比 ├── current_now # 瞬时电流 ├── health # 电池健康状态 ├── status # 充电状态 └── temp # 电池温度实现自定义属性的技巧在power_supply_desc中定义属性数组实现对应的get_property/set_property处理属性读写权限比如添加快速充电状态显示static enum power_supply_property battery_props[] { POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_FAST_CHARGE, // 自定义属性 ... }; static int battery_get_property(...) { case POWER_SUPPLY_PROP_FAST_CHARGE: val-intval check_fast_charge_status(); break; }4. uevent事件的处理与优化内核通过kobject_uevent()发送的电源事件是用户空间daemon如upower的触发源。在优化智能音箱的充电提示时我深入研究了这套机制。典型的uevent消息格式ACTIONchange DEVNAMEbattery POWER_SUPPLY_STATUSCharging POWER_SUPPLY_CAPACITY85优化事件频率的实践经验避免频繁触发capacity变化事件可设置5%变化阈值合并相关属性变化如voltage和current同时更新使用delayed_work延迟处理非关键事件关键代码实现void power_supply_changed(struct power_supply *psy) { // 设置变化标志 set_bit(POWER_SUPPLY_UPDATE, psy-events); // 调度工作队列 schedule_work(psy-changed_work); // 唤醒可能休眠的用户空间进程 if (psy-wakeup) pm_wakeup_event(psy-dev, 0); }在车载设备项目中我们还扩展了自定义事件类型// 添加特殊事件通知 union power_supply_propval val { .strval WIRELESS_CHARGE_START }; power_supply_set_property(psy, POWER_SUPPLY_PROP_WIRELESS_EVENT, val);