联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话: QQ:1602036736

泰山派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:

    //风扇
    &pwm6 {
        status = "okay";
        pinctrl-0 = <&pwm6_pins>;
    };

阶段 0:裸 PWM 手动控制验证(驱动接入前)

/sys/class/pwm/pwmchip0        ← PWM6(fe6e0020.pwm,npwm=1)
echo 0 > export
echo 25000 > period            ← 40kHz
echo 12500 > duty_cycle        ← 50%
echo 1 > enable                ← 风扇转动(用户确认)
echo 25000 > duty_cycle        ← 100% 全速
echo 0 > duty_cycle; echo 0 > enable   ← 停

结论: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)

 CONFIG_SENSORS_INA2XX=y
+CONFIG_SENSORS_PWM_FAN=y
 CONFIG_THERMAL=y
⚠️ 关键坑:光改 dtb 不够!RK 默认 defconfig 是 # CONFIG_SENSORS_PWM_FAN is not set,驱动没编进内核,dtb 里有节点也不会有 hwmon。必须开配置重编内核。

2.3 编译与打包

# 容器内(tspi-1f-sdk-build,与 1M 编译环境一致)
./build.sh kernel-6.1        # 编译内核 + dtb + boot.img
# 验证产物
grep CONFIG_SENSORS_PWM_FAN kernel-6.1/.config   # =y
ls kernel-6.1/drivers/hwmon/pwm-fan.o            # 驱动已编入
fdtdump kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dtb | grep -A15 pwm-fan   # 节点在
# 重打包固件(rootfs 不变,只更新 boot)
./build.sh updateimg

3. 踩坑记录

#现象根因解决
1dtc: tspi-rk3566-user-v10-linux.dts:333.7-14 syntax error1F dts 顶层全是 &xxx {} 引用,直接裸插 fan0: pwm-fan {} 不合法用 / { fan0: pwm-fan {...}; }; 重新打开根节点追加
2dtb 有节点但板端无 hwmonCONFIG_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 驱动加载确认

# hwmon 出现 pwmfan
ls /sys/class/hwmon/hwmon2/
# name=pwmfan  device->platform/pwm-fan  of_node=/pwm-fan  pwm1_enable=1

# 平台驱动绑定
ls /sys/bus/platform/drivers/pwm-fan/pwm-fan

4.2 温度联动实测(stress-ng 满载)

stress-ng --cpu 4 --cpu-method matrixprod --timeout 120s &
# 监控(每 5s)
cat /sys/class/thermal/thermal_zone0/temp
cat /sys/class/hwmon/hwmon2/pwm1

实测曲线:

温度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°C200 → 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. 文件与产物登记

项路径/值
修改的 dtskernel-6.1/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts
dts 备份同目录 tspi-rk3566-user-v10-linux.dts.bak-nofan
修改的 defconfigkernel-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-256c54f89d7859e9d6b0952e161637cb327cc6e793ba60cf5c8b5d99dc7fd68fa28
编译日志extracted_sdk/repack_fan.log(updateimg 打包)

7. 后续可选项(未做)

  • 将风扇控制纳入开机自检/状态上报(robotd 侧),异常(占空比与温度不匹配)告警

  • 如需 1M 板同样支持,可把相同 dts/defconfig 改动移植到 1M SDK(tspi-1m-linux-kernel6-1-sdk),需先确认 1M 硬件风扇接的 PWM 编号

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册