前言
在开发或学习Linux驱动的时候,首先会有两个最基本的认识:设备和驱动,设备一般指我们要控制的外设模块,驱动指我们需要实现控制外设的功能的程序。最简单直接的开发方式是,我们将设备的特性如电平、寄存器地址等在开发驱动的时候在程序中固定,但是这个带来的问题就是驱动程序不具备可移植性。
为了解决上述问题,我们在程序中需要将对设备的描述和对功能的实现分开(即配置和功能分离),必须需要控制GPIO电平,驱动中只需要实现控制电平这个功能即可,具体是高电平还是低电平则是根据设备信息决定。这个设备信息在软件中称为设备,驱动则对应为设备驱动。
在解决完设备与驱动分离的问题,还有一个问题待解决,那就是如何让多个设备同时匹配同一个驱动。比如,我们驱动中实现了控制一个GPIO的电平这个功能,但是有多个GPIO需要控制,每个GPIO所需要的高低电平并不相同,我们不可能有多少GPIO就写多少驱动吧?每个GPIO电平不同的问题可以通过设备信息来解决,而多个设备匹配同一驱动的问题Linux是通过总线这个概念来解决的。
可以说总线是Linux设备模型中最核心的概念,那么总线是什么呢?总线这个概念是来源于硬件,说的是一条线上挂着多个设备,多个设备可以轮流占用这条线进行通信。如下图所示是网络总线。
设备模型中就借用硬件总线的概念,设置一种类似总线的软件框架可被称为软件总线,在总线上分别挂载驱动和设备,然后按照关键字进行匹配。
四大基本元素
通过前言我们已经知道了设备、驱动、总线,在设备模型中还有个概念类class,是对同一类设备的抽象描述。在这里我们对四个基本元素进行准确的描述。
- Device 设备:抽象系统中所有的硬件设备,描述它的名字、属性、从属的Bus、从属的Class等信息;
- Class 类:集合具有相似功能或属性的设备,这样就可以抽象出一套可以在多个设备之间共用的数据结构和接口函数;
- Device Driver 驱动:实现设备的初始化、提供控制设备的功能接口;
- Bus 总线:包括实际的总线(USB、i2c、spi等)和虚拟总线platform,但是软件层面的总线是对实际总线的程序抽象,包括驱动和设备匹配和设备信息传递功能。