更改I2C地址Linux驱动程序内核

时间:2016-01-18 08:51:42

标签: c linux-kernel linux-device-driver i2c

我的系统使用带有两个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 };

1 个答案:

答案 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结构的detecti2c_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

     
    

i2c_register_driver()

         
      

__process_new_adapter()

             
        

i2c_do_add_adapter()

                 
          使用lm75_detect()

调用

i2c_detect()         

      
    
  

lm75.c函数包含特定于设备的逻辑,用于确定当前i2c总线上检测到的i2c设备是否应由当前驱动程序处理(在本例中为detect)。

  

对于自动设备检测,必须同时定义address_listclass。还应设置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) 字段。