基于linux-3.14.16
设备模型(LDM)包括,总线、驱动、设备
一、总线及其api
1、注册一个总线
以i2c总线为例,下面基本表现出了注册一个总线的过程。
1、定义一个总线bus_type,填充几个回调
其中几个比较重要 ,
match,总线设备和总线驱动的匹配规则
probe,总线设备和总线驱动匹配后将会执行的回调
2、调用bus_register注册总线
3、看看注册总线的接口 bus_register
分配总线的 subsys 私有数据(subsys_private)
总线维护的驱动和设备列表就在这个结构体里面
这里注意 priv->drivers_autoprobe = 1; 设置为1,,,后面分析注册总线驱动会用到
说明所有的总线驱动将在注册的时候执行 driver_attach(drv);
二、驱动及其api
1、注册驱动的过程
driver/base/driver.c
driver_register注册一个总线驱动
有这么重要几步
driver_find
按驱动的名字,从总线查找驱动(注册到总线上的驱动,在总线上有维护),如果已经存在,返回-EBUSY
bus_add_driver
总线驱动加入总线
最终驱动在bus的链表(bus->p->klist_drivers)保存,,具体跟踪 bus_add_driver 可以了解
kobject_uevent
这个是跟热插拔事件有关,很明显发了一个 KOBJ_ADD 消息
1)bus_add_driver
下面我们看下,总线驱动是怎么加入到总线的,以及要做的一些处理![在这里插入图片描述]
如果没有总线,直接返回 -EINVAL,
很好理解,在注册总线驱动之前没有指定注册到哪个总线。
为驱动对象分配私有数据
以下为是总线驱动的处理,先分配一个驱动的私有数据,可以理解为总线驱动的组合对象
这里就将总线驱动加入到,总线维护,是一个链表里面,
这里注意,总线里面总能找到在其上注册的驱动。。。。。
将总线驱动加入到总线的驱动列表,并处理总线上的设备匹配
最后我们看到,
后面看看driver_attach是怎么做的总线匹配的
之前注册总线的时候, drivers_autoprobe=1;所以 driver_attach 将会执行。。。
1)driver_attach
driver_attach - try to bind driver to devices.
bus_for_each_dev是遍历总线列表上维护的总线设备,,去执行回调处理,直接看回调__driver_attach干了什么
第一个参数是总线上的设备,第二个参数是要注册的总线驱动。。
1、执行总线的 match 回调
首先去是调用总线设置的match回调函数,处理总线设备和驱动,看是否匹配
2、执行总线或驱动上的 probe 回调
调用了really_probe,看really_probe做了什么,如果bus有probe,执行,否则执行总线驱动的probe
这里我们了解到 __driver_attach 的作用,,__driver_attach 比较重要,,他是总线设备和总线驱动匹配的实质。。
__driver_attach
对注册总线驱动所属的总线上的设备,一一匹配,匹配成功,,将会执行总线或驱动的 probe 。
这里我们了解了总线驱动的注册过程,一般我们在自定义总线的时候,会封装一个注册总线驱动的接口,这个接口最终会调用driver_register
三、设备及其api
1、注册设备的过程
drivers/base/core.c
最终调用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上面做扩展。文章来源:https://www.toymoban.com/news/detail-453808.html
四、class
参考i2c总线,以助理解,总线、驱动和设备的关系文章来源地址https://www.toymoban.com/news/detail-453808.html
到了这里,关于Linux设备驱动模型(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!