在 Linux i2c 驱动程序中进行芯片特定初始化的正确函数是什么
What is the right function to have chip specific initialization in Linux i2c drivers
我正在尝试初始化 ADT746x 芯片的状态寄存器。 Linux内核有这个芯片的hwmon驱动,但是没有配置。
我需要在设备准备好通过 sys fs 接受 i2c 命令后立即初始化几组寄存器。这些寄存器将温度和电压传感器配置为有效并将它们标记为监视。
这个初始化代码的正确位置是什么? probe() 或 detect() 或用户空间中的其他任何地方?
vanilla 内核中该系列传感器的驱动程序很少,即 drivers/hwmon/adt7462.c(在内核 documentation), drivers/hwmon/ln85.c (in kernel documentation), drivers/hwmon/lm90.c (in kernel documentation 中)和 drivers/macintosh/therm_adt746x.c.
它们都有对应的sysfs接口:hwmon是通用接口,Macintosh驱动是专用接口。
要实现您的要求,可以选择以下选项:
- 黑名单模块(如果它们是自动加载的)并通过脚本加载它们,该脚本将通过 sysfs 接口应用必要的参数
- 通过硬编码必要的调用来破解驱动程序。
对于第二种变体,最好的选择是将代码放在 ->probe()
回调中。对于 hwmon 驱动程序,在调用 hwmon_device_register()
之前这样做是有意义的,因为最后一个将公开用户 space 可能立即使用的 sysfs 属性。
->detect()
专用于允许 I²C 核心检查驱动程序是否在总线上看到任何受支持的设备。在这个阶段,不知道有问题的设备是否已连接。即使在检测之后,也可能会遗漏一些强制性的初始化步骤,因此不建议在该阶段与设备通信。
我正在尝试初始化 ADT746x 芯片的状态寄存器。 Linux内核有这个芯片的hwmon驱动,但是没有配置。
我需要在设备准备好通过 sys fs 接受 i2c 命令后立即初始化几组寄存器。这些寄存器将温度和电压传感器配置为有效并将它们标记为监视。
这个初始化代码的正确位置是什么? probe() 或 detect() 或用户空间中的其他任何地方?
vanilla 内核中该系列传感器的驱动程序很少,即 drivers/hwmon/adt7462.c(在内核 documentation), drivers/hwmon/ln85.c (in kernel documentation), drivers/hwmon/lm90.c (in kernel documentation 中)和 drivers/macintosh/therm_adt746x.c.
它们都有对应的sysfs接口:hwmon是通用接口,Macintosh驱动是专用接口。
要实现您的要求,可以选择以下选项:
- 黑名单模块(如果它们是自动加载的)并通过脚本加载它们,该脚本将通过 sysfs 接口应用必要的参数
- 通过硬编码必要的调用来破解驱动程序。
对于第二种变体,最好的选择是将代码放在 ->probe()
回调中。对于 hwmon 驱动程序,在调用 hwmon_device_register()
之前这样做是有意义的,因为最后一个将公开用户 space 可能立即使用的 sysfs 属性。
->detect()
专用于允许 I²C 核心检查驱动程序是否在总线上看到任何受支持的设备。在这个阶段,不知道有问题的设备是否已连接。即使在检测之后,也可能会遗漏一些强制性的初始化步骤,因此不建议在该阶段与设备通信。