驱动模型:hwmon_ops 与 Legacy 接口
1. 现代模型
1 | static const struct hwmon_ops ops = { |
hwmon_chip_info 关联 ops 和 info。
2. 回调
is_visible
1 | is_visible(drvdata, type, attr, channel) -> umode_t |
根据芯片 variant/channel/只读状态决定属性是否生成。
read
1 | read(dev, type, attr, channel, long *val) |
返回 0 或负 errno,值必须换算到 HWMON ABI 单位。
read_string
用于 label 等字符串;返回指向生命周期足够长的字符串。
write
解析已由 Core 完成,driver验证并写寄存器。
3. Channel config
每个 config entry 表示一个 channel 的属性位,末尾 0。宏:
1 | HWMON_CHANNEL_INFO(temp, |
表示两个温度 channel。
4. 私有数据
Core把 drvdata 设置到新建 hwmon device。ops收到的是 hwmon device,通常:
1 | struct chip_data *data = dev_get_drvdata(dev); |
不能假设 dev 是原 I2C client;parent 才是物理设备。
5. Extra groups
仅为硬件独有、无法标准化的属性使用。若已有标准 HWMON attribute,应优先标准 ABI,避免用户工具不识别。
6. Legacy
旧驱动使用:
SENSOR_DEVICE_ATTR;SENSOR_DEVICE_ATTR_2;sysfs_create_group或hwmon_device_register_with_groups;- 自己实现 show/store;
hwmon_device_register()。
这类驱动仍可工作,但容易出现命名、单位和权限不一致;新驱动应使用 with_info。
7. Detection
老式 I2C hwmon driver常有 detect/address list,服务不可枚举 SMBus 设备。Device Tree 系统应优先显式节点,避免 sensors-detect 或强制 probe 误访问未知地址。
8. 名称
name 应稳定、简短,不含 -、* 和空白。Core只警告非法字符,并不自动修复普通注册调用;可使用 devm_hwmon_sanitize_name() 处理设备名来源。
9. 迁移建议
- 列出 legacy sysfs attrs;
- 映射到 sensor type/attr;
- 构造 channel config;
- 将 show/store 改为 read/write;
- 用
is_visible表达 variant; - 保留真正非标准的 extra group;
- 对照
sysfs-interface.rst检查单位; - 测试 libsensors 兼容。
正在加载留言…