【Linux驱动开发】Linux设备树

  • 概念

设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如 CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。如图所示。

【Linux驱动开发】Linux设备树

树的主干就是系统总线,IIC 控制器、GPIO 控制器、SPI 控制器等都是接 到系统主线上的分支。IIC 控制器有分为 IIC1 IIC2 两种,其中 IIC1 上接了 FT5206 AT24C02 这两个 IIC 设备,IIC2 上只接了 MPU6050 这个设备。DTS 文件的主要功能就是按图所示的结构来描述板子上的设备信息。

  •  文件格式

DTS(.dts) 设备树源文件(描述板级信息:开发板上有哪些 IIC 设备、SPI 设备等
DTB(.dtb) 设备树编译文件
.dtsi 设备树头文件(描述SOC级信息:CPU 架构、主频、外设寄存器地址范围等)
  •   编译工具

DTC 将.dts 编译为.dtb

DTC 工具源码在 Linux 内核的 scripts/dtc 目录下。

DTC 工具依赖于 dtc.cflattree.cfstree.c 等文件,最终编译并链接出 DTC 这个主机文件。

在arch/arm/boot/dts/Makefile 中新增需要编译的DTS文件。

如果要编译 DTS 文件的话只需要进入到 Linux 源码根目录下,然后执行如下命令:

 

make all

编译 Linux 源码中的所有东西,包括 zImage.ko 驱动模块以及设备 树

make dtbs

编译设备树

  •  设备节点

设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设备节点,每个节点都通过一些属性信息来描述节点信息,属性就是 键值对。每个节点都有不同属性,不同的属性又有不同的内容,属性都是键值对,值可以为空或任 意的字节流。设备树源码中常用的几种数据形式如下所示:

①字符串

compatible ="arm,cortex-a7";

上述代码设置 compatible 属性的值为字符串“arm,cortex-a7”。

②32 位无符号整数

reg =<0>;

上述代码设置 reg 属性的值为 0reg 的值也可以设置为一组值,比如: reg =<0 0x123456 100>;

③字符串列表

属性值也可以为字符串列表,字符串和字符串之间采用“,”隔开,如下所示:

compatible ="fsl,imx6ull-gpmi-nand", "fsl, imx6ul-gpmi-nand";

上述代码设置属性 compatible 的值为“fsl,imx6ull-gpmi-nand”和“fsl, imx6ul-gpmi-nand”。

  • 标准属性

节点是由一堆的属性组成,节点都是具体的设备,不同的设备需要的属性不同,用户可以 自定义属性。除了用户自定义属性,有很多属性是标准属性,Linux 下的很多外设驱动都会使用 这些标准属性。

compatible 属性
compatible 属性也叫做“兼容性”属性。用于将设备和驱动绑定起来。
值是一个字符串列表,用于选择设备所要使用的驱动程序。
model 属性
值是字符串,一般描述设备模块信息,例如名字。
status 属性
值是字符串,设备的状态信息。
#address-cells #size-cells 属性

值是无符号 32 位整形。可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。

#address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 ),
#size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 )。
reg 属性
值一般是(addresslength)对。用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息
ranges 属性
ranges 是一个地址映射/转换表,ranges 属性每个项目由子地址、父地址和地址空间长度 这三部分组成。
如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换。
name 属性
值是字符串,name 属性用于记录节点名字。name 属性已经被弃用,不推荐使用 name 属性,一些老的设备树文件可能会使用此属性。
device_type 属性
值是字符串,IEEE 1275 会用到此属性,用于描述设备的 FCode,但是设 备树没有 FCode,所以此属性也被抛弃了。此属性只能用于 cpu 节点或者 memory 节点。