DTO-Syntax

Das Device Tree Source-Format (DTS) ist eine textuelle Darstellung eines Gerätebaums (Device Tree, DT). Der Gerätebaum-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 den Dateien dtc-format.txt und manual.txt beschrieben. Format und Regeln für DTOs werden in dt-object-internal.txt beschrieben. In diesen Dokumenten wird beschrieben, wie Sie den Haupt-DT mit dem Knoten fragment@x und der Syntax __overlay__ im Overlay-DT aktualisieren. Beispiel:

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

Google empfiehlt jedoch dringend, fragment@x und die Syntax __overlay__ nicht 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 musst du die Fragmente nicht nummerieren, sodass du Overlay-DTS ganz einfach lesen und schreiben kannst. Wenn Ihre dtc diese Syntaxkürzel nicht unterstützt, verwenden Sie den dtc in AOSP.

Labels verwenden

Damit nicht definierte Verweise auf Knoten zulässig sind, die zum Zeitpunkt der Kompilierung nicht vorhanden sind, muss die DT-.dts-Datei des Overlays im Header das Tag /plugin/ enthalten. Beispiel:

/dts-v1/;
/plugin/;

Hier können Sie die zu überlagernden Knoten mit einer Referenz ansteuern. Das ist ein absoluter Knotenpfad, der mit einem „&“ (Und-Zeichen) beginnt. Beispiel für node@0 im Haupt-Gerätebaum:

Labels im Haupt-Gerätebaum definieren ... verwenden Sie dann 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 in der Hauptdatentabelle vorhanden ist, wird sie nach dem DTO ü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 Referenzzieleigenschaft in der Hauptdatentabelle nicht vorhanden ist, wird sie nach DTO 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";
    };
  };
};