Platform: RK3368
OS: Android 6.0
Kernel: 3.10.0
rk3368采用cpufreq进行CPU频率调节,但同时又做了过温保护和温度限制频率。
1. 过温保护
驱动位于kernel/drivers/thermal/rockchip_thermal.c
dts定义:
tsadc: tsadc@ff280000 {
compatible = "rockchip,rk3368-tsadc";
reg = <0x0 0xff280000 0x0 0x100>;
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_tsadc>, <&clk_gates20 0>;
rockchip,grf = <&grf>;
rockchip,cru = <&cru>;
rockchip,pmu = <&pmu>;
clock-names = "tsadc", "apb_pclk";
clock-frequency = <32000>;
resets = <&reset RK3368_SRST_TSADC_P>;
reset-names = "tsadc-apb";
//pinctrl-names = "default";
//pinctrl-0 = <&tsadc_int>;
#thermal-sensor-cells = <1>;
hw-shut-temp = <120000>;
status = "disabled";
};
可以看到当前hw-shut-temp = <120000>;也就是温度大于120度就会触发过温保护,强制关机。
查看当前CPU温度:
#cat /sys/rockchip_thermal/temp
CPU动态调频(DVFS)
Linux内部共有五种对频率的管理策略userspace,conservative,ondemand,powersave 和 performance.可以根据负载进行频率提升和降低。
查看支持的governors
# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
conservative ondemand userspace powersave interactive performance
DVFS的dts定义:
dvfs {
vd_arm: vd_arm {
regulator_name = "vdd_arm";
suspend_volt = <1000>; //mV
pd_core {
clk_core_b_dvfs_table: clk_core_b {
operating-points = <
/* KHz uV */
312000 1200000
504000 1200000
816000 1200000
1008000 1200000
>;
status = "okay";
cluster = <0>;
temp-limit-enable = <1>;
target-temp = <80>;
min_temp_limit = <216000>;
normal-temp-limit = <
/*delta-temp delta-freq*/
3 96000
6 144000
9 192000
15 384000
>;
performance-temp-limit = <
/*temp freq*/
100 816000
>;
lkg_adjust_volt_en = <1>;
channel = <0>;
tsadc-ch = <0>;
def_table_lkg = <25>;
min_adjust_freq = <216000>;
lkg_adjust_volt_table = <
/*lkg(mA) volt(uV)*/
0 25000
>;
pvtm_min_temp = <25>;
};
clk_core_l_dvfs_table: clk_core_l {
operating-points = <
/* KHz uV */
312000 1200000
504000 1200000
816000 1200000
1008000 1200000
>;
status = "okay";
cluster = <1>;
temp-limit-enable = <1>;
target-temp = <80>;
min_temp_limit = <216000>;
normal-temp-limit = <
/*delta-temp delta-freq*/
3 96000
6 144000
9 192000
15 384000
>;
performance-temp-limit = <
/*temp freq*/
100 816000
>;
lkg_adjust_volt_en = <1>;
channel = <0>;
tsadc-ch = <0>;
def_table_lkg = <25>;
min_adjust_freq = <216000>;
lkg_adjust_volt_table = <
/*lkg(mA) volt(uV)*/
0 25000
>;
pvtm_min_temp = <25>;
};
};
};
可以看到里面定义了大核和小核的两种限制模式,normal-temp-limit和performance-temp-limit。performance模式中,当温度高于80则频率限制在816000。而在normal模式中,则是每当温度上升delta-temp,则频率降低delta-freq,直到降到min_temp_limit为止。
实现代码位于:
arch/arm/mach-rockchip/dvfs.c
驱动初始化了一个工作队列dvfs_temp_limit_work_func,每隔HZ/10执行一次。主要任务是根据当前温度对temp_limit_rate进行修改。从而让dvfs_get_limit_rate返回的是限频的值。
系统默认为normal模式,在init.rc中写入的:
# set temperature control policy as normal mode
write /sys/module/rockchip_pm/parameters/policy 1
查看及修改当前电源策略:
# cat /sys/module/rockchip_pm/parameters/policy
# echo "1">/sys/module/rockchip_pm/parameters/policy