驱动模型:hwmon_ops 与 Legacy 接口

驱动模型:hwmon_ops 与 Legacy 接口

1. 现代模型

1
2
3
4
5
6
7
8
9
10
11
12
static const struct hwmon_ops ops = {
.is_visible = chip_is_visible,
.read = chip_read,
.read_string = chip_read_string,
.write = chip_write,
};

static const struct hwmon_channel_info *info[] = {
HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_MAX),
NULL
};

hwmon_chip_info 关联 opsinfo

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
2
3
HWMON_CHANNEL_INFO(temp,
HWMON_T_INPUT | HWMON_T_MAX,
HWMON_T_INPUT)

表示两个温度 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_grouphwmon_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. 迁移建议

  1. 列出 legacy sysfs attrs;
  2. 映射到 sensor type/attr;
  3. 构造 channel config;
  4. 将 show/store 改为 read/write;
  5. is_visible 表达 variant;
  6. 保留真正非标准的 extra group;
  7. 对照 sysfs-interface.rst 检查单位;
  8. 测试 libsensors 兼容。

文章互动

阅读 --

留言

0 条留言

正在加载留言…