Kompilieren und verifizieren

Sie können den Device Tree Compiler (DTC) verwenden, um die Device Tree Source-Dateien (DTS) zu kompilieren. Bevor Sie jedoch den Overlay-Gerätebaum (DT) auf den Ziel-Haupt-DT anwenden, sollten Sie das Ergebnis auch überprüfen, indem Sie das Verhalten des Gerätebaum-Overlays (DTO) simulieren.

Mit DTC kompilieren

Wenn Sie dtc zum Kompilieren von .dts verwenden, müssen Sie die Option -@ hinzufügen, um einen __symbols__-Knoten in der resultierenden .dtbo einzufügen. Der Knoten __symbols__ enthält eine Liste aller Knoten, die mit einem Label gekennzeichnet sind, das die DTO-Bibliothek als Referenzen verwenden kann.

Beispielbefehl zum Erstellen des Haupt-DT .dts:

dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

Beispielbefehl zum Erstellen des Overlay-DT .dts:

dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

DTO-Ergebnisse auf dem Host prüfen

Mithilfe der Überprüfung können Sie Fehler identifizieren, die beim Platzieren des Overlay-DT auf dem Haupt-DT auftreten können. Bevor Sie das Ziel aktualisieren, können Sie das Ergebnis der Überlagerung von DT auf dem Host überprüfen, indem Sie das Verhalten von DTO mit /include/ in .dts simulieren.

Abbildung 1: Verwenden Sie die Syntax /include/ , um DTO auf dem Host zu simulieren.

  1. Erstellen Sie eine Kopie des Overlays .dts. Entfernen Sie in der Kopie die erste Zeilenüberschrift. Beispiel:
    /dts-v1/;
    /plugin/;
    
    Speichern Sie die Datei unter my_overlay_dt_wo_header.dts (oder einem beliebigen Dateinamen).
  2. Erstellen Sie eine Kopie der Haupt-.dts. Hängen Sie in der Kopie nach der letzten Zeile die Include-Syntax für die in Schritt 1 erstellte Datei an. Beispiel:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Speichern Sie die Datei unter my_main_dt_with_include.dts (oder einem beliebigen Dateinamen).
  3. Verwenden Sie dtc, um my_main_dt_with_include.dts zu kompilieren und den zusammengeführten DT abzurufen, der das gleiche Ergebnis sein sollte wie bei DTO. Beispiel:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. Dump von my_merged_dt.dto mit dtc.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

DTO in Android 9 überprüfen

Android 9 erfordert eine DTBO-Partition (Device Tree Blob Overlay). Um Knoten hinzuzufügen oder Änderungen an den Eigenschaften im SoC-DT vorzunehmen, muss der Bootloader einen gerätespezifischen DT dynamisch über den SoC-DT legen.

Angewendete Overlays angeben

Damit die Vendor Test Suite (VTS) die Richtigkeit einer Overlay-Anwendung beurteilen kann, müssen Anbieter einen neuen Kernel-Befehlszeilenparameter androidboot.dtbo_idx hinzufügen, der die aus der DTBO-Partition ausgewählten Overlays angibt. In Android 12 mit der Kernelversion 5.10 oder höher wird dieser Parameter über bootconfig übergeben. Der Parameter androidboot.dtbo_idx=x,y,z meldet beispielsweise x, y und z als nullbasierte Indizes der DTOs aus der DTBO-Partition, die vom Bootloader (in dieser Reihenfolge) auf den Basis-DT angewendet wurden.

Overlays können auf Knoten aus dem Haupt-DT angewendet oder neue Knoten hinzugefügt werden, können jedoch nicht auf einen Knoten verweisen, der in einem vorherigen Overlay hinzugefügt wurde. Diese Einschränkung ist erforderlich, da die Overlay-App die Overlay-Symboltabelle nicht mit der DT-Hauptsymboltabelle zusammenführt. Durch das Zusammenführen werden Konflikte bei den Symbolnamen und die Komplikation der Abhängigkeiten zwischen Overlays vermieden.

Beispiel: Ungültige Overlays

In diesem Beispiel bezieht sich overlay_2.dts auf den Knoten e, der von overlay_1.dts hinzugefügt wurde. Nachdem overlay_1 auf den Haupt-DT angewendet wurde und versucht wird, overlay_2 auf den resultierenden DT anzuwenden, schlägt die Overlay-Anwendung mit der Fehlermeldung fehl, dass das Symbol e in der Symboltabelle für den Basis-DT nicht vorhanden ist.

Main.dts overlay_1.dts overlay_2.dts
[main.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};
[overlay_1.dts]

/dts-v1/;
/plugin/;

&b { ref1 =  <&a>;
    e: e {
        prop = <0x0a>;
        phandle = <0x04>;
    };
};
[overlay_2.dts]

/dts-v1/;
/plugin/;

/* invalid! */
&e {
    prop = <0x0b>;
};

Beispiel: Gültige Overlays

In diesem Beispiel bezieht sich overlay_2.dts nur auf den Knoten b aus dem Haupt-DTS. Wenn overlay_1 auf die Basis-DT angewendet wird, folgt auf application der Wert der Eigenschaft prop im Knoten e (von overlay_1.dts gesetzt) wird durch den mit overlay_2.dts gesetzten Wert überschrieben.

main.dts overlay_1.dts overlay_2.dts
[final.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};
[overlay_1.dts]

/dts-v1/;
/plugin/;


&b { ref1 =  <&a>;
     e {
          prop = <0x0c>;
      };
};
[overlay_2.dts]

/dts-v1/;
/plugin/;

/* valid */
&b { ref1 =  <&c>;
     e {
          prop = <0x0d>;
      };
};

DTBO-Partition implementieren

Stellen Sie zum Implementieren der erforderlichen DTBO-Partition sicher, dass der Bootloader die folgenden Aktionen ausführen kann:

  1. Identifizieren Sie das Board, auf dem es ausgeführt wird, und wählen Sie die entsprechenden Overlays aus, die angewendet werden sollen.
  2. Hängen Sie den Parameter androidboot.dtbo_idx an die Kernel-Befehlszeile an.
    • Der Parameter muss die nullbasierten Indizes der DTOs aus dem DTBO-Partitionsabbild angeben, das er auf das Basis-DT (in derselben Reihenfolge) angewendet hat.
    • Die Indizes müssen sich auf die Position des Overlays in der DTBO-Partition beziehen.

Weitere Informationen zum Aufbau der DTBO-Partition finden Sie unter Device Tree Overlays.

DTBO-Partition validieren

Mit VTS können Sie Folgendes überprüfen:

  • Vorhandensein des Kernel-Befehlszeilenparameters androidboot.dtbo_idx (durch Prüfen, dass Init automatisch die entsprechende ro.boot.dtbo_idx-Systemeigenschaft eingerichtet hat).
  • Gültigkeit der Systemeigenschaft ro.boot.dtbo_idx (indem geprüft wird, ob im Attribut mindestens ein gültiger DTBO-Image-Index angegeben ist).
  • Gültigkeit der DTBO-Partition (überprüft auch die Overlays in der DTBO-Partition, die auf das Basis-DT angewendet werden).
  • Zusätzliche Knoten oder Attributänderungen im resultierenden DT werden dem Linux-Kernel angezeigt.

In den folgenden Overlays und beim letzten DT wird die Validierung durch Hinzufügen von androidboot.dtbo_idx=5,3 zur Kernel-Befehlszeile bestanden, wenn androidboot.dtbo_idx=3,5 in die Kernel-Befehlszeile eingefügt wird.

DT überlagern bei Index 3 DT überlagern bei Index 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xfe>; };
[overlay_2.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
Final DT

/dts-v1/;
/ {

 a {
 phandle = <0x1>;
 };

 b {
 phandle = <0x2>;
 };

 c {
 phandle = <0x3>;
 prop = <0xfe>;
 };

 _
 = = "/" / __