文章目录
- 11. Linux 下的驱动分离与分层
- 1 驱动的分隔与分离
- 2 驱动的分层
11. Linux 下的驱动分离与分层
1 驱动的分隔与分离
linux是一个成熟、复杂、庞大的操作系统,代码的重用性很重要,不然会在linux内核存在大量的无意义重复的代码。尤其的驱动程序,占了linux内核代码的大头,所以需要对驱动程序加以管理。
传统的I2C设备驱动
假如有三个平台A、B和C,这三个平台都有MPU6050 这个 I2C接口的六轴传感器。按照I2C驱动的思路,每个平台都有一个 MPU6050的驱动,所以编写出来的最简单的驱动框架如图
可以看出,每种平台下都有一个主机驱动和设备驱动,左边的主机驱动是必要的,不同平台的控制器不同。但是右边的设备驱动没必要每个平台都写一个,因为不管对于哪一个SOC来说,MPU6050都是一样的,都是通过I2C接口来读写数据,只需要编写一个MPU6050驱动程序就可以。
最好每个平台的I2C控制器都提供一个统一的接口(也叫做主机驱动),每个设备的也只提供一个驱动程序(设备驱动),每个设备通过统一的 I2C接口驱动来访问,这样就可以大大简化驱动文件
实际的 I2C 驱动设备肯定有很多种,不止 MPU6050 这一个,那么实际的驱动架构如图
-
这个就是驱动的分隔,将主机驱动和设备驱动分隔开来,比如 I2C、 SPI 等等都会采用驱动分隔的方式来简化驱动的开发。
-
在实际的驱动开发中,一般 I2C 主机控制器驱动已经由半导体厂家编写好,而设备驱动一般也由设备器件的厂家编写好了,只需要提供设备信息即可,比如 I2C 设备的话提供设备连接到了哪个 I2C 接口上, I2C 的速度是多少等等。 (将设备信息从设备驱动中剥离开来,驱动使用标准方法去获取到设备信息(比如从设备树中获取到设备信息),然后根据获取到的设备信息来初始化设备。)
所以相当于驱动只负责驱动,设备只负责设备,想办法将两者进行匹配即可。Linux 中的总线(bus)、驱动(driver)和设备(device)模型,也就是常说的驱动分离。总线就是驱动和设备信息的桥梁,负责给两者牵线搭桥。
-
当向系统注册一个驱动的时候,总线就会在右侧的设备中查找,看看有没有与之匹配的设备,如果有的话就将两者联系起来。
-
当向系统中注册一个设备的时候,总线就会在左侧的驱动中查找看有没有与之匹配的设备,有的话也联系起来。
2 驱动的分层
Linux 下的驱动往往也是分层的,分层的目的也是为了在不同的层处理不同的内容。以input子系统 为例,input 子系统负责管理所有跟输入有关的驱动,包括键盘、鼠标、触摸等,最底层的就是设备原始驱动,负责获取输入设备的原始值,获取到的输入事件上报给 input 核心层。input 核心层会处理各种 IO 模型,并且提
供file_operations 操作集合。在编写输入设备驱动的时候只需要处理好输入事件的上报即可,至于如何处理这些上报的输入事件那是上层去考虑的。