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 im resultierenden .dtbo
hinzuzufügen. Der Knoten __symbols__
enthält eine Liste aller Knoten, die mit einem Label gekennzeichnet sind, die die DTO-Bibliothek für Verweise 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:/dts-v1/; /plugin/;
Speichern Sie die Datei alsmy_overlay_dt_wo_header.dts
(oder einen beliebigen 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 an, die Sie in Schritt 1 erstellt haben. Beispiel:/include/ "my_overlay_dt_wo_header.dts"
Speichern Sie die Datei alsmy_main_dt_with_include.dts
(oder einen beliebigen Dateinamen). - Verwenden Sie
dtc
, ummy_main_dt_with_include.dts
zu kompilieren, um den zusammengeführten DT zu erhalten. Dies sollte dasselbe Ergebnis wie DTO sein. Beispiel:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Verwenden Sie
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
Android 9 erfordert eine DTBO-Partition (Device Tree Blob Overlay). Um im SoC-DT Knoten hinzuzufügen oder Änderungen an den Eigenschaften vorzunehmen, muss der Bootloader einen gerätespezifischen DT dynamisch über den SoC-DT legen.
Angewendete Overlays angeben
Damit die
Vendor Test Suite (VTS) die Korrektheit der Overlay-Anwendung beurteilen kann, müssen die Anbieter einen neuen Kernel-Befehlszeilenparameter androidboot.dtbo_idx
hinzufügen, der die aus der DTBO-Partition ausgewählten Overlays angibt. In Android 12 mit Kernel-Version 5.10 oder höher wird dieser Parameter durch bootconfig geleitet.
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 sich auf Knoten aus der Haupt-DT beziehen oder neue Knoten hinzufügen, 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 das Haupt-DT angewendet wurde, wird versucht, overlay_2
auf das resultierende DT anzuwenden, und die Overlay-App overlay_2
mit dem Fehler fehl, dass das Symbol e
in der Symboltabelle für das 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 den Basis-DT angewendet wird, gefolgt von der Anwendung von overlay_2
, wird der Wert des Attributs prop
im Knoten e
(festgelegt durch overlay_1.dts
) 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
Um die erforderliche DTBO-Partition zu implementieren, muss der Bootloader die folgenden Aktionen ausführen können:
- Identifizieren Sie die Karte, auf der sie 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 zur Struktur der DTBO-Partition finden Sie unter Gerätestruktur-Overlays.
DTBO-Partition validieren
Mit VTS können Sie Folgendes überprüfen:
- Vorhandensein des Kernel-Befehlszeilenparameters
androidboot.dtbo_idx
(durch Überprüfen, dassInit
automatisch die entsprechendero.boot.dtbo_idx
Systemeigenschaft eingerichtet hat). - Gültigkeit der Systemeigenschaft
ro.boot.dtbo_idx
(indem geprüft wird, ob in der Eigenschaft mindestens ein gültiger DTBO-Image-Index angegeben ist). - Gültigkeit der DTBO-Partition (überprüft auch die auf dem Basis-DT angewendeten Overlays in der DTBO-Partition).
- Zusätzliche Knoten oder Eigenschaftsänderungen im resultierenden DT werden dem Linux-Kernel angezeigt.
In den folgenden Überlagerungen und im letzten DT wird beispielsweise durch das Hinzufügen von androidboot.dtbo_idx=5,3
zur Kernel-Befehlszeile die Validierung bestanden. Durch das Hinzufügen von androidboot.dtbo_idx=3,5
zur Kernel-Befehlszeile wird die Validierung nicht bestanden.
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>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |