Sie können den Device Tree Compiler (DTC) verwenden, um die Device Tree Source (DTS) zu kompilieren. Dateien. Bevor Sie jedoch die Overlay-Gerätestruktur auf den Ziel-Haupt-DT anwenden, Das Ergebnis sollte außerdem überprüft werden, indem das Verhalten des Device Tree Overlay (DTO) simuliert wird.
Mit DTC kompilieren
Wenn Sie dtc
zum Kompilieren von .dts
verwenden, müssen Sie
Option -@
, um einen __symbols__
-Knoten im
Daraus ergibt sich .dtbo
. Der __symbols__
-Knoten enthält ein
Liste aller Knoten, die mit einem Label markiert sind, das die DTO-Bibliothek verwenden kann
als Referenz.
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
Overlay-DT auf dem Haupt-DT. Bevor Sie das Ziel aktualisieren, können Sie prüfen,
Ergebnis der Überlagerung von DT auf dem Host durch Simulation des Verhaltens von DTO mithilfe von
/include/
in .dts
.
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 in der ersten Zeile. Beispiel:/dts-v1/; /plugin/;
Speichern Sie die Datei unter dem Namenmy_overlay_dt_wo_header.dts
(oder einem beliebigen anderen Speicherort). den gewünschten Dateinamen). - Erstellen Sie eine Kopie der Haupt-
.dts
. In der Kopie wird nach dem Tag fügen Sie die Einschließen-Syntax für die Datei an, die Sie in Schritt 1 erstellt haben. Hier einige Beispiele:/include/ "my_overlay_dt_wo_header.dts"
Speichern Sie die Datei unter dem Namenmy_main_dt_with_include.dts
(oder einem beliebigen anderen Speicherort). den gewünschten Dateinamen). dtc
zum Kompilieren verwendenmy_main_dt_with_include.dts
, um den zusammengeführten DT abzurufen, der in der Regel das gleiche Ergebnis wie DTO sein. Hier einige Beispiele: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 überprüfen 9
Android 9 erfordert ein Gerätebaum-Blob-Overlay DTBO-Partition. Knoten hinzufügen oder Änderungen an den Attributen im SoC vornehmen DT: Der Bootloader muss ein gerätespezifisches DT dynamisch über SoC DT.
Angewendete Overlays angeben
Um den
Vendor Test Suite (VTS) zur Beurteilung der Richtigkeit von Overlays
Anwendung finden, müssen Anbieter einen neuen Kernel-Befehlszeilenparameter
androidboot.dtbo_idx
gibt die Overlays an, die aus
die DTBO-Partition. In Android 12 mit der Kernel-Version
5.10 oder höher, wird dieser Parameter durch bootconfig weitergeleitet.
Beispielsweise gibt der Parameter androidboot.dtbo_idx=x,y,z
x
, y
und z
als nullbasierte Indizes von
die DTOs aus der angewendeten DTBO-Partition (in dieser Reihenfolge)
vom Bootloader an den Basis-DT an.
Overlays können auf Knoten vom Haupt-DT angewendet oder neue Knoten hinzugefügt, aber nicht auf einen Knoten verweisen, der in einem vorherigen Overlay hinzugefügt wurde. Dieses -Einschränkung ist notwendig, da die Overlay-App das Überlagere Symboltabelle mit der DT-Hauptsymboltabelle (keine Zusammenführung verhindert Konflikten bei Symbolnamen und Komplikationen bei Abhängigkeiten zwischen Overlays).
Beispiel: Ungültige Overlays
In diesem Beispiel bezieht sich overlay_2.dts
auf den Knoten
e
, hinzugefügt von
overlay_1.dts
Nachdem overlay_1
auf das Ereignis
Haupt-DT, wenn versucht wird, overlay_2
auf den
resultierender DT schlägt die Overlay-App mit dem Fehler fehl, dass das Symbol
e
ist nicht in der Symboltabelle für die
Basis-DT fest.
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. Wann?
overlay_1
wird auf die Basis-DT angewendet, dann folgt der
Anwendung von overlay_2
, der Wert der Eigenschaft
prop
im Knoten e
(von overlay_1.dts
festgelegt) wird durch den Wert überschrieben, der von
overlay_2.dts
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 Folgendes:
- Identifizieren Sie das Board, auf dem es ausgeführt wird, und wählen Sie das entsprechende angewendete Overlays.
- Parameter
androidboot.dtbo_idx
an den Kernel anhängen Befehlszeile.- Der Parameter muss die nullbasierten Indizes der DTOs angeben, aus dem DTBO-Partitions-Image, das auf das Basis-DT angewendet wurde (im Reihenfolge).
- Die Indizes müssen sich auf die Position des Overlays im DTBO beziehen. -Partition an.
Details 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
(indem geprüft wird, obInit
Das entsprechendero.boot.dtbo_idx
-System automatisch einrichten . - Gültigkeit der Systemeigenschaft
ro.boot.dtbo_idx
(durch Prüfen, ob die Eigenschaft mindestens ein gültiges DTBO-Image angibt Index). - Gültigkeit der DTBO-Partition (überprüft auch die Overlays in DTBO die auf das Basis-DT angewendet werden).
- Zusätzliche Knoten oder Eigenschaftsänderungen im resultierenden DT werden angezeigt mit dem Linux-Kernel.
In den folgenden Overlays und finalen DTs wird beispielsweise
androidboot.dtbo_idx=5,3
an die Kernel-Befehlszeile wird übergeben
Validierung, aber dem Kernel wird androidboot.dtbo_idx=3,5
hinzugefügt
die Befehlszeile die Validierung nicht besteht.
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>; }; |
Endgültige DT |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbole__ { a = "/a"; b = "/b"; c = "/c"; }; }; |