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 硬编码。

相关推荐
CoderMeijun1 小时前
Linux 文件操作详解:open/read/write/lseek 系统调用
linux·文件操作·系统调用·open·文件描述符
可可西里_X_back1 小时前
Linux学习(二)- 驱动开发步骤
linux·驱动开发·学习
Hical_W2 小时前
Hical 踩坑实录五部曲(二):MSVC / GCC / Clang 三平台 C++20 编译差异
linux·windows·经验分享·嵌入式硬件·macos·开源·c++20
活蹦乱跳酸菜鱼3 小时前
linux ATF BL2执行过程
linux
bubiyoushang8883 小时前
基于 Freescale S12 单片机的 Bootloader 开发
单片机·嵌入式硬件·mongodb
笨笨小乌龟113 小时前
单片机的半主机模式与 MicroLib 机制(Keil UseMicroLIB)
stm32·单片机·嵌入式硬件
非鱼䲆鱻䲜4 小时前
数模电数控电源(0—9.9v)
嵌入式硬件·multisim·数模电·嘉立创
淡淡烟雨淡淡愁4 小时前
安装libreoffice
linux
蜀道山老天师4 小时前
云原生监控入门:监控基础概念 + SLI/SLO/SLA 详解 + Prometheus 从零安装配置
linux·运维·云原生·prometheus