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.
- Erstellen Sie eine Kopie des Overlays
.dts
. Entfernen Sie in der Kopie die erste Zeilenüberschrift. Beispiel: Speichern Sie die Datei unter/dts-v1/; /plugin/;
my_overlay_dt_wo_header.dts
(oder einem beliebigen Dateinamen). - 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: Speichern Sie die Datei unter/include/ "my_overlay_dt_wo_header.dts"
my_main_dt_with_include.dts
(oder einem beliebigen Dateinamen). - Verwenden Sie
dtc
, ummy_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
- Dump von
my_merged_dt.dto
mitdtc
.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:
- Identifizieren Sie das Board, auf dem es ausgeführt wird, und wählen Sie die entsprechenden Overlays aus, die angewendet werden sollen.
- 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, dassInit
automatisch die entsprechendero.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>; }; _ = = "/" / __ |