泰山派1F 风扇与温度联动散热
泰山派 1F 风扇驱动(pwm-fan)适配调试笔记
日期:2026-09-05
平台:泰山派 1F(RK3566)+ Linux 6.1.141 SDK(rk3566_linux_sdk_20260414)
目标:风扇从"裸 PWM 手动控制"升级为"pwm-fan 驱动 + 温度自动联动"
结果:✅ 完成,温度联动验证通过
最终固件:update.img SHA-256
c54f89d7859e9d6b0952e161637cb327cc6e793ba60cf5c8b5d99dc7fd68fa28(含 12G rootfs 扩容)
1. 背景与硬件
风扇接在泰山派 1F 板载 PWM6(
pwm@fe6e0020)PWM6 在
rk356x.dtsi中定义:compatible = "rockchip,rk3568-pwm", "rockchip,rk3328-pwm",默认status = "disabled"板级 dts
tspi-rk3566-user-v10-linux.dts中板厂已预留//风扇注释并启用&pwm6:
阶段 0:裸 PWM 手动控制验证(驱动接入前)
结论:PWM6 硬件通路正常,可输出 40kHz 占空比控制。
阶段 0 的局限:无温度自动联动,CPU 热了不会自动加速;sysfs 操作是一次性的,重启失效。
2. 驱动适配(内核层两处改动)
2.1 设备树加 pwm-fan 节点
文件:kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
备份:tspi-rk3566-user-v10-linux.dts.bak-nofan
在 &pwm6 节点后追加(注意:1F dts 顶层全是 &引用 模式,必须用 / { ... }; 打开根节点再挂):
/ {
fan0: pwm-fan {
compatible = "pwm-fan";
#cooling-cells = <2>;
pwms = <&pwm6 0 25000 0>; /* 40kHz,与手动验证一致 */
cooling-levels = <0 50 100 150 200 255>; /* 占空比档位(0~255) */
rockchip,temp-trips = < /* 温度联动档位表 */
50000 1 55000 2
60000 3 65000 4
70000 5
>;
};
};
参考来源:Rockchip 官方 rk3588s-evb8-lp4x.dtsi 的 fan: pwm-fan 写法(rockchip,temp-trips 扩展,由内核 drivers/hwmon/pwm-fan.c + rockchip_system_monitor 驱动支持)。
2.2 内核配置启用驱动
文件:kernel-6.1/arch/arm64/configs/rockchip_linux_defconfig(备份 .bak-nofan)
⚠️ 关键坑:光改 dtb 不够!RK 默认 defconfig 是 # CONFIG_SENSORS_PWM_FAN is not set,驱动没编进内核,dtb 里有节点也不会有 hwmon。必须开配置重编内核。2.3 编译与打包
3. 踩坑记录
| # | 现象 | 根因 | 解决 |
|---|---|---|---|
| 1 | dtc: tspi-rk3566-user-v10-linux.dts:333.7-14 syntax error | 1F dts 顶层全是 &xxx {} 引用,直接裸插 fan0: pwm-fan {} 不合法 | 用 / { fan0: pwm-fan {...}; }; 重新打开根节点追加 |
| 2 | dtb 有节点但板端无 hwmon | CONFIG_SENSORS_PWM_FAN 未启用(# is not set) | defconfig 加 CONFIG_SENSORS_PWM_FAN=y 重编内核 |
| 3 | 改完 dts 后其它无关报错(pmu_io_domains 警告) | SDK 编译每轮都有的提示性警告,非错误 | 忽略,看 build_kernel succeeded 为准 |
| 4 | 旧版 live-build / binfmt 问题 | 属于 SDK 搭建期踩坑,见 T11 主验收记录 | 已解决(拷贝 1M 容器 live-build 20230131 + 挂载 binfmt_misc) |
4. 板端验证(烧录后)
4.1 驱动加载确认
4.2 温度联动实测(stress-ng 满载)
实测曲线:
| 温度 | pwm1 占空比 | 行为 |
|---|---|---|
| 39~48°C(<50°C trip) | 0 | 停转 ✅ |
| 61°C(>50°C trip) | 150(1 档) | 自动启动 ✅ |
| 64~66°C(>60°C trip) | 200(2 档) | 自动升档 ✅ |
| 64~68°C 稳定 | 200 稳定 | 不抖 ✅ |
| 负载结束回 39°C | 200 → 0 | 自动停转 ✅(闭环) |
4.3 关键行为说明
驱动接管后,直接写
pwm1会被温度监控拉回(48°C 时写 128 读回 0)——这是 rockchip_system_monitor 按 trip 强制档位,符合预期;要手动调速需保证温度低于对应 trip 或改 trip 表初始上电温度 <50°C 时
pwm1=0,属正常(驱动启动即按温度决策)
5. 调参指引
改温度阈值/档位:编辑 dts 中 rockchip,temp-trips(温度单位 m°C,50000=50°C;右侧数字对应 cooling-levels 的下标 1~5)。
改占空比档位:编辑 cooling-levels = <0 50 100 150 200 255>(0~255 线性占空比)。
改 PWM 频率:pwms = <&pwm6 0 25000 0> 第三项周期 ns(25000ns=40kHz;RK 参考板常用 50000ns=20kHz)。
改后需重编内核:./build.sh kernel-6.1 && ./build.sh updateimg,烧录 boot 分区即可。
6. 文件与产物登记
| 项 | 路径/值 |
|---|---|
| 修改的 dts | kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts |
| dts 备份 | 同目录 tspi-rk3566-user-v10-linux.dts.bak-nofan |
| 修改的 defconfig | kernel-6.1/arch/arm64/configs/rockchip_linux_defconfig |
| defconfig 备份 | 同目录 rockchip_linux_defconfig.bak-nofan |
| 内核 | 6.1.141(版本未变,配置+dtb 更新) |
| 固件 | ~/EX_DISK_2T/tspi-1f-linux-sdk/extracted_sdk/output/update/Image/update.img |
| 固件 SHA-256 | c54f89d7859e9d6b0952e161637cb327cc6e793ba60cf5c8b5d99dc7fd68fa28 |
| 编译日志 | extracted_sdk/repack_fan.log(updateimg 打包) |
7. 后续可选项(未做)
将风扇控制纳入开机自检/状态上报(robotd 侧),异常(占空比与温度不匹配)告警
如需 1M 板同样支持,可把相同 dts/defconfig 改动移植到 1M SDK(
tspi-1m-linux-kernel6-1-sdk),需先确认 1M 硬件风扇接的 PWM 编号


评论