Linux设备驱动模型(二)总线,总线驱动和总线设备

基于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

下面我们看下,总线驱动是怎么加入到总线的,以及要做的一些处理![在这里插入图片描述](https://img-blog.csdnimg.cn/afe7842545274a44b675f135cee50843.png

如果没有总线,直接返回 -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上面做扩展。

四、class


参考i2c总线,以助理解,总线、驱动和设备的关系

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值