LK阶段拦截充电:MTK平台电池高温保护的架构级解决方案
当电池温度超过安全阈值时,传统的内核层保护机制往往面临响应延迟和系统稳定性问题。在MT8766+MT6357+MT6371硬件平台上,我们发现了一种更底层的解决方案——通过修改LK(Little Kernel)阶段的platform_init函数,直接控制充电IC的使能引脚,实现高温保护的"前置拦截"。
1. 高温保护的传统困境与LK方案优势
电池高温保护通常在内核层实现,通过监测NTC电阻值变化触发保护机制。但在MTK平台的实际测试中,当NTC电阻短路(模拟高温)时,系统会陷入反复重启的异常状态:
- 内核检测到温度≥60℃触发关机流程
- 由于适配器连接,系统立即进入关机充电模式
- 高温状态持续存在,再次触发关机...形成死循环
这种架构级缺陷源于内核层电源管理的滞后性。相比之下,LK阶段的解决方案具有三个显著优势:
- 时序优势:在系统启动最早阶段完成温度判断(早于内核加载)
- 控制权限:直接操作硬件寄存器/GPIO,不受上层框架限制
- 稳定性保障:避免内核复杂状态机带来的不确定性
关键发现:MT6371充电IC的使能引脚(GPIO_CHG_EN_0)默认上电即为有效状态,这是导致传统保护失效的硬件因素
2. LK阶段拦截的硬件基础与实现路径
2.1 硬件信号链路分析
MTK平台的充电控制涉及三级硬件交互:
| 组件 | 功能 | 关键接口 |
|---|---|---|
| AP (MT8766) | 主控芯片 | GPIO_CHG_EN_0 |
| PMIC (MT6357) | 电源管理 | AUXADC_LIST_BATTEMP |
| Charger IC (MT6371) | 充电执行 | CHG_EN寄存器 |
温度检测路径:
NTC电阻 → PMIC ADC通道 → AP通过AUXADC读取 → 温度查表转换充电控制路径:
AP GPIO_CHG_EN_0 → Charger IC EN引脚 → CHG_CTRL寄存器2.2 核心实现函数链
在LK阶段插入的check_tbat_init()函数需要完成以下关键操作:
void check_tbat_init(void) { // 1. 立即禁用充电使能 set_chg_enable(0); // 2. 温度监控循环 while(1) { int temp = force_get_tbat(true); if(temp < 60) break; // 温度达标退出 // 3. 维持系统不重启 watchdog_feed(); mdelay(500); } // 4. 温度正常后恢复充电 set_chg_enable(1); }关键函数说明:
force_get_tbat():通过PMIC的AUXADC获取原始电压值,经温度转换表得到实际温度set_chg_enable():控制GPIO_CHG_EN_0引脚电平,直接影响MT6371的工作状态
3. 温度检测的精度保障措施
为确保NTC温度检测的可靠性,实现中采用了多层次的校准策略:
3.1 硬件参数校准
在mt6761_battery_prop_ext.dtsi中定义的关键参数:
bat_gm30: battery { R_FG_VALUE = <10>; // 采样电阻值(mΩ) CAR_TUNE_VALUE = <120>; // 电流校准系数 FG_METER_RESISTANCE = <50>; // PCB走线阻抗补偿 };3.2 软件算法优化
温度计算采用两点校准法,核心公式:
TRes = (RBAT_PULL_UP_R * adc_value) / |VBAT_PULL_UP - VADC| 实际温度 = BattThermistorConverTemp(TRes - BIF_NTC_R)其中BattThermistorConverTemp()通过预置的温度-电阻对照表进行非线性校正。
4. 方案验证与异常处理
4.1 测试用例设计
| 测试场景 | 预期结果 | 验证方法 |
|---|---|---|
| NTC正常(25℃) | 正常启动 | 系统日志检查 |
| NTC短路(>60℃) | 保持放电不充电 | 电流探头监测 |
| 温度从高到低变化 | 自动恢复充电 | 热风枪模拟 |
| 看门狗触发 | 正常喂狗不重启 | 故意延迟喂狗 |
4.2 典型问题处理
问题现象:温度跳变导致保护误触发
解决方案:在force_get_tbat()中增加数字滤波
#define FILTER_DEPTH 3 static int temp_history[FILTER_DEPTH]; int get_filtered_temp() { // 滑动窗口滤波 for(int i=0; i<FILTER_DEPTH-1; i++){ temp_history[i] = temp_history[i+1]; } temp_history[FILTER_DEPTH-1] = force_get_tbat(true); int sum = 0; for(int i=0; i<FILTER_DEPTH; i++){ sum += temp_history[i]; } return sum/FILTER_DEPTH; }问题现象:充电恢复后电流震荡
解决方案:在set_chg_enable(1)后增加500ms延时,等待电源稳定
5. 架构扩展与平台适配
该方案可推广到其他MTK平台,需注意三个适配要点:
GPIO映射检查:确认目标平台的充电使能引脚定义
- 查询数据手册的GPIO复用表
- 验证上电默认电平状态
ADC通道验证:
# 通过LK调试命令读取ADC原始值 adc read AUXADC_LIST_BATTEMP温度转换表更新:根据不同的NTC型号调整
BattThermistorConverTemp()的查表数据
在MT8788平台上的实测数据显示,相比内核层方案,LK拦截的响应时间从3-5秒缩短到300ms以内,且完全避免了系统重启现象。这种架构级优化为穿戴设备等小型化设计提供了更可靠的热保护方案。