基于linux-3.14.16
设备模型(LDM)包括,总线、驱动、设备
一、总线及其api
1、注册一个总线
以i2c总线为例,下面基本表现出了注册一个总线的过程。
1、定义一个总线bus_type,填充几个回调
2、调用bus_register注册总线
二、驱动及其api
1、注册驱动的过程
driver_register注册一个总线驱动
总线驱动加入总线
这个应该是跟热插拔事件有关
1)bus_add_driver
下面我们看下,总线驱动是怎么加入到总线的,以及要做的一些处理
如果没有总线,直接返回,不处理总线相关的
以下为是总线驱动的处理,先分配一个驱动的私有数据,可以理解为总线驱动的组合对象
将总线驱动加入到总线的驱动列表,并处理总线上的设备匹配
后面看看driver_attach是怎么做的总线匹配的
1)driver_attach
bus_for_each_dev是对每个总线上设备去执行回调处理,直接看回调__driver_attach干了什么
首先去是调用总线设置的match回调函数,处理总线设备和驱动,看是否匹配
调用了really_probe,看really_probe做了什么,如果bus有probe,执行,否则执行总线驱动的probe
这里我们了解了总线驱动的注册过程,一般我们在自定义总线的时候,会封装一个注册总线驱动的接口,这个接口最终会调用driver_register
二、设备及其api
1、注册设备的过程
最终调用device_add,看看device_add干了什么
添加设备对象到驱动模型
总线设备的一些处理,设备如果属于某个总线,将会做这些处理,
1、将设备加到总线的设备链表,创建一些文件
2、产生热插拔事件
3、检查执行probe,表面是probe,但里面做了一些工作,具体分析
1、总线设备的匹配工作bus_probe_device
如果设备属于某个总线,将会执行bus_probe_device
没有bus,直接返回了
2、device_attach
如果设备没有匹配的驱动,就遍历总线的驱动链表,执行回调__device_attach
我们看看 __device_attach做了什么
匹配成功了就接着执行probe,否则跳过这个驱动
可以看到,匹配最终是调用总线的match回调函数完成的
probe最终会调用到really_probe,最终会调用总线的probe或者驱动的probe,之前我们在总线驱动那一节分析过。
同样的,我们在自定义总线的时候,一般实现注册总线设备的接口,这个接口最终也会调用到device_register来实现设备添加。总线设备也会在device上面做扩展。
参考i2c总线,以助理解,总线、驱动和设备的关系