zoukankan      html  css  js  c++  java
  • Linux i2c子系统(三) _解决probe无法执行

    如果你也遇到了填充了id_match_table,compitible怎么看都一样,但probe就是不执行(让我哭一会),你可以回头看一下上一篇的模板,我们这里虽然使用的是设备树匹配,但和platform的设备树匹配只填充i2c_match_table不同,i2c_driver的设备树匹配需要同时填充i2c_match_table和id_table两个域,虽然后者是个空。如果你没有填充后面的成员,不妨试一下我的这种写法,我敢打赌你的probe也没有执行-
    问题是明确的,探索是漫长的,但是至少答案一定在源码中,也一定出在匹配的源码中,带着这样的思路,我从"i2c_add_driver"开始一路狂追,结论是使用设备树的话,只要id_match_table,不需要id_table!, 下面的i2c_device_match即可看出。

    i2c_add_driver()
               └── i2c_register_driver
                          └── driver_register
                                     ├── driver_find
                                     │   ├── kset_find_obj
                                     │   ├── kobject_put
                                     │   └── to_driver
                                     └── bus_add_driver
                                                └── driver_attach
                                                           └── bus_for_each_dev
                                                                      ├── next_device
                                                                      └── __driver_attach
                                                                                 └─ driver_match_device
                                                                                            └── i2c_device_match
                                                                                                       ├── acpi_driver_match_device
                                                                                                       ├── i2c_match_id
                                                                                                       └── of_driver_match_device
                                                                                                       └── of_match_device
                                                                                                                  └── of_match_node
                                                                                                                             └── __of_match_node
                                                                                                                                        └── __of_device_is_compatible

    /home/jiang/Pictures/Selection_20170224_001.png
    ![Selection_20170224_001.png-6.4kB][1]

    //3.14.0/drivers/i2c/i2c-core.c
      78 static int i2c_device_match(struct device *dev, struct device_driver *drv)
      79 {
      80         struct i2c_client       *client = i2c_verify_client(dev);
      81         struct i2c_driver       *driver;
      82 
      83         if (!client)
      84                 return 0;
      85 
      86         /* Attempt an OF style match */
      87         if (of_driver_match_device(dev, drv))
      88                 return 1;
      89 
      90         /* Then ACPI style match */
      91         if (acpi_driver_match_device(dev, drv))
      92                 return 1;
      93 
      94         driver = to_i2c_driver(drv);
      95         /* match on an id table if there is one */
      96         if (driver->id_table)              
      97                 return i2c_match_id(driver->id_table, client) != NULL;
      98 
      99         return 0;
     100 }
    
    

    从i2c_device_match的定义可以看出, 和platform总线一样, i2c的match函数也是优先选择设备树, 如果设备树已经匹配了, 函数就会返回, 不会再最平台文件的设备信息进行判断, 即不会理会id_table的值, 确保匹配是一定不需要id_table了,而事实上probe确实没有执行,那么问题就可能出现在probe的回调过程了,和所有的总线设备一样,回调probe的过程始于driver_match_id,于是又是一路狂追,终于在i2c_device_probe()中找到了我臆想中的对id_table的检测

    下面是我追的源码树,大家可以验证一下

    i2c_add_driver()
               └── i2c_register_driver
                          └── driver_register
                                     ├── driver_find
                                     │   ├── kset_find_obj
                                     │   ├── kobject_put
                                     │   └── to_driver
                                     └── bus_add_driver
                                                └── driver_attach
                                                           └── bus_for_each_dev
                                                                      ├── next_device
                                                                      └── __driver_attach
                                                                                 ├── driver_match_device
                                                                                 └── driver_probe_device
                                                                                            └── really_probe
                                                                                                       └── i2c_device_probe
                                                                                                                  └── i2c_match_id

    所以,结论是:即使使用设备树来匹配,也要对id_table进行有效的赋值,否则probe不会被回调!!!如果你也遇到了这个问题, 可以试试在驱动中定义一个空数组, 将其赋值给id_table-

  • 相关阅读:
    javascript获得浏览器工作区域的大小
    javascript禁止输入数字
    Extjs之遍历Store内的数据
    Extjs之rowEditing编辑状态时列不对齐
    Extjs中numberfield小数位数设置
    【转】vscode常用快捷键整理
    【转】如何提高WEB的性能?
    【转】echarts 使用示例
    uni-app页面配置和跳转
    【转】.NetCore如何将特性和依赖注入有效结合
  • 原文地址:https://www.cnblogs.com/xiaojiang1025/p/6501956.html
Copyright © 2011-2022 走看看