产品温度过高,如何从软件方面入手优化:
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 在不同电压下的工作频率。
操作步骤参考:
-
找到并修改 DTS 文件中的 OPP 表条目,移除或屏蔽高于你目标上限的频率节点。
-
重新编译 Linux 内核。
-
将编译好的内核镜像(如
boot.img或kernel.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。
建议优先尝试 userspace 或 powersave 模式。如果希望频率限制永久生效,则可以将相关命令写入 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-count和rockchip,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 硬编码。