风扇转速、PWM 与热管理

风扇转速、PWM 与热管理

1. 驱动

  • pwm-fan.c:PWM 输出 + 可选 tach;
  • gpio-fan.c:离散 GPIO 档位;
  • EMC/MAX/NCT 等外部 fan controller;
  • SoC PWM/tacho controller。

2. RK3588 pwm-fan

本树多个 RK3588 EVB/vehicle/toybrick DTS 有:

1
2
3
4
5
6
fan: pwm-fan {
compatible = "pwm-fan";
#cooling-cells = <2>;
pwms = <&pwm3 0 50000 0>;
cooling-levels = <0 50 100 150 200 255>;
};

厂商树还支持 rockchip,temp-trips notifier 路径。

3. Probe

1
2
3
4
5
6
7
8
9
10
11
pwm_fan_probe()
-> devm_pwm_get()
-> optional fan regulator
-> initialize max PWM
-> enumerate tach IRQs
-> request pulse IRQ
-> timer for RPM sampling
-> build PWM + optional FAN channel info
-> devm_hwmon_device_register_with_info("pwmfan")
-> parse cooling-levels
-> register Rockchip notifier or thermal cooling device

4. HWMON

  • pwm1:0..255 duty command;
  • pwm1_enable:enable mode;
  • fanN_input:RPM(仅有 tach IRQ 时)。

没有 tach 输入时仍有 PWM control,但无法证明风扇真的转动。

5. RPM

tach IRQ累积脉冲,定时器按采样窗口计算:

1
RPM = pulses * 60 / (sample_seconds * pulses_per_revolution)

pulses-per-revolution 默认通常为 2,必须匹配风扇规格。

6. PWM

driver把 0..255 转为 duty cycle:

1
duty = pwm * (period - 1) / 255

低 duty 可能无法克服启动转矩。实际曲线常需要:

  • kick-start;
  • 最低稳定 duty;
  • hysteresis;
  • spin-up delay;
  • stall detection。

7. Cooling device

cooling-levels[] 将 thermal state 映射到 PWM。Thermal governor选择 state,driver调用 set_pwm()。这与用户直接写 pwm1 存在控制权冲突,生产系统应明确由谁控制。

8. Rockchip notifier

如果启用 ROCKCHIP_SYSTEM_MONITOR 且 DT 有 rockchip,temp-trips,本厂商驱动注册 notifier并直接按温度映射 state,然后提前返回,不再注册通用 OF cooling device。调试时必须识别实际走哪条控制路径。

9. 配置事实

公共主 defconfig未显式写 SENSORS_PWM_FANrk3588_edge.config 明确设置 CONFIG_SENSORS_PWM_FAN=y。DTS 有 fan 节点不代表最终内核一定能 probe。

10. 排查

1
2
3
4
5
6
cat /sys/class/hwmon/hwmon*/name
cat /sys/class/hwmon/hwmon*/pwm1
cat /sys/class/hwmon/hwmon*/fan1_input
cat /sys/class/thermal/cooling_device*/type
cat /sys/class/thermal/cooling_device*/cur_state
cat /proc/interrupts

写 PWM 前确认 cooling governor/daemon 没有同时改值。

文章互动

阅读 --

留言

0 条留言

正在加载留言…