DTO 语法

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

使用引用

DTC(设备树编译器 + 叠加补丁)项目在 dtc-format.txtmanual.txt 中描述了 DTS 格式。DTO 格式和规则在 dt-object-internal.txt 中进行了描述。这些文档描述了如何在叠加 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__ 相同的对象。此语法不强制您对 fragment 进行编号,使您可以轻松地读取和写入叠加 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";
    };
  };
};