RK平台常用定频方法

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>;
                };
        };
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值