-----------------------没有程序驱动的硬件,就相当是一块废铁,通了电之后就是会电人的废铁-----------------------------
1. 驱动是处于硬件和上层应用中的中间层的,它只是负责访问硬件(譬如触摸屏驱动,负责收集触摸屏上的坐标数据等并上报数据)并且给操作该硬件的软件提供一个接口(API),而你需要在触摸屏上显示什么或者做其他事情,则是你应用层该干的事了。
2. Linux下的设备驱动分3类:字符设备、块设备、网络设备。一直有一种说法是Linux一切设备皆文件,其实不太正确。字符设备和块设备在Linux中式表示为文件,在应用层可以以文件io的方式式访问它们,不过通常不使用文件io直接去访问网络设备。网络设备间通信使用的socket接口等)。
(1) 字符设备:在Linux设备驱动开发中,接触最多。字符设备的特点是可以顺序访问;
(2) 块 设 备: 用来存储文件的介质;譬如SD卡、硬盘、nor flash\ nand flash等,它的特点是按块访问,不是按字节访问;
(3)网络设备:譬如有线网卡、wifi网卡,在开发板上使用最多的是DM9000,主要是是通过socket访问,网卡配置主要是使用ifconfig命令。
3. Linux中字符设备和块设备都表现为文件,譬如在/dev目录下存放的是设备驱动对应的文件:(部分截图)
4. Linux下的块设备文件:
6. 注:在/dev目录下是找不到网卡驱动的,原因是网络设备在Linux中是唯一不体现一切皆文件的东西。
-------------------------------------------------------------------回归正题--------------------------------------------------------------------------------
1.关于Linux驱动的发展:在Linux 2.4 以前,驱动是一种分散的架构;在Linux 2.6 之后进行了一次规整(总线、设备、驱动),(好像在Linux 3.0之后增加了设备树,这点目前我只知道有这么一回事),还有目前我使用的Ubuntu 16.04.3版本内核是Linux ubuntu 4.10.0 了(使用uname -a命令查看),内核更新比较快。在目前可以不买开发板使用QEMU模拟器去学习Linux内核了,如何使用这个目前我也在研究中。
2. 理解设备驱动的模型估计是离不开着三个东西了:总线、设备、驱动
(1)我这样理解:总线就像一条锁链,设备像是挂载在锁链上的锁,驱动就是开锁的钥匙。(好浪漫....我突然想到了自己还是单身狗,唉.....一不小心又自己虐自己了...[2017、12、9]) (我什么时候不单身了,我就回来把这句话删掉......)
3. Linux的总线有:iic总线、spi总线、usb总线等。不过有一些设备不是挂载总线上的,在Linux中叫法是平台设备(platform)。有一些设备驱动即是总线设备又属于平台设备。
4. 在Linux的驱动模型里面,总线的驱动是总线的驱动,设备的驱动是设备的驱动,设备的注册时设备的注册。它们是三个不同的组成部分,不能混淆了。
(1)总线的驱动:总线驱动,是不需要修改一行代码就可以在其他平台上面使用的,当然这个不要我这一般水平的人写。
(2)设备驱动:属于板级信息,譬如说你移植的网卡挂在什么总线,总线地址是多少,网卡是多少位的,这是属于板级的信息,是和你具体的硬件相关的。
(3)Linux的每个驱动在注册的时候,会去寻找匹配的设备;每个设备在注册的时候会去寻找匹配的驱动。如何做到的呢?驱动和设备所挂载的总线驱动会自动去匹配相应的设备和驱动。
(4)那么platform平台上的设备和驱动是如何匹配的呢?这里主要是平台根据设备名字和驱动名字进行匹配的,所以编写平台设备驱动的时候设备名字和驱动名字很关键。这么说吧:首先是在系统的某个平台总线上注册一个名字叫啊猫啊狗的设备(此设备啥都没干),后面接着又注册了一个阿猫阿狗的驱动,因为它们两个的名字一样,所以匹配上了,然后驱动就开始进入到运行的状态了。
---------------------------------------------------------------------------------------------------------------
5. 简单看过Linux的内核源码的人都知道,内核是使用汇编和C语言写出来的,C语言是面向过程的语言,不过Linux内核实现的思想却是面向对象的,真的是很复杂。譬如说Linux内核文件系统的结构,它的设备驱动的模型。
6. Linux内核如何体现了面向对象的思想(继承、重载、多态):譬如说总线和设备驱动都可以继承kobject (kernel object) , kobject在注册的时候可以认为是抽象的基类,Linux内核用一份源代码支持了很多种架构,譬如:在内核源代码的arch目录下,每一个文件夹就代表Linux支持的一种架构。
7.还有的是在arm目录下,是Linux源代码支持的几十种arm架构的soc芯片,每个文件夹对应一个开发板。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------
8. 不仅仅是设备和驱动要进行分离,驱动和驱动之间也要进行分离:
9. 驱动与驱动之间还涉及分离和分层的关系。硬件操作层(大多数人的工作位置)、驱动核心层、Linux应用上层
(1)譬如IIC总线上挂了很多设备,如触摸屏驱动、