Linux设备驱动,总线,设备,驱动区别

来源:互联网 发布:大数据应用 调研 编辑:程序博客网 时间:2024/05/16 07:23

一、总线、设备、驱动的主要三个结构关系

structbus_type  
---------------------------------
    struct bus_type中为devices和drivers准备了两个链表:
    struct klist klist_devices
    struct klist klist_drivers

struct device
---------------------------------
    struct device有两个成员
    struct bus_type      *bus     记录的是这个设备连在哪条总线上
    struct device_driver *driver  记录的是这个设备用的是哪个驱动

struct device_driver
---------------------------------
    struct device_driver            同样有两个成员
    struct bus_type *bus          代表的是这个驱动属于哪条总线        
    struct klist    klist_devices 记录的是这个驱动支持的那些设备,没错,是devices(复数),因为一个驱动程序可以支持一个或多个设备,反过来一个设备则只会绑定给一个驱动程序.


二、总线,设备,驱动的关联

总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每 注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。一个现实的Linux设备和驱动通常都需要挂接在一种总线上。设备与驱动的关联通过总线的match()方法进行匹配,驱动挂载总线时与所有设备进行匹配,设备挂载总线时与所有的驱动进行匹配,所以驱动和设备的挂载无先后之分。匹配成功后会通过调用驱动的probo()方法来初始化设备。


三、总线,设备,驱动的注册

设备与驱动需要挂载在总线上,需要指明驱动与设备是属于哪条总线的,所以设备与驱动需要注册。而总线在linux系统中也是属于设备,所以总线也要注册,同时要先有总线而后才能注册设备和驱动,所以总线要先注册。

总线在linux系统中有俩种,一是实际存在的总线 pci  usb 等等,还有一类是虚拟存在的总线 platform ,platform总线主要是用于集成在SoC系统的设备,使得每一个设备都属于一条总线,相应的设备称为platform_device,而驱动成为 platform_driver。linux驱动中platform总线用的非常多,以platform总线说明总线,设备,驱动的注册顺序,注意这里是以先调加设备为例。

1. platform_bus_type -- 总线 先被kenrel 注册。

2. 系统初始化过程中调用platform_add_devices 或者platform_device_register ,将平台设备(platform devices) 注册到平台总线中( platform_bus_type )
3. 平台驱动(platform driver) 与平台设备(platform device) 的关联是在platform_driver_register 或者driver_register 中实现,一般这个函数在驱动的初始化过程调用。

通过这三步,就将平台总线,设备,驱动关联起来。

1. platform bus 先被kenrel 注册。
------------------------------------------------------
do_basic_setup() --> - driver_init() --> - platform_bus_init() -->bus_register()


2. 系统初始化过程中调用platform_add_devices 或者platform_device_register ,将平台设备(platform devices) 注册到平台总线中( platform_bus_type )
------------------------------------------------------
系统启动阶段,总线的驱动链表还是空的,所以启动阶段的platform_add_devices() 只负责将设备添加到总线的设备链表上。


原创粉丝点击