本文基于高通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’
配置文件:
[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
描述:
默认采样率为1s;
PMIC_THERM传感器采样率为5s;
当温度升到到40.2度以上时,触发门限1,调节cpu最大允许频率为1188000KHz,在本例中,由于此频率是最大值,因此实际无动作;同时上报此消息,action_info值0被忽略;
当温度降低到38度以下时,清除门限1,并上报此消息;
当温度升高到45度以上时,触发门限2,调节cpu最大允许频率为368640KHz;
当温度降低到43度以下时,清除门限2,调节cpu最大允许频率为1188000KHz。
配置文件:
[bcl_monitor]
algo_type monitor
descending
sensor bcl
sampling 2000
thresholds 100 0
thresholds_clr 500 100
actions report report
action_info 0 0
描述:
使能调试信息输出;
默认采样率为2s;
对于电池电流限制(battery current limit)传感器,采样率为1s;
当电池电流升到imax - 100mA时,触发门限1,并上报此消息;
当电池电流降到imax - 500mA时,清除门限1,并上报此消息;
当电池电流升到imax时,触发门限2,并上报此消息;
当电池电流降到imax -100mA时,清除门限2,并上报此消息。
配置文件:
[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
描述:
使能调试信息输出;
本PID算法实例标签为TEST_PID;
使用tsens_tz_sensor0传感器;
被调节设备是CPU;
采样率为1s;
set_point值是PID调节算法的门限值和PID算法的设定值;
set_point_clr是停止PID调节算法的门限值;
p_const, i_const, d_const是PID等式中的p,i,d常量;
i_samples是PID等式中的积分错误采样次数;
dev_units_per_calc 10000 kHz(设备是CPU,因此单位是kHz)是PID输出增加的步进值(即按10000KHz为步长调整??);
配置文件:
[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
描述:
PID实例Test-PID基于virtual-sensor-0的结果;
virtual-sensor-0需要用户手动定义;
trip_sensor 用来指示虚拟传感器何时开始进入polling模式(轮询),trip_sensor必须为常规传感器,不能为另外一个虚拟传感器;
set_point是trip sensor的门限值,当高于此门限值时,trip sensor将从中断模式进入轮询模式,轮询频率由虚拟传感器的sampling字段设置;
set_point_clr是trip sensor的门限值,当低于此门限值时,trip sensor将停止轮询模式然后等待下一个门限事件;
weights给定了传感器数组的权重值;
虚拟传感器的set_point必须小于pid算法的set_point,以便当达到set_point时pid能收到通知,另外,如果虚拟传感器未进入轮询模式,pid将不能获取到它的温度;
如果tirp sensor不支持从中断模式到查询模式的改变,第8条可以被忽略。此时虚拟传感器的采样率将应该和pid的采样率一致。
配置文件:
[bcm_monitor]
algo_type monitor
sensor bcm
sampling 1000
thresholds 70000 90000 // 注意,单位为m%
thresholds_clr 69000 89000
actions cpu cpu
action_info 768000 384000
描述:
使能调试信息输出;
当采样电流达到imax的70%时,门限1触发,调整cpu最大允许频率为768000KHz;
当采样电流达到imax的90%时,门限2触发,调整cpu最大允许频率为384000KHz;
bcm仅支持2级门限调节;
有效的门限值取值为:40000,50000,60000,70000,80000,90000。
pix3 Android 10.0.0 中配置的config内容如下:
[SS-SKIN-HIGH-CPU4]
algo_type ss
sampling 2000
sensor fps-therm-adc
device cpu4
set_point 39000
set_point_clr 38000
device_max_limit 1996800
time_constant 0
[SS-SKIN-MID-CPU4]
algo_type ss
sampling 2000
sensor fps-therm-adc
device cpu4
set_point 41000
set_point_clr 40000
device_max_limit 1689600
time_constant 0
[SS-SKIN-LOW-CPU4]
algo_type ss
sampling 2000
sensor fps-therm-adc
device cpu4
set_point 43000
set_point_clr 42000
device_max_limit 1363200
time_constant 0
[HOT-SKIN-VIRTUAL]
algo_type virtual
trip_sensor fps-therm-adc
sensors gpu0-usr cpu0-silver-usr
list_cnt 2
weights 1 -1
set_point 40000
set_point_clr 37000
sampling 1000
math 0
[VIRTUAL-SS-GPU-SKIN]
algo_type ss
sensor HOT-SKIN-VIRTUAL
device gpu
sampling 1000
set_point 8000
set_point_clr 2000
device_max_limit 414000000
[SKIN-MONITOR]
algo_type monitor
sampling 1000
sensor fps-therm-adc
thresholds 45000 47000 57000
thresholds_clr 43000 45000 56000
actions cpu0+cpu4+gpu cpu0+cpu4+gpu shutdown
action_info 979200+1056000+414000000 748800+825600+257000000 1
[BATTERY-MONITOR]
algo_type monitor
sampling 2000
sensor fps-therm-adc
thresholds 39000 41000 43000 48000
thresholds_clr 38000 40000 42000 46000
actions battery battery battery battery
action_info 1 2 3 4
[MNH-MONITOR]
algo_type monitor
sampling 2000
sensor fps-therm-adc
thresholds 45000 47000
thresholds_clr 44000 46000
actions mnh mnh
action_info 3 4
[MODEM-MONITOR]
algo_type monitor
sampling 1000
sensor fps-therm-adc
thresholds 48000 53000
thresholds_clr 45000 51000
actions modem+modem_proc modem+modem_proc
action_info 1+1 3+3