Linux 总线、设备、驱动模型 与 设备树

时间:2022-02-06 17:57:25

1.总线、设备、驱动模型

  本着高内聚、低耦合的原则,Linux 把设备驱动模型分为了总线、设备和驱动三个实体,这三个实体在内核里的职责分别如下:

      Linux 总线、设备、驱动模型 与 设备树

  设备和驱动向总线进行注册,总线负责把设备和对应的驱动绑定起来。

  驱动通过总线 API 接口 platform_get_resource() 取得板级设备信息,这样驱动和设备之间就实现了高内聚、低耦合的设计,

无论设备怎么换,驱动都可以岿然不动。

  代码架构如下图所示:

Linux 总线、设备、驱动模型 与 设备树

 

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 文件就好。

  代码架构如下图所示:

Linux 总线、设备、驱动模型 与 设备树