设备树规格书(Devicetree Specification)
Devicetree Source (DTS) 格式是 devicetree 的文本表示形式,可以通过 dtc 处理为内核所期望的二进制 devicetree 形式。以下描述不是 DTS 的正式语法定义,但描述了用于表示 devicetree 的基本构造。
DTS 文件的名称应以“.dts”结尾。
可以从 DTS 文件中包含其他源文件。包含文件的名称应以“.dtsi”结尾。包含的文件可以进一步包含其他文件。
/include/ "FILE"
源格式允许将标签附加到 devicetree 中的任何节点或属性值。可以通过引用标签而不是显式指定 phandle 值或节点的完整路径来自动生成 phandle 和路径引用。标签仅在 devicetree 源格式中使用,不会编码到 DTB 二进制文件中。
标签的长度应为 1 到 31 个字符,仅由 :numref:label-characters
集合中的字符组成,且不能以数字开头。
通过在标签名称后附加冒号(“:”)来创建标签。通过在标签名称前加上“&”来创建引用。
字符 | 描述 |
---|---|
0-9 |
数字 |
a-z |
小写字母 |
A-Z |
大写字母 |
_ |
下划线 |
使用节点名称和单元地址定义设备树节点,并使用大括号标记节点定义的开始和结束。它们可以在前面加上标签。
[label:] node-name[@unit-address] {
[properties definitions]
[child nodes]
};
节点可以包含属性定义和/或子节点定义。如果两者都存在,则属性应在子节点之前。
先前定义的节点可以被删除。
/delete-node/ node-name;
/delete-node/ &label;
属性定义是名称值对,形式为:
[label:] property-name = value;
除了空(零长度)值的属性,它们的形式为:
[label:] property-name;
先前定义的属性可以被删除。
/delete-property/ property-name;
属性值可以定义为32位整数单元的数组、以空字符结尾的字符串、字节串或这些的组合。
- 单元格数组由尖括号括起来,其中包含一个以C样式整数分隔的空格分隔列表。例如:
interrupts = <17 0xc>;
- 其中,括号内的值可以表示为算术、位或逻辑表达式。
Arithmetic operators
+ add
- subtract
* multiply
/ divide
% modulo
Bitwise operators
& and
| or
^ exclusive or
~ not
<< left shift
>> right shift
Logical operators
&& and
|| or
! not
Relational operators
< less than
> greater than
<= less than or equal
>= greater than or equal
== equal
!= not equal
Ternary operators
?: (condition ? value_if_true : value_if_false)
- 64位值用两个32位单元表示。例如:
clock-frequency = <0x00000001 0x00000000>;
- 使用双引号表示以空字符结尾的字符串值(属性值被认为包括终止的NULL字符)。例如:
compatible = "simple-bus";
- 字节串用方括号[ ]括起来,每个字节由两个十六进制数字表示。每个字节之间的空格是可选的。例如:
local-mac-address = [00 00 12 34 56 78];
或者等价于:
local-mac-address = [000012345678];
- 值可以有多个逗号分隔的组件,这些组件将连接在一起。例如:
compatible = "ns16550", "ns8250";
example = <0xf00f0000 19>, "a strange property format";
- 在单元格数组中,对另一个节点的引用将扩展为该节点的phandle。引用可以是&后跟节点的标签。例如:
interrupt-parent = < &mpic >;
或者它们可以是&后跟大括号中节点的完整路径。例如:
interrupt-parent = < &{/soc/interrupt-controller@40000} >;
- 在单元格数组之外,对另一个节点的引用将扩展为该节点的完整路径。例如:
ethernet0 = &EMAC0;
- 标签也可以出现在属性值的任何组件之前或之后,在单元格数组的单元格之间或字节串的字节之间。例如:
reg = reglabel: <0 sizelabel: 0x1000000>;
prop = [ab cd ef byte4: 00 ff fe];
str = start: "string value" end: ;
版本 1 DTS 文件具有以下总体布局:
/dts-v1/;
[memory reservations]
/ {
[property definitions]
[child nodes]
};
/dts-v1/;
应该存在,以将文件标识为版本 1 DTS(没有此标记的 dts 文件将被 dtc 视为过时的版本 0,它使用了不同的整数格式,除了其他一些小但不兼容的更改)。
内存预留(请参阅 :numref:sect-fdt-memory-reservation-block
)由以下形式的行表示:
/memreserve/ <address> <length>;
其中 <address>
和 <length>
是 64 位 C 样式整数,例如,
/* Reserve memory region 0x10000000..0x10003fff */
/memreserve/ 0x10000000 0x4000;
所有设备树数据都包含在其中。