RV1126B NPU 温度限频修改指南
目的:给 NPU 增加温度分级限频。温度升高后先降频,避免持续高频直到触发过温关机。
1. 要改哪里
| 项目 | 内容 |
|---|---|
| 实际修改文件 | /home/user/SDK/rk3xxx/kernel-6.1/arch/arm64/boot/dts/rockchip/rv1126b-evb4-v10.dts |
| 增加位置 | 文件末尾 |
| 不用修改 | rknpu_devfreq.c、TSADC 驱动、rv1126b.dtsi |
在 rv1126b-evb4-v10.dts 末尾加入以下完整代码:
&npu_opp_table {
rockchip,temp-freq-table = <
80000 600000
90000 510000
100000 396000
>;
};
若文件已有 &npu_opp_table,只加入或替换其中的 rockchip,temp-freq-table,不要新建第二个同名节点。
2. 为什么这样改
原有 115°C Linux critical 和 120°C TSADC T_SHUT 是最后的安全保护。此表用于提前控制功耗:温度超过 80°C、90°C、100°C 时,NPU 最高频率分别限制为 600、510、396 MHz。
每项格式为 <温度 最高频率>:温度单位为毫摄氏度,频率单位为 kHz。驱动使用“严格大于”,因此温度正好 80°C 时不会触发第一档;表必须按温度从低到高排列。
RV1126B 的 NPU OPP 表有 396/510/600 MHz,但没有 RV1126 参考表中的 300 MHz,不能直接照抄 100000 300000。
3. 为什么不用改系数或驱动
NPU Devfreq 已注册到 Rockchip System Monitor。System Monitor 读取 rockchip,temp-freq-table 后,通过 Devfreq QoS 限制 NPU 最高频率。
dynamic-power-coefficient、#cooling-cells 和 thermal cooling map 属于另一套 Linux thermal cooling-device 方案,本次使用该表时不是必需项。
相关源码仅供查看:
| 用途 | 路径 |
|---|---|
| 温度限频实现 | /home/user/SDK/rk3xxx/kernel-6.1/drivers/soc/rockchip/rockchip_system_monitor.c |
| NPU Devfreq | /home/user/SDK/rk3xxx/kernel-6.1/drivers/rknpu/rknpu_devfreq.c |
| RV1126 参考表 | /home/user/SDK/rk3xxx/kernel-6.1/arch/arm/boot/dts/rv1126.dtsi |
4. 编译
先确认当前目标:
cd /home/user/SDK/rk3xxx
readlink -f device/rockchip/.chip
grep RK_KERNEL_DTS_NAME output/defconfig
预期 DTS 名称为 rv1126b-evb4-v10。完成 DTS 修改后:
cd /home/user/SDK/rk3xxx
./build.sh kernel
构建完成后,按当前板卡流程更新包含新 DTB 的内核镜像。
5. 板端测试
检查 NPU 压测程序和模型:
ls -l /usr/bin/rknn_common_test \
/usr/share/model/RV1126B/mobilenet_v1.rknn \
/usr/share/model/dog_224x224.jpg
先跑 10 次推理:
rknn_common_test /usr/share/model/RV1126B/mobilenet_v1.rknn \
/usr/share/model/dog_224x224.jpg 10
持续压测:
rknn_common_test /usr/share/model/RV1126B/mobilenet_v1.rknn \
/usr/share/model/dog_224x224.jpg 100000 >/dev/null 2>&1 &
找到 NPU devfreq 目录:
for d in /sys/class/devfreq/*; do
printf '%s: ' "$d"
cat "$d/name"
done
假设目录为 /sys/class/devfreq/fde40000.npu,持续观察温度和频率:
while true; do
cat /sys/class/thermal/thermal_zone0/temp
cat /sys/class/devfreq/fde40000.npu/cur_freq
sleep 2
done
通过条件:温度超过 80°C、90°C、100°C 后,cur_freq 分别不高于 600000、510000、396000 kHz。cur_freq 可以更低,这是正常的 Devfreq 调节结果。
首次验证可临时改低阈值,例如 50000、60000、70000;验证后恢复为实际热设计阈值并重新构建。
6. 常见问题
| 现象 | 处理方法 |
|---|---|
| 超过阈值仍不降频 | 确认新 DTB 已启动;查看 `dmesg |
| 压测程序不存在 | Buildroot 使能 BR2_PACKAGE_RKNPU2_EXAMPLE=y 后重建 rootfs |
| 80°C 正好不生效 | 正常,触发条件是严格大于阈值 |
| 频率不是表中数值 | 表定义的是最高频率,不是强制固定频率 |
npu_freq_scaling.sh 是手动频率切换脚本,不适合验证自动温度限频。