DTO 语法

设备树源 (DTS) 格式是设备树的文本表示形式。设备树编译器 (DTC) 可将这种格式处理为二进制设备树,这是 Linux 内核要求的形式。

使用引用

DTC(设备树编译器 + 叠加补丁)项目在 dtc-format.txtmanual.txt 中说明了 DTS 格式。在 dt-object-internal.txt 中说明了 DTO 格式和规则。这些文档说明了如何使用叠加 DT 中的节点 fragment@x 和语法 __overlay__ 更新主 DT。例如:

/ {  fragment@0 {  target = <&some_node>;  __overlay__ {  some_prop = "okay";  ...  };  }; };

不过,Google 强烈建议您不要使用 fragment@x 和语法 __overlay__,而应使用引用语法。例如:

&some_node { some_prop = "okay"; ... };

dtc 会将引用语法编译成与上述使用语法 __overlay__ 所生成的对象相同的对象。此语法不强制您对片段进行编号,让您能够轻松地读取和写入叠加 DTS。如果您的 dtc 不支持此语法糖,请使用 AOSP 中的 dtc

使用标签

为了允许对编译时不存在的节点进行未定义的引用,叠加 DT .dts 文件的头文件中必须带有 /plugin/ 标签。例如:

/dts-v1/; /plugin/;

在这里,您可以使用引用定位要叠加的节点,该引用是以“和”符号 (&) 作为前缀的绝对节点路径。例如,对于主 DT 中的 node@0

在主 DT 中定义标签... ...然后使用标签。
[my_main_dt.dts] /dts-v1/; / {  my_node: node@0 {  status = "disabled";  my_child: child@0 {  value = <0xffffffff>;  };  }; };
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node {  status = "okay"; }; &my_child {  value = <0x1>; };

覆盖

如果引用目标属性存在于主 DT 中,则在 DTO 之后被叠加;否则,系统会对其进行附加。例如:

main.dts overlay.dts 合并结果
[my_main_dt.dts] /dts-v1/; / {  compatible = "corp,foo";  my_node: node@0 {  status = "disabled";  }; };
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node {  status = "okay"; };
/dts-v1/; / {  compatible = "corp,foo";  ...  node@0 {  linux,phandle = <0x1>;  phandle = <0x1>;  status = "okay";  }; };

附加

如果引用目标属性不存在于主 DT 中,则在 DTO 之后被附加。例如:

main.dts overlay.dts 合并结果
[my_main_dt.dts] /dts-v1/; / {  compatible = "corp,foo";  my_node: node@0 {  status = "okay";  }; };
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node {  new_prop = "bar"; };
/dts-v1/; / {  compatible = "corp,foo";  ...  node@0 {  linux,phandle = <0x1>;  phandle = <0x1>;  status = "okay";  new_prop = "bar";  }; };

子节点

子节点语法示例:

main.dts overlay.dts 合并结果
[my_main_dt.dts] /dts-v1/; / {  compatible = "corp,foo";  my_nodes: nodes {  compatible = "corp,bar";  node@0 {  status = "disabled";  };  }; };
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_nodes {  new_prop1 = "abc";  node@0 {  status = "okay";  new_prop2 = "xyz";  }; };
/dts-v1/; / {  compatible = "corp,foo";  ...  nodes {  linux,phandle = <0x1>;  phandle = <0x1>;  compatible = "corp,bar";  new_prop1 = "abc";  node@0 {  linux,phandle = <0x2>;  phandle = <0x2>;  status = "okay";  new_prop2 = "xyz";  };  }; };