Linux 系统 PWM 风扇驱动框架学习记录
一、前言
最近在折腾嵌入式平台的驱动框架学习,在遇到 pwm-fan 风扇驱动时,发现不只是 PWM 控制占空比那么简单,还涉及到 thermal 子系统的温度监控以及 hwmon 子系统的硬件控制。
内核源码的文档下,也有风扇驱动的介绍:
二、三者的关系
PWM 是底层的硬件控制接口,直接控制风扇的转速。
hwmon 提供了对 PWM 和风扇转速的访问接口,同时还可以监控其他硬件传感器(如温度)。
thermal 是更高层的热管理框架,负责根据温度数据自动调整冷却设备(如风扇)的状态。
温度监控:
Thermal 子系统通过温度传感器(如 coretemp)读取温度数据。温度数据通过 thermal_zoneX/temp 暴露给用户空间。
温度控制:
当温度超过预设的触发点(trip_point_X_temp)时,Thermal 子系统会触发冷却行为。Thermal 子系统通过 hwmon 接口调整风扇的 PWM 信号(pwm1)来控制风扇速度。
风扇控制:
hwmon 接口通过 PWM 信号直接控制风扇的转速。用户也可以通过 hwmon 接口手动设置风扇速度。
职责分离:
PWM 接口专注于硬件控制。
hwmon 接口专注于硬件监控和控制。
thermal 接口专注于热管理策略。
三、风扇控制
pwm 接口
例如:
/sys/class/pwm/pwmchip0/
如果是使用通用风扇驱动 pwm-fan,通常无法 export 风扇的pwm,因为已经被驱动申请。如果想通过 pwm 接口来控制,需要将设备树的 compatible 属性修改,或者新编写一个 pwm 的驱动,这样就可以拥有该 GPIO 的控制权。
hwmon 接口
这里可以看我另一篇博客:
香橙派Linux系统手动调节PWM风扇转速_linux主板风扇控制-CSDN博客https://blog.csdn.net/plmm__/article/details/144697337?spm=1001.2014.3001.5502
thermal 接口
路径为:
/sys/class/thermal
可以看到冷却设备和温度设备:
每个接口内部的 type ,如果输出是 Processor
,则表示这是一个 CPU 频率调节设备,而不是风扇。如果输出是 pwm-fan 或 fan,则表示这是一个风扇设备。
cat /sys/class/thermal/cooling_device0/type
我的设备没有 pwm-fan 或 fan,硬件可能没有通过标准接口(如 PWM 或 hwmon)暴露风扇控制功能。如果有,则可以通过对 cur_state 写入挡位来控制,需要 sudo 权限。
可以通过 max_state 查看挡位最大值。