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-
Linux i2c子系统(三) _解决probe无法执行的更多相关文章
- Linux i2c子系统(一) _动手写一个i2c设备驱动
i2c总线是一种十分常见的板级总线,本文以linux3.14.0为参考, 讨论Linux中的i2c驱动模型并利用这个模型写一个mpu6050的驱动, 最后在应用层将mpu6050中的原始数据读取出来 ...
- Linux i2c子系统(四) _从i2c-s3c24xx.c看i2c控制器驱动的编写
"./drivers/i2c/busses/i2c-s3c2410.c"是3.14.0内核中三星SoC的i2c控制器驱动程序, 本文试图通过对这个程序的分析, 剥离繁复的细节, 总 ...
- Linux i2c子系统(二) _通过i2c-dev.c访问设备的方法
另外一种驱动 应用层除了使用上述的使用i2c_driver接口来访问i2c设备,Linux内核还提供了一种简单粗暴的方式--直接通过虚拟i2c设备驱动的方式,即上一篇中的i2c-dev提供的方式,这种 ...
- Linux usb子系统(一) _写一个usb鼠标驱动
USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...
- Linux输入子系统(一) _驱动编码
输入设备都有共性:中断驱动+字符IO,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主设备号13,同时输入子系 ...
- Linux时间子系统(三) 用户空间接口函数
一.前言 从应用程序的角度看,内核需要提供的和时间相关的服务有三种: 1.和系统时间相关的服务.例如,在向数据库写入一条记录的时候,需要记录操作时间(何年何月何日何时). 2.让进程睡眠一段时间 3. ...
- Smart210学习记录-----Linux i2c驱动
一:Linux i2c子系统简介: 1.Linux 的 I2C 体系结构分为 3 个组成部分: (1) I2C 核心. I2C 核心提供了 I2C 总线驱动和设备驱动的注册.注销方法,I2C 通信方法 ...
- Linux I2C设备驱动编写(二)
在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_driver.i2c_client.三者的关系也在上一节进行了描述.应该已经算是对Linux I2C子系统有了初步 ...
- 【转】Linux I2C设备驱动编写(二)
原文网址:http://www.cnblogs.com/biglucky/p/4059582.html 在(一)中简述了Linux I2C子系统的三个主要成员i2c_adapter.i2c_drive ...
随机推荐
- wukong搜索引擎源码解读
转自:https://ayende.com/blog/171745/code-reading-wukong-full-text-search-engine I like reading code, a ...
- 【BZOJ 3926】【ZJOI 2015】诸神眷顾的幻想乡
http://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机的例题,感觉广义后缀自动机好恶心... 广义后缀自动机是对一个trie建立的后缀 ...
- 开篇 Android系统的体系结构
1.APPLICATIONS (应用程序层) 2.APPLICATION FRAMEWORK(应用程序框架) android应用程序提供了大量应用程序供开发者使用,当我看开发android应用程序时 ...
- PHP中目录解析函数
dirname(string path):给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名. 斜线(/)和反斜线(\)都可以用作目录分隔符.在其它环境下是斜线(/). dir ...
- 基于ASIO的协程与网络编程
协程 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态.协程可以在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行. 协程 ...
- IM比较SipDroid/IMSDroid/CSipsimple/Linphone/Webrtc
一) sipdroid1)架构sip协议栈使用JAVA实现,音频Codec使用skype的silk(Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器 ...
- 设计模式之单一职责原则(SRP)
自己之前写过一些关于设计模式的博客,但是大部分都写得比较匆忙.现在正好趁年前有时间,笔者打算好好地整理一下自己这块知识结构.开篇的第一个原则就是设计原则里面最简单的一个原则--单一职责原则. 想必大家 ...
- [原创]Hadoop-2.5.2-HA原文译
使用the Quorum Journal Manager实现HDFS高可用 2017/1/22 11:57:22 原文 目的(Purpose) * 这个指南提供了对HDFS-HA特性,使用QJM特性如 ...
- SDWebImage源码解读之分类
第十一篇 前言 我们知道SDWebImageManager是用来管理图片下载的,但我们平时的开发更多的是使用UIImageView和UIButton这两个控件显示图片. 按照正常的想法,我们只需要在他 ...
- 深圳尚学堂:Java中Class对象
Java中生成Class对象和生成instance都有多种方式.所以只有弄清其中的原理,才可以深入理解.首先要生成Class对象,然后再生成Instance.那Class对象的生成方式有哪些呢,以及其 ...
