PWM-FAN
1. 功能描述
PWM 风扇通过调节 PWM 占空比控制转速。占空比越高,转速越快。以最高转速 10000 rpm 的风扇为例,50% 占空比对应约 5000 rpm。
PWM 风扇通常为 4 线制,需要将风扇的 PWM 控制信号连接到板卡 PWM 输出端。MTT E300 平台通过 pwm-fan 驱动提供风扇控制能力,并可作为 Linux thermal 框架中的 cooling device 参与温度控制。
2. DTS 参数配置
修改 /linux-mthreads/arch/arm64/boot/dts/m1000/m1000-aimodule.dtsi 中对应的风扇节点参数:

2.1 关键参数说明
| 参数 | 说明 |
|---|---|
compatible | 风扇驱动匹配字段,使用 pwm-fan。如果客户板上没有对应风扇,可删除该字段或对应节点,使系统不加载 pwm-fan 驱动。 |
pwms | 指定风扇使用的 PWM 控制器、通道、周期和极性等信息。 |
cooling-levels | 风扇 cooling state 与 PWM 占空比等级的对应关系,取值范围为 0-255。 |
#cooling-cells | thermal cooling device 使用的参数个数,通常配置为 <2>。 |
pulses-per-revolution | 可选参数,用于转速计数,表示风扇每转一圈产生的脉冲数;未配置时默认按 2 处理。 |
fan-supply | 可选参数,用于配置风扇供电 regulator。 |
2.2 转速与 PWM 等级
cooling-levels 中的值是 PWM 等级,最大值为 255。thermal 框架会根据当前 cooling state 选择对应的 PWM 等级。
如果板级配置中同时维护转速表和 PWM 表,可按如下关系理解:
speed-rpm-table = (1 - speed-pwm-table / 256) * 最大转速
以最大转速 10000 rpm 为例,PWM 占空比约 50% 时,对应转速约 5000 rpm。
3. Entry Table 配置
打开 m1000-entry-table-tool/product/table 中对应板子的 xlsx 文件:

其中:
| 字段 | 说明 |
|---|---|
fan_pwm_duty | 风扇 PWM 占空比配置。 |
fan_pwm_freq | 风扇 PWM 频率配置。 |
对于 M2014 等板卡,风扇控制信号为 5 V,PWM 频率建议配置在 25 kHz-30 kHz 范围内,以避免噪音问题。
4. 温度控制
通过 thermal zone 中的 cooling-map 配置,可以将不同温度阈值映射到不同的风扇级别,从而实现随温度动态调速。

例如,pvt-critical 中配置:
cooling-device = <&fan 6 6>;
表示进入该温度控制区间时,将风扇 cooling state 设置为 6。如果 state 6 对应的转速为 10000 rpm,则风扇会以 10000 rpm 运行。
5. 系统接口
5.1 查询风扇设备
pwm-fan 驱动注册到 hwmon 后,设备名称为 pwmfan。可通过以下命令查找对应的 hwmon 编号:
cat /sys/class/hwmon/hwmon*/name
如果某个节点输出为 pwmfan,例如 /sys/class/hwmon/hwmon1/name,则后续 hwmon 接口使用 /sys/class/hwmon/hwmon1/。
5.2 PWM 控制接口
# 查询当前 PWM 等级,范围 0-255
cat /sys/class/hwmon/hwmon1/pwm1
# 设置 PWM 等级,范围 0-255
# 0 表示关闭风扇,255 表示最大 PWM 输出
echo 128 > /sys/class/hwmon/hwmon1/pwm1
5.3 PWM 使能模式
# 查询 PWM 使能模式
cat /sys/class/hwmon/hwmon1/pwm1_enable
# 设置 PWM 使能模式
echo 1 > /sys/class/hwmon/hwmon1/pwm1_enable
pwm1_enable 支持的取值如下:
| 取值 | 说明 |
|---|---|
0 | 关闭 PWM 风扇。 |
1 | 禁用 PWM 输出,但保持风扇供电 regulator 使能。 |
2 | 保持 PWM 输出和风扇供电 regulator 使能。 |
3 | 禁用 PWM 输出,并关闭风扇供电 regulator。 |
5.4 转速查询接口
如果 DTS 中配置了风扇转速中断输入,驱动会提供 fan1_input 接口:
# 查询风扇转速,单位 rpm
cat /sys/class/hwmon/hwmon1/fan1_input
如果系统中没有 fan1_input,说明当前板级配置没有启用风扇测速输入。
5.5 Thermal cooling device 接口
风扇也会注册为 thermal cooling device,可通过 cooling device 接口查询或设置风扇状态:
# 查询 cooling device 名称
cat /sys/class/thermal/cooling_device*/type
# 查询最大风扇级别
cat /sys/class/thermal/cooling_device0/max_state
# 查询当前风扇级别
cat /sys/class/thermal/cooling_device0/cur_state
# 设置当前风扇级别
echo 6 > /sys/class/thermal/cooling_device0/cur_state
cur_state 的取值范围为 0 到 max_state,每个 state 对应 cooling-levels 中的一个 PWM 等级。
5.6 mthreads-smi 查询
安装 mthreads-smi 工具后,也可以通过如下命令查询风扇状态:
mthreads-smi

