本文基于高通msm8939/8994平台文档及源码。
说明文档: vendor/qcom/proprietary/thermal-engine/readme.txt;
源码文件: venror/qcom/proprietary/thermal-engine/thermal_config_v2.c;
实际配置文件: vendor/qcom/proprietary/thermal-engine/thermal-engine.conf。
关注源码文件的global_table,pid_table, tm_table, ss_table, v_table, eq_table声明。其中global_table为全局配置选项,对应2.1中的算法实例标签之前的部分;pid_table对应pid算法配置格式;tm_table对应monitor算法配置格式;ss_table对应ss算法配置格式;v_table对应virtual算法配置格式;eq_table对应equilibrium配置格式(此格式暂时未见使用)。
{debug} //可选,若有此选项表示使能调试信息
sampling // 默认采样率,以ms为单位
[<算法实例标签>] // 算法实例标签
algo_type // 算法类型,必须是算法实例的第一个字段
disable //可选, 用于默认情况下禁止该算法实例起作用
...
算法类型共有4种: monitor, pid, ss, virtual。每种的格式各不一样。
算法类型对应thermal_config.h(vendor/qcom/proprietary/thermal-engine/inc)中的algo_type枚举类型,实际上有5种,除以上4种外,还有一个equilibrium类型。但从algos数组声明(thermal_configi_v2.c)可以看出,equilibrium还未被使用。
[<算法实例标签>]
algo_type monitor
sensor <传感器名称>
sampling <采样率(ms)>
descending // 可选,默认门限是升序,有此字段后门限顺序为降序
thresholds <门限值(mC/mA)>
thresholds_clr <清除门限值>
actions <达到门限时的动作,多个动作时用'+'连接>
action_info <动作额外信息,多个额外信息间用'+'连接>
[<算法实例标签>]
algo_type pid
sampling <采样率(ms)>
sensor <传感器名称>
device <被PID算法调制的设备>
set_point <PID算法调整的目标值(mC/mA)>
set_point_clr <PID算法停止调整的值>
p_const <PID算法中的P常量>
i_const <PID算法中的I常量>
d_const <PID算法中的D常量>
i_samples <积分组件报错时的积分样本数>
dev_units_per_calc <积分算法输出调整单元值(每次调整的值)>
[<算法实例标签>]
algo_type ss
sampling <采样率(ms)>
sensor <传感器名称>
device <被PID算法调整的设备>
set_point <PID算法调整的目标值(mC/mA)>
set_point_clr <PID算法停止调整的值>
time_constant <当当前和上一个错误采样值相等时的延迟调整系数>
device_max_limit <设备最大值(mC/mA)> // 可选
该算法实际作用是用已存在的传感器模拟出一个新的传感器。
[<虚拟传感器名字>]
algo_type virtual
trip_sensor <传感器名称>
set_point <当高于此温度时,虚拟传感器开始polling模式>
set_point_clr <当高于此温度时,虚拟传感器停止polling模式>
sensors <用于计算温度总和的传感器数组>
weights <权重值数组>
sampling <默认采样率>
'thresholds'/'thresholds_clr'/'actions'/'action_info'接受最多8级以空格分开的门限。
'none':
actions: 无动作
action_info: 忽略
'report':
actions: 报告"穿过门限消息"给UI
action_info: 忽略
备注:
"穿过门限消息"以每行独立的格式报告给THERMALD_UI(一个抽象的本地socket);
清除或触发门限会导致消息上报,比如n+1级门限被清除或者触发了n级门限;其它
动作是达到门限时才触发;
参数按以下顺序发送:sensorname, temperature, current_threshold_level, is_trigger。其中:
current_threshold_level为当前被触发/清除的门限;is_trigger为true时表示触发,为false
时表示清除。
'cpu':
actions: 调整cpu频率
action_info: cpu最大允许频率,单位:KHz
'cpuN':
actions: 调整第N个cpu频率
action_info: cpuN最大允许频率,单位:KHz
'hotplug_N':
actions: 拔掉第N个cpu(cpu_down)
action_info: 0: 插上cpu(cpu_up), 1:拔掉cpu(cpu_down)
'lcd':
actions: 限制lcd亮度
action_info: lcd最大亮度,取值范围:0-255
'modem':
actions: 请求限制modem功能
action_info: modem的限制级别,取值范围:0-3
'fusion':(???)
actions: 请求限制 fusion modem功能
action_info: fusion modem的限制级别,取值范围:0-3
'battery':
actions: 限制电池充电电流
action_info: 电池充电电流限制级别,取值范围:0-3
'gpu':
actions: 调整gpu频率
action_info: gpu最大允许频率,单位:KHz
'wlan':
actions: wlan(无线局域网)限制
action_info: WLAN限制级别,取值范围0-4
'shutdown':
actions: 关机
action_info: 关机延迟时间,单位:ms
备注:
从gen_dev_list变量声明(vendor/qcom/proprietary/thermal-engine/devices/devices.c)可以看出,还有如下取值:'vdd_restriction', 'kernel', 'camera','camcorder', 'vdd_dig_swmode','opt_curr_req',
'venus','modem_cx'。从gen_dev_list及hotplug_dev_list可以总结出各action字段及动作函数的对应关系:
动作名称 |
执行动作函数 |
动作信息 |
'cpu' |
cpu_all_action() |
最大频率 |
'cpuN' |
cpu_action() |
最大频率 |
'hotplug_N' |
hotplug_action() |
1级 |
'wlan' |
wlan_action() |
MAX_WLAN_MITIGATION_LEVEL(4) |
'battery' |
battery_action() |
MAX_BATTERY_MITIGATION_LEVEL(3) |
'lcd' |
lcd_action() |
255级亮度 |
'shutdown' |
ts_shutdown_action() |
UINT32_MAX |
'none' |
|
|
'report' |
ts_report_action() |
|
'modem' |
modem_action() |
3 |
'fusion' |
fusion_modem_action() |
3 |
'vdd_restriction' |
vdd_restriction_action() |
1 |
'kernel' |
kernel_mitigation_action() |
1 |
'camera' |
camera_action() |
MAX_CAMERA_MITIGATION_LEVEL(10) |
'camcorder' |
camcorder_action() |
MAX_CAMCORDER_MITIGATION_LEVEL(10) |
'vdd_dig_swmode' |
vdd_dig_automode_diable_action() |
1 |
'opt_curr_req' |
optimum_current_request_action |
1 |
'mdp' |
mdp_action() |
MAX_MDP_MITIGATION_LEVEL(3) |
'venus' |
venus_action() |
MAX_VENUS_MITIGATION_LEVEL(3) |
'modem_cx' |
modem_cx_limit_action() |
3 |
'gpu' |
gpu_action() |
最大频率 |
表 1 action属性
'cpu':
actions: 调整cpu频率
action_info: cpu最大允许频率,单位:KHz
'cpuN':
actions: 调整第N个cpu频率
action_info: cpuN最大允许频率,单位:KHz
备注:
device还可取以下值: 'gpu', 'clusterN'
配置文件:
sampling 1000
[PMIC_THERM_MON]
algo_type monitor
sensor PMIC_THERM
sampling 5000
thresholds 40200 45000 50000
thresholds_clr 38000 43000 48000
actions cpu+report cpu cpu
action_info 1188000+0 368640 245760
描述:
1. 默认采样率为1s;
2. PMIC_THERM传感器采样率为5s;
3. 当温度升到到40.2度以上时,触发门限1,调节cpu最大允许频率为1188000KHz,在本例中,由于此频率是最大值,因此实际无动作;同时上报此消息,action_info值0被忽略;
4. 当温度降低到38度以下时,清除门限1,并上报此消息;
5. 当温度升高到45度以上时,触发门限2,调节cpu最大允许频率为368640KHz;
6. 当温度降低到43度以下时,清除门限2,调节cpu最大允许频率为1188000KHz。
配置文件:
sampling 2000
[bcl_monitor]
algo_type monitor
descending
sensor bcl
sampling 1000
thresholds 100 0
thresholds_clr 500 100
actions report report
action_info 0 0
描述:
1. 使能调试信息输出;
2. 默认采样率为2s;
3. 对于电池电流限制(battery current limit)传感器,采样率为1s;
4. 当电池电流升到imax - 100mA时,触发门限1,并上报此消息;
5. 当电池电流降到imax - 500mA时,清除门限1,并上报此消息;
6. 当电池电流升到imax时,触发门限2,并上报此消息;
7. 当电池电流降到imax -100mA时,清除门限2,并上报此消息。
配置文件:
debug
[TEST_PID]
algo_type pid
sensor tsens_tz_sensor0
device cpu
sampling 1000
set_point 85000
set_point_clr 65000
p_const 1.0
i_const 1.0
d_const 1.0
i_samples 10
dev_units_per_calc 10000
描述:
1. 使能调试信息输出;
2. 本PID算法实例标签为TEST_PID;
3. 使用tsens_tz_sensor0传感器;
4. 被调节设备是CPU;
5. 采样率为1s;
6. set_point值是PID调节算法的门限值和PID算法的设定值;
7. set_point_clr是停止PID调节算法的门限值;
8. p_const, i_const, d_const是PID等式中的p,i,d常量;
9. i_samples是PID等式中的积分错误采样次数;
10. dev_units_per_calc 10000 kHz(设备是CPU,因此单位是kHz)是PID输出增加的步进值(即按10000KHz为步长调整??);
配置文件:
debug
[virtual_sensor-0]
algo_type virtual
sensor tsens_tz_sensor8
set_point 35000
set_point_clr 30000
sensors tsens_tz_sensor1 tsens_tz_sensor5
weights 40 60
sampling 250
[Test-PID]
algo_type pid
sensor virtual-sensor-0
device cpu1
sampling 250
set_point 55000
set_point_clr 50000
p_const 1.25
i_const 0.8
d_const 0.5
i_samples 10
dev_units_per_calc 5000
描述:
1. PID实例Test-PID基于virtual-sensor-0的结果;
2. virtual-sensor-0需要用户手动定义;
3. trip_sensor 用来指示虚拟传感器何时开始进入polling模式(轮询),trip_sensor必须为常规传感器,不能为另外一个虚拟传感器;
4. set_point是trip sensor的门限值,当高于此门限值时,trip sensor将从中断模式进入轮询模式,轮询频率由虚拟传感器的sampling字段设置;
5. set_point_clr是trip sensor的门限值,当低于此门限值时,trip sensor将停止轮询模式然后等待下一个门限事件;
6. weights给定了传感器数组的权重值;
7. 虚拟传感器的set_point必须小于pid算法的set_point,以便当达到set_point时pid能收到通知,另外,如果虚拟传感器未进入轮询模式,pid将不能获取到它的温度;
8. 如果tirp sensor不支持从中断模式到查询模式的改变,第8条可以被忽略。此时虚拟传感器的采样率将应该和pid的采样率一致。
配置文件:
debug
[bcm_monitor]
algo_type monitor
sensor bcm
sampling 1000
thresholds 70000 90000 // 注意,单位为m%
thresholds_clr 69000 89000
actions cpu cpu
action_info 768000 384000
描述:
1. 使能调试信息输出;
2. 当采样电流达到imax的70%时,门限1触发,调整cpu最大允许频率为768000KHz;
3. 当采样电流达到imax的90%时,门限2触发,调整cpu最大允许频率为384000KHz;
4. bcm仅支持2级门限调节;
5. 有效的门限值取值为:40000,50000,60000,70000,80000,90000。