Elfboard-ELF开发板 Linux学习笔记(八)—— 设备树浅学笔记
设备树(Device Tree)是一种描述硬件资源的数据结构,它由 uboot 传递给 Linux 内核,被内核解析,内核根据设备树中的硬件描述信息加载利用相应驱动资源。在引入设备树之前,Linux 内核中充斥着大量的用于描述板级硬件信息的文件,拥有不同硬件资源的板卡 ,都有其对应的板级文件或者冗余文件,随着 Linux 内核支持的板卡越来越多,板级文件也越来越多。
一、设备树的组成
设备树 Device Tree 由一系列被命名的节点(node)和属性(property)组成,而节点本身可包含子节点。所谓属性,其实就是成对出现的 name value。在设备树中,可描述的信息包括:
- CPU 的数量和类别;
- 内存基地址和大小;
- 总线和桥;
- 外设连接;
- 中断控制器和中断使用情况;
- GPIO 控制器和 GPIO 使用情况;
- Clock 控制器和 Clock 使用情况;
这种以树状节点的方式描述一个设备的各种硬件信息:CPU、GPIO、时钟、中断、内存等,形成类似文本文件,很好的解决了这些问题。
dts、dtb和dtsi
- dts:Device Tree Source,设备树源文件,是纯文本文件,用于描述硬件信息。
- dtb:Device Tree Blob,设备树二进制文件,由设备树源文件编译而来。
- dtsi:Device Tree Include,设备树头文件,用于被其他设备树文件包含。
二、设备组织架构
1.节点
命名方式:node-name@unit-address:
- node-name:节点名称,由字母、数字、下划线、@和:组成,不能以数字开头。
- unit-address:设备地址,由字母、数字、下划线、@和:组成,不能以数字开头。地址主要是为了区分其他的节点以保证节点的唯一性,节点地址是非必须的,可以省略。
2.属性
属性是节点的一个组成部分,用于描述节点的信息。属性由 name 和 value 组成,name 表示属性名称,value 表示属性值。
一般属性值分为三种:
-
字符串:使用双引号""括起来。
-
byte数组型:用方括号[]括起来,每个元素用逗号分隔。
-
u32类型:使用尖括号<>括起来,每个元素用逗号分隔。
常见的属性有:
-
compatible:compatible 是兼容的意思,即该设备可被一个或者多个驱动匹配.
-
model:model 属性用于描述设备型号。
-
#address-cells,#size-cells,reg:
reg 属性用来表示节点地址资源的,属性值一般是寄存器的起始地址及地址之后连续的空间长度。
#address-cells,#size-cells 分别表示子节点中 reg 的地址以及地址之后连续的空间长度用几个 32bit 数据表示。 -
status:status 属性用于描述设备的状态,属性值可以是“okay”、“disable”、“fail”、“fail-sss”等。
3.标签
标签不是必须的,定义标签主要为了方便在其他地方对该节点进行引用的时候,不必写该节点的全路径,直接使用标签即可。如在 node@0 的子节点 child-node@0 的第三个属性就引用了 node1(&node1)。
三、开发板使用的设备树
开发板使用的设备树:ElfBoard 使用的设备树命名为 imx6ull-elf1-emmc.dts,是基于 NXP 官方 evk 板子的设备树 imx6ull-14x14-evk.dts 修改而来。