我的系统使用带有两个I2C地址(0x48和0x49)的模块传感器LM75。我想取消一个地址(0x48),但我不知道它的初始化位置。
normal_i2c中的所有更改都不相关....
/* Addresses scanned */
static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c,
0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
答案 0 :(得分:3)
驱动程序lm75.c
将内核注册为具有normal_i2c
数组中列出的任何7位地址的所有i2c设备的处理程序。
/* Addresses scanned */
static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c,
0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
接下来,数组 pointed to by struct lm75_driver
(类型为i2c_driver
)
.address_list = normal_i2c,
另请注意,class
结构的detect
和i2c_driver
成员已正确初始化
.class = I2C_CLASS_HWMON,
.detect = lm75_detect,
.class
列出了.detect
的各种选项。module_i2c_driver(lm75_driver);
是一个函数,只要初始化新的i2c-bus或i2c-driver就会调用它。当驱动程序向Linux内核注册here时(带有与此驱动程序关联的i2c地址列表)。
driver->detect()
在运行时,接下来发生的事情总结在以下调用图中:
this
i2c_driver
struct is passed on to the Linux kernel使用lm75_detect()
调用
lm75.c
函数包含特定于设备的逻辑,用于确定当前i2c总线上检测到的i2c设备是否应由当前驱动程序处理(在本例中为detect
)。
对于自动设备检测,必须同时定义
address_list
和class
。还应设置i2c_board_info
,否则将创建仅强制使用模块参数的设备。检测功能必须至少填写成功检测时传递的
flags
结构的名称字段,还可能填充CHWC.VLV <- seq(14, 16, length.out=10000) outcome <- ifelse(CHWC.VLV >= 14.97, ifelse(CHWC.VLV <= 15.34, 1, 2), 3)
字段。