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.
- Erstellen Sie eine Kopie des Overlays
.dts
. Entfernen Sie in der Kopie die Kopfzeile der ersten Zeile. Beispiel: Speichern Sie die Datei als/dts-v1/; /plugin/;
my_overlay_dt_wo_header.dts
(oder einen beliebigen anderen Dateinamen). - 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: Speichern Sie die Datei als/include/ "my_overlay_dt_wo_header.dts"
my_main_dt_with_include.dts
(oder einen beliebigen anderen Dateinamen). - Verwende
dtc
, ummy_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
- Verwende
dtc
, ummy_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:
- Geben Sie das Board an, auf dem das Programm 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 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, obInit
die entsprechende Systemeigenschaftro.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"; }; }; |