CPU
Contents
1 S5P4418/S5P6818 锁定CPU的最高频率
1.1 Method 1
The following command is used to temporarily limit the maximum CPU frequency to 1GHz: echo 1000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
1.2 Method 2
Modify the kernel source code:
arch/arm/plat-s5p4418/nanopi2/device.c
Delete the unwanted frequencies in the following array:
static unsigned long dfs_freq_table[][2] = { { 1400000, 1200000, }, { 1200000, 1120000, }, { 1000000, 1040000, }, { 800000, 1000000, }, { 700000, 940000, }, { 600000, 940000, }, { 500000, 940000, }, { 400000, 940000, }, };
2 H3 DVFS
2.1 Linux-4.14
对于H3系列的开发板,使用的都是同样的DVFS设置,相关代码位于arch/arm/boot/dts/sun8i-h3-nanopi.dtsi:
&cpu0 { operating-points = < 1008000 1300000 816000 1100000 624000 1100000 480000 1100000 312000 1100000 240000 1100000 120000 1100000 >; #cooling-cells = <2>; cooling-min-level = <0>; cooling-max-level = <6>; cpu0-supply = <&vdd_cpux>; }; &cpu_thermal { trips { cpu_warm: cpu_warm { temperature = <65000>; hysteresis = <2000>; type = "passive"; }; cpu_hot: cpu_hot { temperature = <75000>; hysteresis = <2000>; type = "passive"; }; cpu_very_hot: cpu_very_hot { temperature = <90000>; hysteresis = <2000>; type = "passive"; }; cpu_crit: cpu_crit { temperature = <105000>; hysteresis = <2000>; type = "critical"; }; }; cooling-maps { cpu_warm_limit_cpu { trip = <&cpu_warm>; cooling-device = <&cpu0 THERMAL_NO_LIMIT 1>; }; cpu_hot_limit_cpu { trip = <&cpu_hot>; cooling-device = <&cpu0 2 3>; }; cpu_very_hot_limit_cpu { trip = <&cpu_very_hot>; cooling-device = <&cpu0 5 THERMAL_NO_LIMIT>; }; }; };
3 H5 DVFS
3.1 Linux-4.14
对于H5系列的开发板,不同型号的DVFS设置是不一样的。 以NanoPi NEO2为例,相关代码位于arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2.dts:
&cpu0 { operating-points = < 1008000 1100000 816000 1100000 624000 1100000 480000 1100000 312000 1100000 240000 1100000 120000 1100000 >; #cooling-cells = <2>; cooling-min-level = <0>; cooling-max-level = <6>; cpu0-supply = <&vdd_cpux>; }; &cpu_thermal { trips { cpu_warm: cpu_warm { temperature = <65000>; hysteresis = <2000>; type = "passive"; }; cpu_hot: cpu_hot { temperature = <75000>; hysteresis = <2000>; type = "passive"; }; cpu_very_hot: cpu_very_hot { temperature = <90000>; hysteresis = <2000>; type = "passive"; }; cpu_crit: cpu_crit { temperature = <105000>; hysteresis = <2000>; type = "critical"; }; }; cooling-maps { cpu_warm_limit_cpu { trip = <&cpu_warm>; cooling-device = <&cpu0 THERMAL_NO_LIMIT 1>; }; cpu_hot_limit_cpu { trip = <&cpu_hot>; cooling-device = <&cpu0 2 3>; }; cpu_very_hot_limit_cpu { trip = <&cpu_very_hot>; cooling-device = <&cpu0 5 THERMAL_NO_LIMIT>; }; }; };
4 获取CPU温度
读取以下文件获得当前的CPU温度:
S5P4418/S5P6818:
/sys/class/hwmon/hwmon0/device/temp_label
Allwinner H3/H5/A64:
/sys/class/thermal/thermal_zone0/temp
RK3399,获取CPU温度和运行频率:
while true; do
t1=`cat /sys/class/thermal/thermal_zone0/temp`
t2=`cat /sys/class/thermal/thermal_zone1/temp`
f1=`cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq`
f2=`cat /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq`
echo "$t1 $t2 $f1 $f2"
sleep 1
#cat /sys/class/thermal/thermal_zone[01]/temp
#cat /sys/devices/system/cpu/cpu[04]/cpufreq/cpuinfo_cur_freq
done