Kompilieren und verifizieren

Mit dem Device Tree Compiler (DTC) können Sie die Device Tree Source-Dateien (DTS) kompilieren. Bevor Sie den Overlay-Gerätebaum (DT) jedoch auf den Ziel-Haupt-DT anwenden, sollten Sie das Ergebnis durch Simulieren des Verhaltens des Gerätebaum-Overlays (DTO) überprüfen.

Mit DTC kompilieren

Wenn du dtc verwendest, um .dts zu kompilieren, musst du die Option -@ hinzufügen, um dem resultierenden .dtbo einen __symbols__-Knoten hinzuzufügen. Der Knoten __symbols__ enthält eine Liste aller Knoten, die mit einem Label gekennzeichnet sind, das die DTO-Bibliothek als Referenz verwenden kann.

Beispielbefehl zum Erstellen des Haupt-Gerätenbaums .dts:

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

Beispielbefehl zum Erstellen des Overlay-Gerätebaums .dts:

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

DTO-Ergebnisse auf dem Host prüfen

So können Sie Fehler erkennen, die beim Platzieren des Overlay-Gerätebaums im Haupt-Gerätebaum auftreten können. Bevor Sie das Ziel aktualisieren, können Sie das Ergebnis des DT-Overlays auf dem Host prüfen, indem Sie das Verhalten des 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 Kopfzeile der ersten Zeile. Beispiel:
    /dts-v1/;
    /plugin/;
    
     Speichern Sie die Datei als my_overlay_dt_wo_header.dts (oder einen beliebigen anderen Dateinamen).
  2. Erstellen Sie eine Kopie der Haupt-.dts. Fügen Sie in der Kopie nach der letzten Zeile die Include-Syntax für die Datei hinzu, die Sie in Schritt 1 erstellt haben. Beispiel:
    /include/ "my_overlay_dt_wo_header.dts"
    
     Speichern Sie die Datei als my_main_dt_with_include.dts (oder einen beliebigen anderen Dateinamen).
  3. Verwende dtc, um my_main_dt_with_include.dts zu kompilieren und den zusammengeführten Gerätebaum zu erhalten. Das Ergebnis sollte mit dem DTO übereinstimmen. Beispiel:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. Verwende dtc, um my_merged_dt.dto zu dumpen.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

DTO in Android 9 überprüfen

Unter Android 9 ist eine Partition für das Overlay des Gerätebaum-Blobs (Device Tree Blob Overlay, DTBO) erforderlich. Wenn Knoten hinzugefügt oder Änderungen an den Eigenschaften im SoC-Gerätebaum vorgenommen werden sollen, muss der Bootloader dynamisch einen gerätespezifischen Gerätebaum über den SoC-Gerätebaum legen.

Angewandte Overlays angeben

Damit die Vendor Test Suite (VTS) die Richtigkeit der Overlay-App prüfen kann, müssen Anbieter einen neuen Kernel-Befehlszeilenparameter androidboot.dtbo_idx hinzufügen, der die Overlays angibt, die aus der DTBO-Partition ausgewählt wurden. 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 gibt beispielsweise x, y und z als die nullbasierten Indizes der DTOs aus der DTBO-Partition an, die vom Bootloader in dieser Reihenfolge auf die Basis-DT angewendet werden.

Overlays können auf Knoten aus dem Haupt-DT angewendet oder neue Knoten hinzugefügt werden. Sie können sich jedoch nicht auf einen Knoten beziehen, der in einem vorherigen Overlay hinzugefügt wurde. Diese Einschränkung ist erforderlich, da die Overlay-App die Symboltabelle des Overlays nicht mit der Symboltabelle des Haupt-DT zusammenführt. Dadurch werden Konflikte bei Symbolnamen und 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. Wenn nach der Anwendung von overlay_1 auf die Haupt-DT versucht wird, overlay_2 auf die resultierende DT anzuwenden, schlägt die Overlay-App mit der Fehlermeldung fehl, dass das Symbol e nicht in der Symboltabelle für die Basis-DT enthalten 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, gefolgt von der Anwendung overlay_2, wird der Wert des Attributs prop im Knoten e (von overlay_1.dts festgelegt) durch den von overlay_2.dts festgelegten 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

Damit die erforderliche DTBO-Partition implementiert werden kann, muss der Bootloader Folgendes tun können:

  1. Geben Sie das Board an, auf dem das Programm 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 Indexe der DTOs aus dem DTBO-Partitions-Image angeben, die auf die Basis-DT angewendet wurden (in derselben Reihenfolge).
    • Die Indizes müssen sich auf die Position des Overlays in der DTBO-Partition beziehen.

Weitere Informationen zur Struktur der DTBO-Partition finden Sie unter Gerätebaum-Overlays.

DTBO-Partition prüfen

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

  • Vorhandensein des Kernel-Befehlszeilenparameters androidboot.dtbo_idx (prüfen, ob Init die entsprechende Systemeigenschaft ro.boot.dtbo_idx automatisch eingerichtet hat)
  • Gültigkeit der Systemeigenschaft ro.boot.dtbo_idx (wird geprüft, ob die Eigenschaft mindestens einen gültigen DTBO-Bildindex angibt)
  • Gültigkeit der DTBO-Partition (auch die Overlays in der DTBO-Partition werden überprüft, die auf den Basis-DT angewendet werden).
  • Zusätzliche Knoten oder Property-Änderungen im resultierenden DT werden dem Linux-Kernel präsentiert.

In den folgenden Overlays und der finalen Datenträgerdatei wird beispielsweise die Validierung bestanden, wenn androidboot.dtbo_idx=5,3 zur Kernel-Befehlszeile hinzugefügt wird, aber nicht, wenn androidboot.dtbo_idx=3,5 hinzugefügt wird.

Overlay-Gerätebaum an Index 3 Overlay-Gerätebaum an Index 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

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

/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

	__symbols__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};