DTO-Syntax

Das DTS-Format (Device Tree Source) ist eine Textdarstellung eines Gerätebaums (Device Tree, DT). Der Gerätebaum-Compiler (Device Tree Compiler, DTC) verarbeitet dieses Format in einen binären Gerätebaum, der vom Linux-Kernel erwartet wird.

Verweise verwenden

Im DTC-Projekt (Device Tree Compiler + Overlay-Patches) wird das DTS-Format in dtc-format.txt und manual.txt beschrieben. Das DTO-Format und die Regeln werden in dt-object-internal.txt beschrieben. In diesen Dokumenten wird beschrieben, wie Sie den Haupt-Gerätebaum mithilfe von Knoten fragment@x und der Syntax __overlay__ im Overlay-Gerätebaum aktualisieren. Beispiel:

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

Google empfiehlt jedoch dringend, nicht fragment@x und die Syntax __overlay__ zu verwenden, sondern stattdessen die Referenzsyntax. Beispiel:

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

Die Referenzsyntax wird von dtc in dasselbe Objekt wie oben mit der Syntax __overlay__ kompiliert. Bei dieser Syntax müssen Sie die Fragmente nicht nummerieren, sodass Sie Overlay-DTS einfach lesen und schreiben können. Wenn Ihr dtc diese Kurzschreibweise nicht unterstützt, verwenden Sie dtc in AOSP.

Labels verwenden

Damit undefinierte Verweise auf Knoten, die zum Zeitpunkt der Kompilierung nicht vorhanden sind, zulässig sind, muss die Overlay-Gerätebaumdatei .dts im Header das Tag /plugin/ enthalten. Beispiel:

/dts-v1/;
/plugin/;

Von hier aus können Sie die zu überlagernden Knoten mithilfe einer Referenz ansprechen. Dabei handelt es sich um einen absoluten Knotenpfad mit einem vorangestellten Et-Zeichen (&). Beispiel: für node@0 im Haupt-Gerätebaum:

Labels im Haupt-Gerätebaum definieren: … dann verwenden Sie die Labels.
[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>;
};

Überschreiben

Wenn die Referenzzieleigenschaft im Haupt-Gerätebaum vorhanden ist, wird sie nach dem Gerätebaum-Overlay überschrieben. Andernfalls wird sie angehängt. Beispiel:

main.dts overlay.dts Zusammengeführtes Ergebnis
[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";
  };
};

Anhängen

Wenn die Referenzziel-Property nicht im Haupt-Gerätebaum vorhanden ist, wird sie nach dem Gerätebaum-Overlay angehängt. Beispiel:

main.dts overlay.dts Zusammengeführtes Ergebnis
[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";
  };
};

Untergeordnete Knoten

Beispiele für die Syntax von untergeordneten Knoten:

main.dts overlay.dts Zusammengeführtes Ergebnis
[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";
    };
  };
};