温度控制 (temp_control) 模块分析
一、模块概述
1.1 功能定位
temp_control 是华为 MATE X5 充电系统的温度监控与保护模块,主要功能是:
1.2 设计目标
温度保护:防止 USB 接口因高温烧毁
用户体验:通过滞后算法避免充电电流频繁抖动
故障诊断:温度异常时自动收集环境信息并上报
多级控制:支持最多 8 级温度区间的精细化管理
二、核心架构
2.1 模块结构图
┌─────────────────────────────────────────────────────┐
│ temp_control 温度控制模块 │
├─────────────────────────────────────────────────────┤
│ 初始化层 │
│ ├─ probe: DTS参数解析 │
│ ├─ power_event监听注册 │
│ └─ delayed_work创建 │
├─────────────────────────────────────────────────────┤
│ 控制层 │
│ ├─ notifier_call: 充电事件响应 │
│ │ ├─ CHARGING_START → start监测 │
│ │ └─ CHARGING_STOP → stop监测 │
│ └─ monitor_work: 周期性温度检查 (30s) │
├─────────────────────────────────────────────────────┤
│ 算法层 │
│ ├─ check_usb_port_temp: USB温度检测 │
│ │ ├─ power_temp_get_average_value: 获取温度 │
│ │ ├─ power_get_hysteresis_index: 滞后计算 │
│ │ └─ 返回当前档位最大电流限制 │
│ └─ dmd_report: 温度异常上报 │
│ └─ 携带电池/充电器/电压/SOC等环境信息 │
├─────────────────────────────────────────────────────┤
│ 接口层 │
│ ├─ power_temp: 温度采集 │
│ ├─ power_dsm: 故障上报 │
│ └─ power_supply_app: 电池信息 │
└─────────────────────────────────────────────────────┘
2.2 工作流程
充电启动事件
↓
启动monitor_work (30s周期)
↓
┌──────────────────────────────────────┐
│ 循环监测流程 │
│ 1. 获取USB接口平均温度 │
│ 2. 滞后算法计算档位index │
│ 3. 判断是否需要DMD上报 │
│ 4. 返回当前档位最大限流iout_max │
│ 5. 等待30s后下次检测 │
└──────────────────────────────────────┘
↓
充电停止事件 → 取消监测 + 重置index
三、关键数据结构
3.1 温度控制参数
struct temp_control_para_info {
int iout_max;
int dmd_no;
int dmd_max_cnt;
int dmd_count;
};
3.2 设备管理结构
struct temp_control_dev {
struct notifier_block nb;
struct delayed_work monitor_work;
struct hysteresis_para usb_port_hys[8];
struct temp_control_para_info usb_port_para[8];
int usb_port_para_size;
int usb_port_para_index;
};
3.3 滞后曲线参数 (来自power_algorithm)
struct hysteresis_para {
int refer_lth;
int refer_hth;
int hys_value;
};
四、核心算法实现
4.1 滞后控制算法
目的:防止温度在阈值附近波动时频繁切换档位
原理示意:
温度 (°C)
↑
60┤ ┌──────────────── 档位2 ───────────────┐
│ │ hth=60°C │
55┤ ↓回差55°C (hys=5°C) ↑升温55°C (lth=55°C)
│ ┌──────────────── 档位1 ───────────────┐
50┤ │ hth=50°C │
│ ↓回差45°C (hys=5°C) ↑升温50°C (lth=50°C)
45┤ ┌──────────────── 档位0 ───────────────┘
└─────┴─────────────────────────────────────→ 时间
算法逻辑:
int power_get_hysteresis_index(int cur_index, struct common_hys_data *data)
{
}
4.2 USB接口温度检测
static int temp_control_check_usb_port_temp(struct temp_control_dev *l_dev)
{
usb_temp = power_temp_get_average_value(POWER_TEMP_USB_PORT);
hys.refer = usb_temp / 1000;
hys.para_size = l_dev->usb_port_para_size;
hys.para = l_dev->usb_port_hys;
l_dev->usb_port_para_index = power_get_hysteresis_index(
l_dev->usb_port_para_index, &hys);
if (l_dev->usb_port_para[index].dmd_no > 0) {
}
return l_dev->usb_port_para[index].iout_max;
}
4.3 DMD上报逻辑
static void temp_control_dmd_report(struct temp_control_para_info *info,
const char *buf)
{
if (info->dmd_no <= 0)
return;
if (info->dmd_count++ >= info->dmd_max_cnt) {
hwlog_info("dmd report over %d time\n", info->dmd_max_cnt);
return;
}
power_dsm_report_dmd(POWER_DSM_BATTERY, info->dmd_no, buf);
}
上报信息格式:
t_usb 58 is exceed 55, t_bat=35 chg_type=3 brand=ATL volt=4200 soc=85
解释:USB温度58°C超过阈值55°C,电池35°C,充电器类型3,品牌ATL,电压4200mV,电量85%
五、DTS配置示例
5.1 配置格式
huawei_temp_control: huawei,temp_control {
compatible = "huawei,temp_control";
status = "ok";
/* USB接口温度控制参数
* 格式: <lth hth back iout_max dmd_no dmd_max_cnt>
* lth: 下限温度 (°C)
* hth: 上限温度 (°C)
* back: 回差温度 (°C)
* iout_max: 最大电流 (mA)
* dmd_no: DMD故障码 (0=不上报)
* dmd_max_cnt: 最大上报次数
*/
usb_port_para = <
// 档位0: <45°C, 不限流, 不上报
0 45 0 3000 0 0
// 档位1: 45-50°C, 限流2000mA, 不上报
45 50 3 2000 0 0
// 档位2: 50-55°C, 限流1500mA, 上报DMD 926001xxx (最多5次)
50 55 3 1500 926001001 5
// 档位3: 55-60°C, 限流1000mA, 上报DMD 926001xxx (最多5次)
55 60 3 1000 926001002 5
// 档位4: 60-65°C, 限流500mA, 上报DMD 926001xxx (最多5次)
60 65 3 500 926001003 5
// 档位5: ≥65°C, 停止充电, 上报DMD 926001xxx (最多5次)
65 999 3 0 926001004 5
>;
};
5.2 参数说明
| 参数 | 含义 | 典型值 |
|---|
| lth | 档位下限温度 | 0/45/50/55/60/65°C |
| hth | 档位上限温度 | 45/50/55/60/65/999°C |
| back | 滞后回差 | 3-5°C |
| iout_max | 最大输出电流 | 0/500/1000/1500/2000/3000mA |
| dmd_no | DMD故障码 | 0 或 926001xxx |
| dmd_max_cnt | 最多上报次数 | 3-10次 |
六、充电事件管理
6.1 事件监听注册
l_dev->nb.notifier_call = temp_control_notifier_call;
power_event_bnc_register(POWER_BNT_CHARGING, &l_dev->nb);
6.2 事件处理逻辑
static int temp_control_notifier_call(struct notifier_block *nb,
unsigned long event, void *data)
{
switch (event) {
case POWER_NE_CHARGING_STOP:
cancel_delayed_work(&l_dev->monitor_work);
l_dev->usb_port_para_index = 0;
break;
case POWER_NE_CHARGING_START:
cancel_delayed_work(&l_dev->monitor_work);
schedule_delayed_work(&l_dev->monitor_work,
msecs_to_jiffies(30000));
break;
}
return NOTIFY_OK;
}
6.3 监测任务调度
static void temp_control_monitor_work(struct work_struct *work)
{
if (l_dev->usb_port_para_size != 0)
temp_control_check_usb_port_temp(l_dev);
schedule_delayed_work(&l_dev->monitor_work,
msecs_to_jiffies(30000));
}
七、典型应用场景
7.1 快充高温保护
场景:使用超级快充时,USB接口温度快速上升
处理流程:
1. 初始状态: 温度40°C, 档位0, 限流3000mA (正常充电)
2. 温度升至48°C: 仍在档位0 (未达到lth=45°C)
3. 温度升至52°C: 切换到档位2 (超过lth=50°C)
→ 限流1500mA, 上报DMD 926001001
4. 温度继续升至57°C: 切换到档位3 (超过lth=55°C)
→ 限流1000mA, 上报DMD 926001002
5. 温度回落至53°C: 仍在档位3 (未低于55-3=52°C回差线)
6. 温度继续回落至51°C: 切换回档位2 (低于52°C回差线)
→ 限流1500mA
7. 温度回落至46°C: 切换回档位1 (低于50-3=47°C回差线)
→ 限流2000mA
8. 温度回落至42°C: 切换回档位0 (低于45-3=42°C回差线)
→ 限流恢复3000mA
7.2 环境高温限流
场景:夏季户外使用,环境温度35°C
策略:
温度基线更高,更容易触发限流档位
通过DMD上报收集高温使用数据
分析是否需要调整温度阈值或冷却设计
7.3 异常高温告警
场景:USB接口温度异常升高至65°C以上
响应:
八、调试与诊断
8.1 日志输出
echo "temp_control" > /sys/kernel/debug/dynamic_debug/control
[temp_control] suspend begin
[temp_control] resume begin
[temp_control] dmd report over 5 time
8.2 DMD故障分析
查看DMD记录:
cat /sys/class/power_dsm/dsm_battery/dsm_dump
典型DMD内容:
DMD_NO: 926001002
Content: t_usb 58 is exceed 55, t_bat=35 chg_type=3 brand=ATL volt=4200 soc=85
分析要点:
8.3 温度监测节点
cat /sys/class/power_temp/usb_port/temp_now
cat /sys/class/power_supply/battery/temp
九、与其他模块协作
9.1 依赖接口
| 模块 | 接口 | 用途 |
|---|
| power_temp | power_temp_get_average_value | 获取USB接口平均温度 |
| power_dsm | power_dsm_report_dmd | 上报DMD故障 |
| power_supply | power_supply_app_get_bat_* | 获取电池温度/电压/SOC/品牌 |
| charge | charge_get_charger_type | 获取充电器类型 |
| power_algorithm | power_get_hysteresis_index | 滞后曲线计算 |
9.2 数据流向
power_temp (温度采集)
↓
temp_control (档位计算)
↓
返回 iout_max → 充电管理模块 (限流执行)
↓
power_dsm (异常上报)
十、关键技术要点
10.1 滞后控制优势
10.2 周期性监测
10.3 DMD上报限制
if (info->dmd_count++ >= info->dmd_max_cnt) {
hwlog_info("dmd report over %d time\n", info->dmd_max_cnt);
return;
}
目的:防止高温持续时频繁上报造成日志爆炸
10.4 电源管理支持
static int temp_control_suspend(struct platform_device *pdev, pm_message_t state)
{
cancel_delayed_work_sync(&l_dev->monitor_work);
return 0;
}
目的:系统休眠时停止监测,节省功耗
十一、总结
核心价值
安全保护:通过温度分级限流,防止USB接口烧毁
智能控制:滞后算法避免频繁切换,提升用户体验
故障诊断:自动收集温度异常环境信息,辅助售后分析
灵活配置:支持最多8级温度档位,适应不同产品需求
技术亮点
滞后曲线算法:工业级温度控制策略
DMD自动上报:携带完整环境信息的故障诊断
周期性监测:低功耗长周期设计
事件驱动:充电启停自动控制监测任务
适用场景
快充设备:大功率充电时的温度保护
高温环境:夏季户外或车载充电
异常诊断:USB接口老化或异物导致的温度异常