`
runfeel
  • 浏览: 902651 次
文章分类
社区版块
存档分类
最新评论

设备驱动----Linux中总线、设备、驱动是如何关联的?

 
阅读更多

对于Linux驱动开发来说,设备模型的理解是根本,顾名思义设备模型是关于设备的模型,设备的概念就是总线和与其相连的各种设备了。

电脑城的IT工作者都会知道设备是通过总线连到计算机上的,而且还需要对应的驱动才能用,可是总线是如何发现设备的,设备又是如何和驱动对应起来的?

总线、设备、驱动,也就是busdevicedriver,在内核里都会有它们自己专属的结构,在include/linux/device.h里定义。

首先是总线,bus_type.
struct bus_type {
const char* name;
struct subsystem subsys;//
代表自身
struct ksetdrivers; //当前总线的设备驱动集合
struct ksetdevices; //所有设备集合
struct klistklist_devices;
struct klistklist_drivers;
struct bus_attribute * bus_attrs;//
总线属性
struct device_attribute * dev_attrs;//设备属性
struct driver_attribute * drv_attrs;
int(*match)(struct device * dev, struct device_driver * drv);//
设备驱动匹配函数
int(*uevent)(struct device *dev, char **envp,
int num_envp, char *buffer, int buffer_size);//
热拔插事件
int(*probe)(struct device * dev);
int(*remove)(struct device * dev);
void(*shutdown)(struct device * dev);
int(*suspend)(struct device * dev, pm_message_t state);
int(*resume)(struct device * dev);
};

下面是设备device的定义:

struct device {
struct device* parent; //
父设备,一般一个bus也对应一个设备。
struct kobject kobj;//代表自身
char bus_id[BUS_ID_SIZE];
struct bus_type * bus;/*
所属的总线*/
struct device_driver *driver; /*
匹配的驱动*/
void*driver_data; /* data private to the driver
指向驱动*/
void*platform_data; /* Platform specific data
,由驱动定义并使用*/
///
更多字段忽略了
};
下面是设备驱动定义:
struct device_driver {
const char* name;
struct bus_type* bus;//
所属总线
struct completion unloaded;
struct kobjectkobj;//
代表自身
struct klistklist_devices;//设备列表
struct klist_node knode_bus;
struct module* owner;
int (*probe) (struct device * dev);
int (*remove) (struct device * dev);
void (*shutdown) (struct device * dev);
int (*suspend) (struct device * dev, pm_message_t state);
int (*resume) (struct device * dev);
};

我们会发现,structbus_type中有成员structksetdriversstructksetdevices,同时structdevice中有两个成员struct bus_type * busstruct device_driver *driverstructdevice_driver中有两个成员structbus_type*busstructklistklist_devicesstructdevice中的bus表示这个设备连到哪个总线上,driver表示这个设备的驱动是什么,structdevice_driver中的bus表示这个驱动属于哪个总线,klist_devices表示这个驱动都支持哪些设备,因为这里device是复数,又是list,更因为一个驱动可以支持多个设备,而一个设备只能绑定一个驱动。当然,structbus_type中的driversdevices分别表示了这个总线拥有哪些设备和哪些驱动。

还有上面devicedriver结构里出现的kobject结构是什么?kobjectkset都是Linux设备模型中最基本的元素。一般来说应该这么理解,整个Linux的设备模型是一个OO的体系结构,总线、设备和驱动都是其中鲜活存在的对象,kobject是它们的基类,所实现的只是一些公共的接口,kset是同种类型kobject对象的集合,也可以说是对象的容器。

那么总线、设备和驱动之间是如何关联的呢?

先说说总线中的那两条链表是怎么形成的。内核要求每次出现一个设备就要向总线汇报,或者说注册,每次出现一个驱动,也要向总线汇报,或者说注册。比如系统初始化的时候,会扫描连接了哪些设备,并为每一个设备建立起一个structdevice的变量,每一次有一个驱动程序,就要准备一个tructdevice_driver结构的变量。把这些变量统统加入相应的链表,device插入devices链表,driver插入drivers链表。这样通过总线就能找到每一个设备,每一个驱动。

设备和驱动又是如何联系?

原来是把每一个要用的设备在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个structdevice结构,并且挂入总线中的devices链表中来,然后每一个驱动程序开始初始化,开始注册其struct device_driver结构,然后它去总线的devices链表中去寻找(遍历),去寻找每一个还没有绑定驱动的设备,structdevice中的structdevice_driver指针仍为空的设备,然后它会去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做device_bind_driver的函数,然后他们就结为了秦晋之好。换句话说,把structdevice中的structdevice_driverdriver指向这个驱动,而struct device_driver driverstruct device加入他的那structklist klist_devices链表中来。就这样,busdevicedriver,这三者之间或者说他们中的两两之间,就给联系上了。知道其中之一,就能找到另外两个。

但现在情况变了,出现了一种新的名词,叫热插拔。设备可以在计算机启动以后在插入或者拔出计算机了。设备可以在任何时刻出现,而驱动也可以在任何时刻被加载,所以,出现的情况就是,每当一个structdevice诞生,它就会去busdrivers链表中寻找自己的另一半,反之,每当一个struct device_driver诞生,它就去busdevices链表中寻找它的那些设备。如果找到了合适的,那么OK,和之前那种情况一下,调device_bind_driver绑定好。如果找不到,没有关系,等待吧!

分享到:
评论

相关推荐

    Linux中总线、设备、驱动是如何关联的?

    Linux驱动,有助于了解驱动,设备,总线间的关系

    Linux总线、设备和驱动模型

    宋宝华 - Linux总线、设备和驱动模型的详细讲座的ppt分享。

    Linux中LonWorks现场总线设备驱动设计

    我们在基于嵌入式Linux智能控制器的开发中,首先遇到了LonWorks现场总线设备的驱动程序问题。本文在研究了基于嵌入式Linux平台的驱动程序开发机制后,研究实现了嵌入式 Linux环境下的LonWorks现场总线网卡的设备驱动...

    Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类) - Linux设备驱动程序

    Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类) - Linux设备驱动程序

    华清远见驱动教程

    -第15章、Linux的I2C核心、总线与设备驱动 -第16章、Linux网络设备驱动 -第17章、Linux音频设备驱动 -第18章、LCD设备驱动 -第19章、Flash设备驱动 -第20章、USB主机与设备驱动 -第21章、PCI设备驱动 -第22章、Linux...

    Linux设备驱动程序学习

    ·Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类) ·Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合) ·Linux设备驱动程序学习(15)-Linux设备模型(热插拔、mdev 与 ...

    Linux设备驱动详解第二版

    第15章 Linux的I2C核心、总线与设备驱动 333 第16章 Linux网络设备驱动 363 第17章 Linux音频设备驱动 388 第18章 LCD设备驱动 440 第19章 Flash设备驱动 479 第20章 USB主机与设备驱动 507 第21...

    嵌入式Linux设备驱动开发详解

    本书特色:本书系统地介绍了嵌入式Linux设备驱动开发的相关知识和实例,主要包括: 数码管驱动程序;键盘驱动程序;A/D、D/A驱动程序;LCD驱动程序;触摸屏驱动程序;CAN总线驱动程序;I2C总线驱动程序;音频总线...

    linux设备模型、sys-总线-设备-驱动

    需要的就下来看看吧 包含了linux的设备模型方面的一些介绍,

    Linux设备模型(总线、设备、驱动程序和类)

    Linux设备模型(总线、设备、驱动程序和类)

    LINUX设备驱动程序

    《LINUX设备驱动程序(第3版)》还在单独的章节中讲述了PCI、USB和tty(终端)子系统。对期望了解操作系统内部工作原理的读者来讲,《LINUX设备驱动程序(第3版)》也深入阐述了地址空间、异步事件以及I/O等方面的内容。 ...

    《精通Linux 设备驱动程序开发》.(Sreekrishnan).pdf

     本书是linux设备驱动程序开发领域的权威著作。全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深入探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如pcmcia、i2c和usb等外部总线以及视频、音频、...

    从需求的角度去理解嵌入式Linux:总线、设备和驱动

    Linux平台上的各个子系统,如设备驱动模型、input子系统、I2C总线、frame buffer驱动等等都属于软件框架,它是针对特定的硬件体系需求以面向对象的思维去设计的一种软件解决方案,而且已经经过长时间的多平台验证。...

    设备总线驱动流程图

    个人总结的设备-总线-驱动的流程图,以gpio为例

    Linux设备模型三总线、设备、驱动程序

    Linux设备模型三总线、设备、驱动程序Linux设备模型三总线、设备、驱动程序

    Linux 驱动学习笔记pdf文档

    ·Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类) ·Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合) ·Linux设备驱动程序学习(15)-Linux设备模型(热插拔、mdev 与 ...

    精通linux设备驱动程序开发

    《精通Linux设备驱动程序开发》是Linux设备驱动程序开发领域的权威著作。全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深人探讨了其他书没有涵盖...《精通Linux设备驱动程序开发》适合中高级Linux开发人员阅读。

    linux设备驱动开发第三版之总线添加例程代码

    linux设备驱动开发第三版之总线添加例程代码,可熟悉一下在linux下添加总线级别驱动程序的过程。可以直接编译运行于X86机器上。

Global site tag (gtag.js) - Google Analytics