DTS语法与设备树结构
- 1 Devicetree概述
- 2 Devicetree 语法与结构基础
-
- 2.1 最简单的DTS示例
- 2.2 节点(Node)
-
- 2.2.1 节点标签(node label)
- 2.2.2 节点路径
- 2.3 属性(Property)
- 2.4 为什么设备树采用树状结构
- 2.5 更贴近实际场景的DTS示例
- 2.6 单元地址(Unit Address)
-
- 2.6.1 内存映射外设
- 2.6.2 I2C设备
- 2.6.3 SPI设备
- 2.6.4 内存、Flash、Flash分区
- 2.7 几个最关键的标准属性
-
- 2.7.1 compatible
- 2.7.2 reg
- 2.7.3 status
- 2.7.4 interrupts
- 2.8 关于label属性的说明
- 2.9 属性值的写法
-
- 2.9.1 字符串
- 2.9.2 整数
- 2.9.3 布尔值
- 2.9.4 数组
- 2.9.5 字节数组
- 2.9.6 字符串数组
- 2.9.7 phandle
- 2.9.8 phandles
- 2.9.9 phandle-array
- 2.10 编写属性值时的几个规则
-
- 2.10.1 布尔属性“存在即为真”
- 2.10.2 十六进制与十进制混合使用
- 2.10.3 64位整数要拆成两个32 位cell
- 2.10.4 支持表达式写法
- 2.11 phandle:节点之间的引用
- 2.12 同类属性值可以拆成多个块
- 2.13 aliases和chosen
-
- 2.13.1 aliases
- 2.13.2 chosen
- 3 Devicetree的输入与输出文件
-
- 3.1 输入文件与输出文件概述
- 3.2 输入文件
-
- 3.2.1 `.dts`:设备树主文件
- 3.2.2 `.dtsi`:被包含的设备树片段
- 3.2.3 `skeleton.dtsi`:最基础的骨架文件
- 3.2.4 设备树文件也会经过C预处理器
- 3.2.5 `.overlay`:覆盖层文件
- 3.2.6 Overlay的引入方式
- 3.2.7 Overlay如何生效
- 3.2.8 `.yaml`:binding文件
- 3.3 处理设备树的脚本与工具
-
- 3.3.1 `dtlib.py`
- 3.3.2 `edtlib.py`
- 3.3.3 `gen_defines.py`
- 3.3.4 `dtc`(设备树编译器)
- 3.4 输出文件
-
- 3.4.1 `zephyr.dts.pre`
- 3.4.2 `devicetree_generated.h`
- 3.4.3 `zephyr.dts`
- 4 核心要点
1 Devicetree概述
设备树是一种用于描述硬件的分层数据结构。Zephyr主要通过两种方式来使用设备树:1)向设备驱动程序模型描述硬件信息;2)用于指定该硬件的初始配置参数。设备树输入文件分为两种类型:设备树源文件和设备树绑定文件。源文件包含了设备树的结构本身;而绑定文件则描述了设备树中的各种元素及其数据类型。构建系统会利用这些源文件和绑定文件来生成C语言头文件。
所有Zephyr相关代码和应用源码都可以包含devicetree.h,例如驱动程序、应用程序、测试程序以及内核代码。devicetree API采用C宏方式提供,相关宏均以DT_开头。在源码中看到DT_开头的宏时,通常可以认为它属于devicetree.h提供的接口。同时,构建系统生成的头文件中也会包含部分DT_开头的宏,这些宏有时会出现在编译错误信息中。一般可通过命名形式区分二者:接口宏通常全为大写,自动生成的宏名称则往往包含小写字母。
2 Devicetree 语法与结构基础
Devicetree(设备树)本质上是一棵树状结构,用于描述硬件及其层级关系。这种树的文本表示形式称为 DTS(Devicetree Source),其语法由Devicetree规范定义。






