关于i2c_register_board_info()函数

origin: https://blog.csdn.net/mcgrady_tracy/article/details/51288138

2016年04月30日 22:13:14

阅读数:5817

i2c_register_board_info()函数用于往__i2c_board_list这条链表添加一条i2c设备信息,在i2c adapter注册的时候,会扫描__i2c_board_list链表,然后调用i2c_new_device()函数来注册i2c设备,注意,要先于i2c adapter注册之前就添加好i2c设备信息,否则会出现调用了i2c_register_board_info()函数,而设备不能注册的情况。

i2c_register_board_info()函数如下:

 
  1. int __init

  2. i2c_register_board_info(int busnum,

  3. struct i2c_board_info const *info, unsigned len)

  4. {

  5. int status;

  6.  
  7. down_write(&__i2c_board_lock);

  8.  
  9. /* dynamic bus numbers will be assigned after the last static one */

  10. if (busnum >= __i2c_first_dynamic_bus_num)

  11. __i2c_first_dynamic_bus_num = busnum + 1;

  12.  
  13. for (status = 0; len; len--, info++) {

  14. struct i2c_devinfo *devinfo;

  15.  
  16. devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL);

  17. if (!devinfo) {

  18. pr_debug("i2c-core: can't register boardinfo!\n");

  19. status = -ENOMEM;

  20. break;

  21. }

  22.  
  23. devinfo->busnum = busnum;

  24. devinfo->board_info = *info;

  25. list_add_tail(&devinfo->list, &__i2c_board_list);

  26. }

  27.  
  28. up_write(&__i2c_board_lock);

  29.  
  30. return status;

  31. }

注册i2c总线流程如下:
i2c_add_numbered_adapter()->i2c_register_adapter()

在i2c_register_adapter()函数中调用了i2c_scan_static_board_info()函数,代码如下:

 
  1. static void i2c_scan_static_board_info(struct i2c_adapter *adapter)

  2. {

  3. struct i2c_devinfo *devinfo;

  4.  
  5. down_read(&__i2c_board_lock);

  6. list_for_each_entry(devinfo, &__i2c_board_list, list) {

  7. if (devinfo->busnum == adapter->nr

  8. && !i2c_new_device(adapter,

  9. &devinfo->board_info))

  10. dev_err(&adapter->dev,

  11. "Can't create device at 0x%02x\n",

  12. devinfo->board_info.addr);

  13. }

  14. up_read(&__i2c_board_lock);

  15. }

i2c_scan_static_board_info()函数先扫描__i2c_board_list,然后调用i2c_new_device()函数来注册i2c设备。这就是静态注册i2c设备的方法,一般在板级的初始化函数中调用i2c_register_board_info()函数来完成i2c设备信息的添加。

除了这种方法外,Linux还提供了另外的方法来注册i2c设备。例如:

 
  1. static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };

  2.  
  3. static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev)

  4. {

  5. (...)

  6. struct i2c_adapter *i2c_adap;

  7. struct i2c_board_info i2c_info;

  8.  
  9. (...)

  10. i2c_adap = i2c_get_adapter(2);

  11. memset(&i2c_info, 0, sizeof(struct i2c_board_info));

  12. strlcpy(i2c_info.name, "isp1301_pnx", I2C_NAME_SIZE);

  13. isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info,

  14. normal_i2c);

  15. i2c_put_adapter(i2c_adap);

  16. (...)

  17. }

来自Documentation/i2c/instantiating-devices。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mcgrady_tracy/article/details/51288138

猜你喜欢

转载自blog.csdn.net/yazhouren/article/details/81841965
I2C