CPU定频
使用指令定频
echo user_space > /sys/class/thermal/thermal_zone0/policy #关闭温控
# 以rk3399为例,rk3399有两个核,一个A53,一个A72,这两个需要分开操作
# A53
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor #切换变频策略
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies #查看支持哪些频率
echo 1512000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed #定频到1512000
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq #查看当前频率
# A72
echo userspace > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor #切换变频策略
cat /sys/devices/system/cpu/cpu4/cpufreq/scaling_available_frequencies #查看支持哪些频率
echo 1512000 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_setspeed #定频到1512000
cat /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq #查看当前频率
注意:系统默认会有一个温度保护措施,达到一定温度后会自动降频,如果要强制做定频测试的话就需要关闭温控,但是这样做有烧坏cpu的可能。
通过代码定频
相对于用指令定频,通过改代码更加简单粗暴,原理就是在dts里面把cpu的频率点固定死,只保留你想设定的一个,其他的频率点都删除掉。
以rk3399 android10的代码为例,在rk3399-opp.dtsi中有一个名字为cluster0_opp的节点,这个是给小核A53用的频率表,还有一个名字为cluster1_opp的节点,这个是给大核A72的频率表,这两个表里面都定义了支持的cpu频率值和电压值,如果要定频,可以把里面的频率值和电压值都删除掉,只留下一个你想设定的频率即可,比如我想把小核设置为最高频:
cluster0_opp: opp-table0 {
compatible = "operating-points-v2";
opp-shared;
rockchip,temp-hysteresis = <5000>;
rockchip,low-temp = <10000>;
rockchip,low-temp-min-volt = <900000>;
nvmem-cells = <&cpul_leakage>, <&specification_serial_number>;
nvmem-cell-names = "cpu_leakage",
┆ "specification_serial_number";
clocks = <&cru PLL_APLLL>;
rockchip,avs-scale = <20>;
rockchip,bin-scaling-sel = <
0 30
1 34
>;
rockchip,pvtm-voltage-sel = <
0 143500 0
143501 148500 1
148501 152000 2
152001 999999 3
>;
rockchip,pvtm-freq = <408000>;
rockchip,pvtm-volt = <1000000>;
rockchip,pvtm-ch = <0 0>;
rockchip,pvtm-sample-time = <1000>;
rockchip,pvtm-number = <10>;
rockchip,pvtm-error = <1000>;
rockchip,pvtm-ref-temp = <41>;
rockchip,pvtm-temp-prop = <115 66>;
rockchip,thermal-zone = "soc-thermal";
/*
opp-408000000 {
opp-hz = /bits/ 64 <408000000>;
opp-microvolt = <825000 825000 1250000>;
opp-microvolt-L0 = <825000 825000 1250000>;
opp-microvolt-L1 = <825000 825000 1250000>;
opp-microvolt-L2 = <825000 825000 1250000>;
opp-microvolt-L3 = <825000 825000 1250000>;
clock-latency-ns = <40000>;
};
opp-600000000 {
opp-hz = /bits/ 64 <600000000>;
opp-microvolt = <825000 825000 1250000>;
opp-microvolt-L0 = <825000 825000 1250000>;
opp-microvolt-L1 = <825000 825000 1250000>;
opp-microvolt-L2 = <825000 825000 1250000>;
opp-microvolt-L3 = <825000 825000 1250000>;
clock-latency-ns = <40000>;
};
opp-816000000 {
opp-hz = /bits/ 64 <816000000>;
opp-microvolt = <850000 850000 1250000>;
opp-microvolt-L0 = <850000 850000 1250000>;
opp-microvolt-L1 = <825000 825000 1250000>;
opp-microvolt-L2 = <825000 825000 1250000>;
opp-microvolt-L3 = <825000 825000 1250000>;
clock-latency-ns = <40000>;
opp-suspend;
};
opp-1008000000 {
opp-hz = /bits/ 64 <1008000000>;
opp-microvolt = <925000 925000 1250000>;
opp-microvolt-L0 = <925000 925000 1250000>;
opp-microvolt-L1 = <900000 900000 1250000>;
opp-microvolt-L2 = <875000 875000 1250000>;
opp-microvolt-L3 = <850000 850000 1250000>;
clock-latency-ns = <40000>;
};
opp-1200000000 {
opp-hz = /bits/ 64 <1200000000>;
opp-microvolt = <1000000 1000000 1250000>;
opp-microvolt-L0 = <1000000 1000000 1250000>;
opp-microvolt-L1 = <975000 975000 1250000>;
opp-microvolt-L2 = <950000 950000 1250000>;
opp-microvolt-L3 = <925000 925000 1250000>;
clock-latency-ns = <40000>;
};
*/
opp-1416000000 {
opp-hz = /bits/ 64 <1416000000>;
opp-microvolt = <1125000 1125000 1250000>;
opp-microvolt-L0 = <1125000 1125000 1250000>;
opp-microvolt-L1 = <1100000 1100000 1250000>;
opp-microvolt-L2 = <1075000 1075000 1250000>;
opp-microvolt-L3 = <1050000 1050000 1250000>;
clock-latency-ns = <40000>;
};
};
DDR定频
通过指令定频
RK平台在kernel4.4之后都用dmc来管理ddr频率,因此可以通过dmc相关的接口来定频,较老的代码可能不支持dmc。
echo userspace > /sys/devices/platform/dmc/devfreq/dmc/governor #切换变频策略
cat /sys/devices/platform/dmc/devfreq/dmc/available_frequencies #查看支持哪些频率
echo 666000000 > /sys/devices/platform/dmc/devfreq/dmc/userspace/set_freq #定频到666000000
cat /sys/devices/platform/dmc/devfreq/dmc/cur_freq #查看当前频率
通过代码定频
与CPU一样,通过改代码来实现定频,原理就是在dts里面把ddr的频率点固定死,只保留你想设定的一个,其他的频率点都删除掉。
以rk3399 android10的代码为例,在rk3399-opp.dtsi中有一个名字为dmc_opp_table的节点,这个是给ddr用的频率表,这个表里面都定义了支持的ddr频率值和电压值,如果要定频,可以把里面的频率值和电压值都删除掉,只留下一个你想设定的频率即可,比如我想把ddr设定为最高频:
dmc_opp_table: opp-table3 {
compatible = "operating-points-v2";
/*
opp-200000000 {
opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <900000>;
};
opp-300000000 {
opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <900000>;
};
opp-400000000 {
opp-hz = /bits/ 64 <400000000>;
opp-microvolt = <900000>;
};
opp-528000000 {
opp-hz = /bits/ 64 <528000000>;
opp-microvolt = <900000>;
};
opp-600000000 {
opp-hz = /bits/ 64 <600000000>;
opp-microvolt = <900000>;
};
*/
opp-800000000 {
opp-hz = /bits/ 64 <800000000>;
opp-microvolt = <900000>;
};
};