1.总线-设备-驱动注册流程详解
在linux2.6之后,linux设备驱动分为三个实体总线、设备、驱动,平台总线将设备和驱动匹配。在系统注册任一个驱动的时候,都会寻找相应的设备;当系统注册设备的时候,系统也会寻找对应的驱动进行匹配。
在linux系统中,任何一个linux设备和linux驱动都是需要挂载到总线中。例如spi总线、media总线等等。若是设备本身是一个总线设备,那挂载到相应的总线上也是较好理解的。但有些设备如led、蜂鸣器等设备,都不是我们从字面上理解的总线设备。对于这种情况,linux系统创立一种虚拟的总线,也称为平台总线或者platforn总线,这个总线也有对应的设备platform_device,
通过命令”ls /sys/bus”查看系统总线,在linxu系统中platform总线总是和其他总线在同一个目录中。
2.linux设备
linux设备主要分为三大类:字符设备、块设备、网络设备。虽然它们之间有这种官方的分类,但是也没有严格的界限,只是一个比较模糊的划分。
字符设备:字符设备是能够像字节流一样被访问的设备。一般说来对硬件设备IO 的操作可以归结为字符设备。常见的字符设备有led、蜂鸣器、串口、键盘等等。
块设备:块设备室通过内存缓冲区访问,可以随机存取的设备,一般性的理解就是存储介。
质类的设备。常见的字符设备有U 盘、TF 卡、电脑硬盘、光盘等等
网络设备:可以和其它主机交换数据的设备。常见的以太网设备、WIFI、蓝牙等。
通过cat /proc/devices查看设备名以及设备编号。一般设备号是有限的,共有256个主设备号,从而引入了次设备号的概念,也就是说理论上有256*256个设备号。
linux驱动程序学习主要是分为两类,一类是需要会写,一类主要是移植,一般对于字符设备需要去学会写,对于块设备以及网络设备一般是原厂已经集成好或者是外围器件芯片商提供的代码,主要的工作在管脚的配置以及测试。
3.linux设备和驱动注册过程
linux内核对于每一个出现的设备就要像总线汇报,或者注册,出现一个驱动,也要向总线汇报,或者注册。
在系统初始化的时候,会扫描连接了哪些设备,并为每一个设备建立一个struct_device的变量,然后将设备的变量插入到devices链表中,如下表所示:
在驱动程序初始化的时候,需要准备一个struct device_driver结构的变量,然后将驱动的变量插入到drivers链表,如下所示:
linux总线为了便于管理将设备和驱动进行绑定。在系统没注册一个设备的时候,会寻找与之相匹配的驱动,同时相反,在系统每注册一个驱动的时候,会寻找一个相匹配的设备(热插拔设备)。
对于先注册设备再注册驱动的情况,在注册驱动的时候,系统首先会通过platform_mach函数匹配设备以及驱动。注册设备的结构体为platform_device,注册驱动的结构体为platform_driver,设备和驱动结构体的name字段相同则匹配。若匹配则会调用platform_driver中的probe函数,注册驱动。流程如下所示:
目前很多设备都是支持热插拔的,在linux中,一般都是先注册设备,然后再注册驱动,但是热插拔设备恰恰相反,在热插拔设备中,是有了设备接入后,内核会去driver链表中寻找驱动。