DTO 語法

裝置樹狀架構來源 (DTS) 格式是裝置樹狀架構 (DT) 的文字表示法。裝置樹狀結構編譯器 (DTC) 會將這個格式轉換為二進位 DT,這是 Linux 核心預期的格式。

使用參照

DTC (裝置樹狀結構編譯器 + 重疊修補程式) 專案會在 dtc-format.txtmanual.txt 中說明 DTS 格式。如需瞭解 DTO 格式和規則,請參閱 dt-object-internal.txt。這些文件說明如何在疊加式資料表中,使用節點 fragment@x 和語法 __overlay__ 更新主資料表。例如:

/ {
  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";
    };
  };
};