【Linux驱动开发】Linux设备树
-
概念
设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如 CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。如图所示。
树的主干就是系统总线,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.c、flattree.c、fstree.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 属性的值为 0,reg 的值也可以设置为一组值,比如: 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 属性
|
值一般是(address,length)对。用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息 |
ranges 属性
|
ranges 是一个地址映射/转换表,ranges 属性每个项目由子地址、父地址和地址空间长度 这三部分组成。
如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换。
|
name 属性
|
值是字符串,name 属性用于记录节点名字。name 属性已经被弃用,不推荐使用 name 属性,一些老的设备树文件可能会使用此属性。
|
device_type 属性
|
值是字符串,IEEE 1275 会用到此属性,用于描述设备的 FCode,但是设 备树没有 FCode,所以此属性也被抛弃了。此属性只能用于 cpu 节点或者 memory 节点。
|