1.总线、设备、驱动模型
本着高内聚、低耦合的原则,Linux 把设备驱动模型分为了总线、设备和驱动三个实体,这三个实体在内核里的职责分别如下:
设备和驱动向总线进行注册,总线负责把设备和对应的驱动绑定起来。
驱动通过总线 API 接口 platform_get_resource()
取得板级设备信息,这样驱动和设备之间就实现了高内聚、低耦合的设计,
无论设备怎么换,驱动都可以岿然不动。
代码架构如下图所示:
2、设备树
引入设备树之前,关于硬件设备的描述信息一般放在一个个类似 arch/xxx/mach-xxx/board-xxx.c 的文件中,
这些代码中除了描述的设备信息不同,其代码逻辑都是一样的。我们有理由,把这些设备端的信息,用一个非 C 的脚本语言来描述,这个脚本文件,就是 Device Tree(设备树)。
设备树是一种 dts 文件,它用简单的语法描述每个板子上的所有设备,以及这些设备的连接信息。
设备树文件存储在目录 arch/xxx/boot/dts 中,每一个 board 对应一个 dts 文件。
引入设备树之后,大量重复的 C 代码(arch/xxx/mach-xxx/board-xxx.c)被去除——驱动的归于驱动 C 代码,设备的归于设备树脚本文件。
arch/arm/mach-xxx/board-a.c 这样的文件永远地进入了历史的故纸堆,换个板子,只要换个 Device Tree 文件就好。
代码架构如下图所示: