DTO の構文

デバイスツリー ソース(DTS)形式は、デバイスツリーのテキスト表現です。デバイスツリー コンパイラ(DTC)は、この形式を処理して 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";
        ...
      };
  };
};

しかしながら、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 の後にオーバーライドされます。存在しない場合、そのプロパティは 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";
    };
  };
};