目录
1.传统字符设备驱动框架的缺点
缺点:驱动可移植性差,原因是驱动里面包括了很多该芯片特有的消息,如果是其他平台,硬件信息会有差异,所以驱动无法直接使用。
2.总线、设备、驱动
在Linux 2.6内核中,提出了"总线"、"设备"、"驱动"的架构,目的是让我们写出来的驱动通用性更强。
核心思想:
将设备的信息从驱动中分离出来,我们需要在操作系统中,添加设备和驱动两部分。
设备中包含是设备的信息(资源),驱动中包含的是操作设备函数接口。为了能让驱动最终能操作我们的硬件设备,我们在驱动中必须获取设备的信息(资源)。
问题:
设备和驱动是分离的,那么驱动是如何获取具体设备信息的呢?
回答:
设备和驱动都会注册到总线上,当注册设备的时候,会去寻找同名的驱动,当注册驱动的时候,也会去找同名的设备。相互查找。一旦匹配成功,操作系统就会自动调用驱动提供的probe函数。我们只需要在probe函数中,使用操作系统提供的通用API获取硬件的资源即可。
"总线" 理解:
总线在操作系统中本质就是两个链表:挂载设备的链表和挂载驱动的链表。在操作系统中总线种类可以分成两大类,平台总线,边缘设备之间通信的总线
平台总线:平台总线挂载都是控制器设备,用于CPU核与硬件控制器之间的通信。在Linux系统中用"platform bus"表示。
边缘设备之间通信的总线:边缘设备之间通信的总线挂载是符合总线时序的外围设备,如:i2c , spi ,usb , uart 等。不同的边缘设备之间通信的总线,总线时序是不一样的,对于这些总线,Linux 内核是单独实现的。
基于总线写驱动思路:
- 根据自己的设备,确定总线的类型
- 根据总线的类型, 确定设备在总线上如何描述
- 根据总线的类型, 确定驱动在总线上如何描述
- 根据总线的类型,确定在总线上如何注册设备
- 根据总线的类型,确定在总线上如何注册驱动
- 根据总线的类型, 确定设备和驱动匹配原则
设备和驱动匹配后,操作系统就会调用驱动提供的probe函数。在这个函数中,一般需要做两件事情:
(1)获取匹配的硬件资源
(2)向上层提供硬件设备的操作函数接口(如:注册字符设备)