部分内容来自 :https://blog.csdn.net/stoic163/article/details/80613259
一. LTF热管理框架简介
LTF(Linux Thermal Framework),主要位于BSP kernel模块,LTF抽象出两种类型的设备,热区设备TZD[Thermal Zone Device] 和冷却设备[Cooling Device]。
热区设备主要负责获取和上报从热传感器读取的转换温度值[单位毫摄氏度]。
冷却设备通过开关某一个特定的处理函数,来给绑定的热区设备组件降温。
一个热区设备最多可以有10个 trip[每个trip对应一个热阈值],每个trip能且只能绑定到一个冷却设备[降温处理函数];这样实现热区设备和冷却设备的绑定[一个热区设备最多绑定10个冷却器]。
LTF周期监控每一个热区设备,并且基于每个trip的trip point值激活绑定的冷却设备[降温处理函数],LTF的工作方式是轮询式。
这种基于轮询的软件控制方式,会消耗一定的CPU功耗[为了监控手机中所有热sensor],从ADC通道中读取sensor的温度值也有几十微秒的时间消耗。
基于Linux kernel 3.18代码,LTF代码位置:
Kernel-3.18/include/linux/thermal.h
Kernel-3.18/drivers/thermal/thermal_core.c
Kernel-3.18/drivers/thermal/backward_compatible.c
结合MT6797平台,LTF设备映射的proc文件目录[内核与native通讯]
/proc/driver/thremal/ 如下截图:
结合MT6797平台,LTF设备映射的sys文件目录[app与LTF通讯]
/sys/class/thermal
[
热区设备驱动和冷却设备驱动向热管理core
作注册时,热管理core为每个设备创建sys fs
sys/class/thermal/
]
如下截图:
二. 结合MT6797平台,分析散热管理实现原理及MTK的设计优化
不同平台根据各自主芯片内的senser
或板上的热敏电阻的分布位置,在内核封装不同的热区设备,并实现自己
的冷却器[降温处理函数]和散热策略。
如下图的软件框架图,
(一). 比较核心的mtk_thermal_monitor特性介绍如下:
1. 简单平移均值[SMA:simple moving average]:
SMA作为一个低通滤波器工作,用于降低温度噪声对散热策略的影响。
SMA过滤错误的热区温度值,原始的温度值通常由从ADC读到的
电压值转换而来,包含一定的不准确性。为避免热管理频繁的噪声干扰,
使用SMA低通滤波器输出降噪。实际excel配置文件中,Moving Average
配置为1~4,即每次采样取前4次或只取1次样本,取平均值作为热
传感器的最新数据。
2. 冷却器出口点:
当绑定的热区设备冷却下来指定的温度数点,冷却器出口点要保证冷却
器退出;热区域可以反映一个IC的结温。当负载增大时,温度可能显
著增加,当冷却器激活时温度可能显著降低。PCB板和结构具有热滞后
性,需要较长的时间来散热,一个正确的冷却退出点可以帮忙有效的冷
却并避免快速开关冷却器的开销。
[
备注:IC的结温(Junction Temperature)
结温是处于电子设备中实际半导体芯片(晶圆、裸片)的最高温度。
它通常高于外壳温度和器件表面温度。
结温可以衡量从半导体晶圆到封装器件外壳间的散热所需时间以及热
阻。
]
3. 条件冷却:
条件冷却添加更多标准以决策是否激活冷却设备,因此冷却设备以更
精确的方式被激活而避免过度killing系统性能;LTF中,当温度超过指
定的trip point点时,冷却器被激活;但温度可能是被环境升高。例如,
LTF观察到CPU过热需要降低CPU速度以降温;但是CPU已经在低载
模式并且降低CPU速率也不能帮助降温;在这种情况下,我们添加额
外判断条件"CPU加载率>85%"作为决策依据,这样:CPU降频的冷却器
只有在同时满足温度和CPU负载率都超过阈值,才能被激活。
mtk_thermal_monitor 为热区设备驱动提供了4个API功能:
(1). mtk_thermal_zone_device_register_wrapper
(2). mtk_thermal_zone_device_unregister_wrapper
(3). mtk_thermal_zone_bind_cooling_device_wrapper
(4). mtk_thermal_zone_bind_triger_trip[可选][中断方式,在中断回调
中执行,可以节省轮询ADC通道的开销]
mtk_thermal_monitor为冷却器提供了如下2个API
(1).mtk_thermal_cooling_device_register_wrapper
(2).mtk_thermal_cooling_device_unregister_wrapper
mtk_thermal_monitor提供了一个内核API用于获取所有注册过的热区域的
温度;
mtk_thermal_get_temp[获取SMA值而非原始温度值]
(二). MT6797 热区设备[热传感器]名称、位置和测量区 列表:
1. Mtktscpu,Mtkts1,Mtkts2,Mtkts3,Mtkts4[AP内部sensor ,在MT6797
内部,测试SOC内部温度];
2. Mtktspmic[pmic,在MT6351,测试压模温度];
3. Mtktsbattery[热敏电阻,在电池包内,测试电池温度];
4. Mtktspa[内部sensor,RF,在MT6176内部,测试MT6176温度];
5. Mtktswmt[内部sensor,WiFi,在MT6631内部,测试压模温度];
6. MtktsAP[热敏电阻,位置在PCB板上靠近AP,测量AP附近的PCB温度];
7. tsda9214[内部sensor,位置在DA9214内部,测量压模温度];
8. Mtktsbtsmdpa[热敏电阻,在PCB板上靠近modem功放,测试功放区域温
度];
ADB 对应查询温度:
adb shell cat /sys/class/thermal/thermal_zone*/type 查看类型
adb shell cat /sys/class/thermal/thermal_zone*/temp 查看温度
(三) . 主要热源对应的热区设备详述
1. Mtktscpu
代码位置: mtk_ts_cpu.c
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/
Mtktscpu是一个伪热区,它取值为TS1,TS2,TS3和TS4的最大值。
MT6797通常是手机的主要热源,所以对Mtktscpu的温度的控制对热性能有
很大的影响。
2. Mtkts1,Mtkts2,Mtkts3,Mtkts4
代码位置
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts1.c
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts2.c
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts3.c
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts4.c
在MT6797内部,真实存在的4个热感应器:TS1,TS2,TS3,TS4.
3. Mtktspmic
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_pmic.c
Mtktspmic监控PMIC MT6351的结温。MT6351为很多外围组件供电,
所以也可能成为一个手机热源;
4. Mtktsbattery
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_battery.c
监控靠近电池连接器区域的温度,如果电池带有一个热敏电阻NTC,温度值来源于电池充电IC的驱动。
每10秒更新一次该数据。如果电池没有使用热敏电阻NTC或者电池引脚被外部电源供电,则上报的是假数据;
5. Mtktspa
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_pa.c
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_ps_thput.c
Mtktspa 监视MT6176芯片温度和附近的PCB温度.MT6176位于FDD/TDD PA[功率放大器,参数调节影响发射功率]附近。
此热区只在WCDMA或TDSCDMA modem有载荷时上报真实温度数据[比如通话或数据包],
当modem在idle模式时,上报-127度。射频温度每30秒查询一次,然后记录到mtk_ts_ps_thput.c , mtk_ts_pa.c封装温度信息到一个热区并从mtk_ts_ps_thput.c读温度。
6. Mtktswmt
代码位置:
kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_wmt.c
上报MT6631二合一芯片的结温。只在WiFi通道有traffic时才上报真实温度;
BT/GPS/FM活动不会使Mtktswmt上报温度[因为认为WiFi是主要热源];无效的
Mtktswmt值为-64c和-127c。为省电,当WiFi无traffic时,sensor每300秒上报一次;
当traffic达到阈值时,每3秒上报一次温度;
7. MtktsAP,Mtktsbtsmdpa
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_bts.c
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_btsmdpa.c
简称BTS[板级热传感器],MT6797的参考设计中,有两个BTS:
一个在MT6797芯片内部[MtktsAP],
另一个在modem的功率放大器一侧[Mtktsbtsmdpa];
MtktsAP 连接到辅助ADC通道0;
Mtktsbtsmdpa 连接到辅助ADC通道1;
[强烈推荐使用热敏电阻NTC监控6797 AP附近PCB的温度];
这个热区对新的AP热节流算法很重要[删除后将导致不好的性能表
现和不可控的表面温度];
另外 Mtktsbtsmdpa 用于监控PA区域温度。NTC参数可在热策略中
配置;
如果热敏电阻不是使用参考设计值,请确认NTC表可用
[mtk_ts_bts.c,mtk_ts_btsmdpa.c];
8. tsda9214
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/thermal_zones/ts_da9214.c
tsda9214上报DA9214降压温度,三个状态[小于125摄氏度,大于等于125摄氏度,大于等于140摄氏度]。当在125摄氏度以下返回60;
(四) MT6797冷却器描述
1. 冷却器列表
Mt6797提供:
7个系统reset冷却器,3个android关机冷却器,
3个内核关机冷却器,3个背光控制冷却器,
3个电池充电限流冷却器;
如下图所示:
2. 冷却器详细描述:
(1. ). backlight背光限制:
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/mtk_cooler_backight.c
[没有建议使用这个冷却器]
(2. Android关机 冷却器
Mtk-cl-shutdown00;
Mtk-cl-shutdown01;
Mtk-cl-shutdown02;
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/mtk_cooler_shutdown.c
/vendor/mediatek/proprietary/packages/apps/MTKThermalManager/src/com/
mediatek/thermalmanager/
ShutDownAlarm.java;
ShutDownAlertDialogActivity.java;
/jni/thermald.c ;
(3. 3个Adaptive AP coolers :
Cpu_adaptive_0 [enable , trip point 58000 , binding to mtktscpu ] ,
Cpu_adaptive_1 [enable, trip point 57000 ,binding to mtktscpu],
Cpu_adaptive_2[disable]
只能被绑定在 mtktscpu热区设备;
MT6797 在LTF基础上所做的修改优化:
1. 轮询延迟时间缩短到40ms当mtktscpu超过60摄氏度,并且只使能/
禁用ATM;
2. 增加50Hz周期性定时器,及时更新散热区和唤醒热管理线程,一旦
krtatm热线程有更高优先级的特殊线程,检测当前和以往mtktscpu
的TZ的不同,计算新的允许的AP功耗预算[包含CPU核数和主频];
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_atm.c
(4. Static AP OPP [操作点]限制 冷却器
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_dtm.c
MT6797热管理提供了34个静态AP冷却器[cpu00, cpu01,......,cpu33]
属于固定数值散热策略[默认不使用这种策略];
(5. 电池充电限流冷却器
Mtk-cl-bcct00,Mtk-cl-bcct01,Mtk-cl-bcct02, ABCCT,ABCCT_LCMOFF;
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_bcct.c
每个BCCT冷却器对应proc文件:
/proc/driver/thermal/clbddt
格式:
1 <bcct00 limit> <bcct01 limit> <bcct02 limit>
limit标识最大充电电流ma<需要考虑具体的充电IC所支持的实际充电电流>;
(6. ABCCT自适应电池充电电流限制
Mtk-cl-bcct00,Mtk-cl-bcct01,Mtk-cl-bcct02 , ABCCT , ABCCT_LCMOFF ;
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_bcct.c
(7. LTE调制解调器上行数据速率限制 冷却器:
Mtk-cl-mutt00,Mtk-cl-mutt01,Mtk-cl-mutt02,Mtk-cl-mutt03,Mtk-cl-noIMS,
Mtk-cl-mdoff,Mtk-cl-adp-mutt
代码位置:
/kernel-3.18/drivers/misc/mediatek/thermal/common/coolers/mtk_cooler_mutt.c
通过配置上行数据传输的激活/挂起时间比[400ms/100ms]
(8. 其他冷却器
系统reset:冷却器 ;
除了软件系统reset,MT6351 PMIC还有硬件热保护:
如果MT6351的热sensor监测到超过150摄氏度,会通过硬重启系统;
电池驱动也会执行系统reset或关机的冷却降温动作;
USB充电时,如果电池温度达到60摄氏度,电池驱动会重置系统
附加内容: 基于MT6765平台补,不同平台大致内容一致
更换对应ntc sensor 需要根据热敏系数表更新代码:
根据函数 mtkts_btsmdpa_prepare_table 传进来 table_num 确定当前使用的 热敏系数.
可以新增热敏系数表同步要更新以下文件的热敏系数数组表.
kernel-4.9/drivers/misc/mediatek/thermal/common/thermal_zones/mtk_ts_bts.c
具体如何选择配置对应的热敏系数数组表如下:
1. 修改对应的宏值
2. 如果修改以上值,从log读取出来还是会出现 table_num数值不对.就需要修改
device/mediatek/mt6765/thermal.conf
修改此文件需要对应的 Thermal Config Tool
修改的方法,
将您要修改的conf文件放到thermal config tool中的decrypt文件夹下, (注: user 跟 eng版本的 不是同一个)
在您要修改的conf文件爱名称的最后加上.mtc,
双击decrypt文件夹中的decypt_all_config
decrypt目录下就会看到conf对应的txt文件.
/proc/driver/thermal/tzbts_param
PUP_R 390000 PUP_VOLT 1800 OVER_CRITICAL_L 4397119 NTC_TABLE 8 0
/proc/driver/thermal/tzbtspa_param
PUP_R 390000 PUP_VOLT 1800 OVER_CRITICAL_L 4397119 NTC_TABLE 8 1
倒数第二个数就是对应热敏系数表格的选择.
修改之后然后在windows上面拉出dos命令行,
将thermal config tool中的encrypt命令拖进去,空格,
再将您修改后的conf txt文件拖进去,空格,
然后再输入您想要生成的conf名称
执行后,就会在dos命令行的目录下生成您要的conf文件
然后将其放回您取出的地方,
build code即可
注: 如果样机没有校准,需要校准,并且必须插卡驻网.不然会出现 mtktspa 的温度出现为 -127000. 对应的-127000是无效值. 具体请看 上面的 第5项
当modem在idle模式时,上报-127度。射频温度每30秒查询一次,