RK3562的CPU如何降频及关闭硬件编解码

产品温度过高,如何从软件方面入手优化:

复制代码
hzs@sr658:~/rk3562-v1.2.0-sdk/kernel$ git diff ./
diff --git a/arch/arm64/boot/dts/rockchip/rk3562.dtsi b/arch/arm64/boot/dts/rockchip/rk3562.dtsi
index acc7ab524093..92df5806918c 100644
--- a/arch/arm64/boot/dts/rockchip/rk3562.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3562.dtsi
@@ -311,46 +311,6 @@ opp-1200000000 {
                        opp-microvolt-L4 = <825000 825000 1150000>;
                        clock-latency-ns = <40000>;
                };
-               opp-1416000000 {
-                       opp-hz = /bits/ 64 <1416000000>;
-                       opp-microvolt = <1000000 1000000 1150000>;
-                       opp-microvolt-L0 = <1000000 1000000 1150000>;
-                       opp-microvolt-L1 = <975000 975000 1150000>;
-                       opp-microvolt-L2 = <950000 950000 1150000>;
-                       opp-microvolt-L3 = <925000 925000 1150000>;
-                       opp-microvolt-L4 = <900000 900000 1150000>;
-                       clock-latency-ns = <40000>;
-               };
-               opp-1608000000 {
-                       opp-hz = /bits/ 64 <1608000000>;
-                       opp-microvolt = <1037500 1037500 1150000>;
-                       opp-microvolt-L0 = <1037500 1037500 1150000>;
-                       opp-microvolt-L1 = <1012500 1012500 1150000>;
-                       opp-microvolt-L2 = <987500 987500 1150000>;
-                       opp-microvolt-L3 = <962500 962500 1150000>;
-                       opp-microvolt-L4 = <937500 937500 1150000>;
-                       clock-latency-ns = <40000>;
-               };
-               opp-1800000000 {
-                       opp-hz = /bits/ 64 <1800000000>;
-                       opp-microvolt = <1125000 1125000 1150000>;
-                       opp-microvolt-L0 = <1125000 1125000 1150000>;
-                       opp-microvolt-L1 = <1100000 1100000 1150000>;
-                       opp-microvolt-L2 = <1075000 1075000 1150000>;
-                       opp-microvolt-L3 = <1050000 1050000 1150000>;
-                       opp-microvolt-L4 = <1025000 1025000 1150000>;
-                       clock-latency-ns = <40000>;
-               };
-               opp-2016000000 {
-                       opp-hz = /bits/ 64 <2016000000>;
-                       opp-microvolt = <1150000 1150000 1150000>;
-                       opp-microvolt-L0 = <1150000 1150000 1150000>;
-                       opp-microvolt-L1 = <1150000 1150000 1150000>;
-                       opp-microvolt-L2 = <1125000 1125000 1150000>;
-                       opp-microvolt-L3 = <1100000 1100000 1150000>;
-                       opp-microvolt-L4 = <1075000 1075000 1150000>;
-                       clock-latency-ns = <40000>;
-               };
        };

        arm_pmu: arm-pmu {

Linux系统(如Buildroot)上,操作RK3562 CPU频率的核心路径是 /sys/devices/system/cpu/cpu0/cpufreq/

🖥️ 第一步:查看当前CPU状态

在操作前,建议先查看当前CPU的情况,方便后续调整:

  • 查看当前频率cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

  • 查看可用频率范围cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

  • 查看所有可用调频策略 (Governor)cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

  • 查看当前调频策略cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

💡 提示scaling_cur_freq 单位为千赫兹(kHz),例如 408000 表示 408 MHz

🎚️ 第二步:降低CPU频率

方法一:使用 userspace 模式手动设置(推荐)

userspace 模式可以将频率锁定在某个固定值

复制代码
# 1. 切换到 userspace 模式
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# 2. 设置目标频率(如 600MHz,需使用运行频率列表中的值)
echo 600000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
方法二:使用 powersave 模式

这是一种更简单粗暴的方式,它会强制CPU始终运行在最低频率

复制代码
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
方法三:使用 cpufreq-set 命令

如果你的系统中安装了 cpufrequtils 工具包,也可以使用 cpufreq-set 命令:

bash

复制代码
# 为所有CPU核心( -c 0-3 )设置最大频率为 600MHz
sudo cpufreq-set -c 0-3 -u 600MHz
# 设置调速器为 powersave
sudo cpufreq-set -c 0-3 -g powersave
方法四:通过修改设备树(Kernel DTS)

这是一种一劳永逸的方法,通过修改 rk3562.dtsi 文件中的 OPP (Operating Performance Points) 表来限制频率上限。OPP 表定义了 CPU 在不同电压下的工作频率。

操作步骤参考:

  1. 找到并修改 DTS 文件中的 OPP 表条目,移除或屏蔽高于你目标上限的频率节点

  2. 重新编译 Linux 内核

  3. 将编译好的内核镜像(如 boot.imgkernel.img)烧录到设备中。

⚙️ 常见调频策略(Governor)选项

  • performance:最高性能,CPU始终运行在允许的最高频率。

  • powersave:始终运行在允许的最低频率。

  • ondemand:按需调节,根据系统负载在最高和最低频率间快速跳变。

  • conservative:平滑调节频率,频率升降更平缓。

  • userspace:手动设定一个固定频率,由用户应用程序决定。

  • schedutil:利用调度器信息来更智能地调整频率,通常是较新内核的默认选项。

💡 注意事项

  • 温控影响:请注意,RK3562内置的温控策略可能根据芯片温度动态调整可用频率列表,即使你手动设置了频率,也可能受此影响。

  • DDR独立调节:RK3562的DDR频率是独立管理的,调节方法如下:

    复制代码
    # 查看当前频率
    cat /sys/class/devfreq/dmc/cur_freq
    # 查看支持的频率范围
    cat /sys/class/devfreq/dmc/available_frequencies
  • 频率单位为kHz :所有涉及频率值的操作,单位均为 千赫兹(kHz)408000 代表 408 MHz

建议优先尝试 userspacepowersave 模式。如果希望频率限制永久生效,则可以将相关命令写入 rc.local 等系统启动脚本中。

复制代码
升级前后读取一下cpu频率:

# 1. 查看当前最大支持频率
cat /sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq

# 2. 查看当前频率上限 (scaling_max_freq)
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq

# 1. 查看当前CPU支持的频率列表,确认高频已被移除或限制
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies

# 3. 查看 CPU 实时运行频率,观察是否不超过 1.2 GHz
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq


# 将 CPU0 的最大频率限制在 1.2 GHz (但需确保该频率存在于 OPP 表中)
echo 1200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

扩展如何关闭硬件编解码

复制代码
mpp_srv: mpp-srv {
  compatible = "rockchip,mpp-service";
  rockchip,taskqueue-count = <3>;
  rockchip,resetgroup-count = <3>;
  status = "disabled";
 };

在设备树中看到的 mpp_srv 节点,是 RK3562 硬件编解码能力的核心"开关"。

可以直接禁用它,这正是你实现"关闭硬编码"目标最根本的方法。

  • 如已禁用status = "disabled" 表示它已被关闭,系统将不再具备任何 H.264/H.265 的硬件加速编解码能力,只能依赖软件编解码。

  • 若需启用 :将属性改为 status = "okay" 即可恢复,但必须同时确保 内核配置中的 CONFIG_ROCKCHIP_MPP_SERVICE 选项被正确启用。

📝 深度解析:mpp_srv 节点是什么?

MPP(Media Process Platform)是 Rockchip 提供的统一媒体处理平台。你在设备树中看到的 mpp_srv 节点是其软件体系在底层的具体实现,负责:

  • 硬件抽象:作为硬件编解码器(VPU)与系统软件(如 GStreamer)之间的桥梁,提供统一的控制接口。

  • 资源管理 :管理硬件编解码所需的任务分发队列和复位逻辑(即节点中的 rockchip,taskqueue-countrockchip,resetgroup-count)。

🤔 禁用 mpp_srv 还会影响什么?

禁用 mpp_srv 确实可以关闭发热大户的硬编码,但它带来的影响是系统性的:它将完全禁用所有多媒体格式的硬件加速(包括解码和编码)。

具体来说,对于编码,以下任务会完全退化为纯软件编解码:

  • H.264 / H.265 Encoding

  • VP8 / VP9 Encoding

  • AV1 / JPEG Encoding

对于解码,以下原本由硬件加速的任务也一样会受到影响:

  • H.264 / H.265 Decoding

  • VP8 / VP9 Decoding

⚠️ 风险提示与问题排查

在做决定前,建议你评估一下切换为软件编解码带来的影响:

  • CPU 负载与系统功耗变化:软编解码会带来未知的CPU负载飙升和额外的系统功耗,可能出现比之前更严峻的发热问题。

  • 解码和编码同时失效 :完全禁用 mpp_srv 会一并失去硬件解码能力,这意味着你将无法体验主流的 H.264/H.265 视频硬解功能。

  • 初次关闭无法生效? :部分外设修改设备树后需要同步调整内核配置。可以检查内核配置文件 (rockchip_linux_defconfig) 是否包含 CONFIG_ROCKCHIP_MPP_SERVICE=y,如有需改为 # CONFIG_ROCKCHIP_MPP_SERVICE is not set重新编译内核

💎 总结与建议

总的来说,你可以根据以下情况来评判是否完全禁用 mpp_srv 节点:

  • 值得关闭的场景:设备定位为无需任何视频编解码功能的"纯逻辑"控制器(如工业采集、串口服务器等),此时可以关闭以规避潜在风险。

  • 不建议关闭的场景 :设备仍需播放视频或预览监控画面;你的应用仅依赖或少量依赖硬编码服务。你或许应该只调整应用层,而非"一刀切"禁用底层驱动。

考虑到禁用 mpp_srv 的后果是硬件编解码都失效,这和你最初只想"关掉发热编码器"的目标不完全一致。如果你愿意,可以告诉我你的项目是否需要保留视频播放/预览(解码)功能,我可以帮你分析如何在保留硬解码的同时,更精准地单方面关闭功耗最高的 H.264/H.265 硬编码。

相关推荐
Dillon Dong3 小时前
【风电控制】TI TMS320F28379D 双CPU架构解析与任务分布设计
嵌入式硬件·算法·变流器·风电控制
为思念酝酿的痛8 小时前
POSIX信号量
linux·运维·服务器·后端
人还是要有梦想的9 小时前
linux下用搜狗输入法,中英文切换
linux·运维·服务器
bush410 小时前
嵌入式linux学习记录二
linux·运维·学习
9分钟带帽10 小时前
linux_通过NFS挂载远程服务器的硬盘
linux·服务器
三易串口屏11 小时前
实验20 自动灭火场景实验
嵌入式硬件·串口屏·三易串口屏·uart 通信
蒸蛋一级爱好者11 小时前
TFTP协议
单片机·嵌入式硬件
优信电子11 小时前
STM32/C51驱动 DHTC11 温湿度传感器
stm32·单片机·嵌入式硬件·c51·温湿度传感器·dhtc11·环境测量
周周记笔记12 小时前
【元器件专题】三极管-如果B极给一个方波信号,那么V0输出也可以设计为一个方波信号
单片机·嵌入式硬件
潜创微科技12 小时前
IT68353:DP 1.4 + HDMI 2.0 + USB-C 三合一转 HDMI 2.0 单芯片KVM切换方案
嵌入式硬件·音视频