本文基于高通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还未被使用。

monitor算法配置格式

[<算法实例标签>]

algo_type          monitor
sensor                 <传感器名称>
sampling            <采样率(ms)>
descending                 //       可选,默认门限是升序,有此字段后门限顺序为降序
thresholds     <门限值(mC/mA)>
thresholds_clr  <清除门限值>
actions        <达到门限时的动作,多个动作时用'+'连接>
action_info    <动作额外信息,多个额外信息间用'+'连接>

pid算法配置格式

[<算法实例标签>]

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  <积分算法输出调整单元值(每次调整的值)>

ss算法配置格式

[<算法实例标签>]

algo_type          ss
sampling            <采样率(ms)>
sensor                 <传感器名称>
device                <被PID算法调整的设备>
set_point           <PID算法调整的目标值(mC/mA)>
set_point_clr     <PID算法停止调整的值>
time_constant  <当当前和上一个错误采样值相等时的延迟调整系数>
device_max_limit     <设备最大值(mC/mA)>            // 可选

virtual算法配置格式

该算法实际作用是用已存在的传感器模拟出一个新的传感器。

[<虚拟传感器名字>]

algo_type          virtual
trip_sensor        <传感器名称>
set_point           <当高于此温度时,虚拟传感器开始polling模式>
set_point_clr     <当高于此温度时,虚拟传感器停止polling模式>
sensors               <用于计算温度总和的传感器数组>
weights               <权重值数组>
sampling            <默认采样率>

配置文件字段解释

thresholds取值

‘thresholds’/‘thresholds_clr’/‘actions’/'action_info’接受最多8级以空格分开的门限。

action取值

‘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属性

device取值

‘cpu’:

actions: 调整cpu频率

action_info: cpu最大允许频率,单位:KHz

‘cpuN’:

actions: 调整第N个cpu频率

action_info: cpuN最大允许频率,单位:KHz

备注:

device还可取以下值: ‘gpu’, ‘clusterN’

配置文件示例

示例1

配置文件:

[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。

示例2

配置文件:

[bcl_monitor]
algo_type        monitor
descending
sensor           bcl
sampling        2000
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,并上报此消息。

示例3

配置文件:

[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为步长调整??);

示例4

配置文件:

[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的采样率一致。

示例5

配置文件:

[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。

示例6

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