OpenBMC:hwmon 传感器适配
1. hwmon 的作用
hwmon 是 Linux 内核的硬件监控框架,主要用于提供:
- 温度
- 电压
- 电流
- 功率
- 能量
- 风扇转速
- PWM
- 告警状态
在 OpenBMC 中,hwmon 是内核传感器驱动和 D-Bus Sensor 之间的重要接口。
物理传感器 ↓ I2C / PMBus / ADC ↓ Linux 传感器驱动 ↓ hwmon ↓ dbus-sensors / phosphor-hwmon ↓ D-Bus Sensor2. hwmon 目录结构
驱动注册成功后,Linux 会创建:
/sys/class/hwmon/hwmon0 /sys/class/hwmon/hwmon1目录中可能包含:
name temp1_input temp1_max temp1_crit temp1_label in1_input curr1_input power1_input fan1_input pwm1常见属性含义:
| 节点 | 含义 |
|---|---|
tempX_input | 温度 |
inX_input | 电压 |
currX_input | 电流 |
powerX_input | 功率 |
fanX_input | 风扇转速 |
pwmX | PWM 控制值 |
X_label | 通道名称 |
X_alarm | 告警状态 |
具体单位应以 Linux hwmon ABI 为准。例如,温度通常以毫摄氏度表示。
3. 设备树和驱动适配
以 I2C 温度传感器为例:
&i2c0 { status = "okay"; temperature-sensor@48 { compatible = "vendor,temp-sensor"; reg = <0x48>; }; };设备树中的compatible与驱动匹配后,内核调用probe():
创建 I2C Client ↓ 调用驱动 probe() ↓ 检查芯片和寄存器 ↓ 注册 hwmon 设备 ↓ 生成 sysfs 属性驱动应通过标准 hwmon 接口注册通道,不应自行创建语义不统一的 sysfs 文件。
4. hwmon 通道配置
一个芯片可能同时提供多个数据通道:
温度通道 1 温度通道 2 输入电压 输入电流 输入功率 风扇转速驱动需要定义:
- 通道类型
- 支持的属性
- 读取函数
- 写入函数
- 是否可见
- 数据转换方式
处理过程如下:
用户读取 temp1_input ↓ hwmon 核心调用驱动 read() ↓ 驱动读取芯片寄存器 ↓ 转换为 hwmon 标准单位 ↓ 返回用户空间单位转换应主要在驱动层完成,避免不同用户空间程序分别解释原始寄存器。
5. 接入 dbus-sensors
使用 entity-manager 和 dbus-sensors 时,需要提供传感器配置:
{ "Name": "Board Temp", "Type": "TemperatureSensor", "Bus": 3, "Address": 72 }运行流程为:
entity-manager 发布 Configuration ↓ dbus-sensors 获取配置 ↓ 根据 Bus、Address 和设备路径匹配 hwmon ↓ 读取 tempX_input ↓ 创建 D-Bus Sensor.Value最终对象可能为:
/xyz/openbmc_project/sensors/temperature/Board_Temphwmon 编号可能随驱动加载顺序变化,因此不应固定依赖hwmon0。匹配时通常需要结合 I2C 设备路径、地址、驱动名称和通道标签。
6. 阈值与数据转换
传感器阈值可以来自:
- hwmon 芯片寄存器
- entity-manager 配置
- 平台策略
- 用户运行时设置
D-Bus 中常见阈值接口为:
xyz.openbmc_project.Sensor.Threshold.Warning xyz.openbmc_project.Sensor.Threshold.Critical数据转换链路为:
芯片原始寄存器 ↓ 内核驱动转换为 hwmon 单位 ↓ dbus-sensors 执行必要缩放 ↓ D-Bus 标准单位 ↓ Redfish Reading应明确每一层的单位,避免重复放大或缩小。
7. 完整适配流程
1. 确认硬件接口和设备地址 2. 启用 I2C、PMBus 或 ADC 控制器 3. 添加设备树节点 4. 启用或编写 Linux 驱动 5. 注册标准 hwmon 通道 6. 添加 entity-manager 配置 7. 启用对应 Sensor 服务 8. 创建 D-Bus Sensor 对象 9. 由 Redfish、IPMI 和风扇控制使用8. 总结
hwmon 负责在 Linux 内核中统一传感器接口,OpenBMC 用户空间再将这些数据转换为 D-Bus Sensor。
硬件 → 驱动 → hwmon → dbus-sensors → D-Bus → Redfish / IPMI / WebUI适配过程中最重要的是使用标准 hwmon ABI、保持单位一致,并建立稳定的硬件通道与 D-Bus Sensor 映射关系。