hwmon

概述

hwmon,hardware monitor是linux内核中的一个子系统,用于提供对硬件设备,如温度传感器,电压监控器,风扇速度等的监控支持。该子系统允许用户通过标准的接口读取和控制硬件状态。尤其是温度,电压,风扇转速等。提供了统一的方式访问硬件监测信息。

hwmon子系统架构

在hwmon子系统中,主要即借助设备驱动模型中的设备的注册以及设备属性的创建,即可针对于一个硬件芯片创建多个属性文件。

image-20250518223927953

hwmon子系统主要提供了接口hwmon_attr_show、hwmon_attr_store,同时抽象了针对温度芯片、风扇芯片、电源芯片等硬件监控芯片相关参数的支持,即温度芯片、风扇芯片、电源芯片等硬件监控芯片相关参数的访问接口,均会在接口hwmon_attr_show、hwmon_attr_store中被统一调用,而温度芯片、风扇芯片、电源芯片等硬件监控芯片只需要实现hwmon_ops类型函数指针即可。调用关系如下所示,其中,HWMON子系统层则为hwmon子层抽象的部分,而最下层则由具体的hwmon 设备驱动实现即可。

image-20250518224026075

硬件检测

1
devm_hwmon_device_register_with_groups(dev, "my_hwmon", NULL, my_temp_attr);

数据读取/设置

1
2
3
4
5
6
7
8
9
10
11
sensor_device_attribute

struct sensor_device_attribute my_temp_attr[] = {
SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, temp_show, NULL, 0), // 读操作
SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, temp_show, temp_store, 1), // 读写操作
SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, temp_alarm_show, NULL, 1), // 只读报警
SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, temp_show, temp_store, 2), // 读写操作
SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, temp_alarm_show, NULL, 2), // 只读报警
};

每个 sensor_device_attribute 结构体都需要对应一个 show 和可选的 store 函数。show 函数用于读取硬件传感器的数据,而 store 函数则用于设置硬件的相关参数。

数据暴露

sys/class/hwmon下暴露。

1
2
cat /sys/class/hwmon/hwmon0/temp1_input   # 获取温度
cat /sys/class/hwmon/hwmon0/fan1_input # 获取风扇转速

驱动卸载

1
void hwmon_device_unregister(struct device *dev);