Sie können den Device Tree Compiler (DTC) verwenden, um die Device Tree-Quelldateien zu kompilieren. Bevor Sie jedoch das Overlay-DT auf das Ziel-Haupt-DT anwenden, sollten Sie das Ergebnis auch überprüfen, indem Sie das Verhalten von DTO simulieren.
Kompilieren mit DTC
Wenn Sie dtc
zum Kompilieren .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, das die DTO-Bibliothek für Referenzen verwenden kann.
Beispielbefehl zum Erstellen der 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
Überprüfen Sie die DTO-Ergebnisse auf dem Host
Die Überprüfung kann Ihnen dabei helfen, Fehler zu identifizieren, die beim Platzieren des Overlay-DT auf dem Haupt-DT auftreten könnten. Bevor Sie das Ziel aktualisieren, können Sie das Ergebnis der DT-Überlagerung auf dem Host überprüfen, indem Sie das Verhalten von DTO mithilfe von /include/
in .dts
simulieren.
/include/
um DTO auf dem Host zu simulieren- Erstellen Sie eine Kopie der Overlay
.dts
. Entfernen Sie in der Kopie die Kopfzeile der ersten Zeile. Beispiel:/dts-v1/; /plugin/;
Speichern Sie die Datei untermy_overlay_dt_wo_header.dts
(oder einem 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 hinzu, 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, der das gleiche Ergebnis wie DTO liefern sollte. Beispiel:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Verwenden Sie
dtc
ummy_merged_dt.dto
zu sichern.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Überprüfen von DTO in Android 9
Für Android 9 ist eine DTBO-Partition (Device Tree Blob Overlay) erforderlich. Um Knoten hinzuzufügen oder Änderungen an den Eigenschaften im SoC-DT vorzunehmen, muss der Bootloader dynamisch einen gerätespezifischen DT über den SoC-DT legen.
Zeigt angewendete Overlays an
Damit die Vendor Test Suite (VTS) die Korrektheit der 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 Kernel-Version 5.10 oder höher wird dieser Parameter über bootconfig übergeben. Beispielsweise meldet der Parameter androidboot.dtbo_idx=x,y,z
x
, y
und z
als nullbasierte Indizes der Device Tree Overlays (DTOs) aus der DTBO-Partition, die (in dieser Reihenfolge) vom Bootloader auf die Basis angewendet wurden Gerätebaum (DT).
Overlays können auf Knoten aus dem Hauptgerätebaum angewendet werden oder neue Knoten hinzufügen, können sich jedoch nicht auf einen Knoten beziehen, der in einem vorherigen Overlay hinzugefügt wurde. Diese Einschränkung ist notwendig, da die Overlay-Anwendung die Overlay-Symboltabelle nicht mit der Haupt-DT-Symboltabelle zusammenführt (keine Zusammenführung vermeidet Konflikte bei Symbolnamen und komplizierte Abhängigkeiten zwischen Overlays).
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 und versucht wird, overlay_2
auf das resultierende DT anzuwenden, schlägt die Overlay-Anwendung mit der Fehlermeldung fehl, dass das Symbol e
nicht in der Symboltabelle für das Basis-DT 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 Knoten b
vom Haupt-DTS. Wenn overlay_1
auf den Basis-DT angewendet wird und anschließend overlay_2
angewendet wird, wird der Wert der Eigenschaft prop
im Knoten e
(festgelegt durch overlay_1.dts
) durch den durch 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>; }; }; |
Implementierung der DTBO-Partition
Um die erforderliche DTBO-Partition zu implementieren, stellen Sie sicher, dass der Bootloader Folgendes tun kann:
- Identifizieren Sie die Platine, auf der es läuft, 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-Partitionsbild angeben, das er auf den Basis-DT angewendet hat (in derselben Reihenfolge).
- Die Indizes müssen sich auf die Position des Overlays in der DTBO-Partition beziehen.
Einzelheiten zur Struktur der DTBO-Partition finden Sie unter Device Tree Overlays auf source.android.com.
Validierung der DTBO-Partition
Mit VTS können Sie Folgendes überprüfen:
- Vorhandensein des Kernel-Befehlszeilenparameters
androidboot.dtbo_idx
(durch Überprüfung, obInit
die entsprechende Systemeigenschaftro.boot.dtbo_idx
automatisch eingerichtet hat). - Gültigkeit der Systemeigenschaft
ro.boot.dtbo_idx
(durch Überprüfung, ob die Eigenschaft mindestens einen gültigen DTBO-Bildindex angibt). - 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 Eigenschaftsänderungen im resultierenden DT werden dem Linux-Kernel angezeigt.
Beispielsweise besteht in den folgenden Overlays und dem endgültigen DT das Hinzufügen von androidboot.dtbo_idx=5,3
zur Kernel-Befehlszeile die Validierung, das Hinzufügen androidboot.dtbo_idx=3,5
zur Kernel-Befehlszeile führt jedoch nicht zu einer Validierung.
Overlay DT bei Index 3 | DT bei Index 5 überlagern |
---|---|
[overlay_1.dts] /dts-v1/; /plugin/; &c { prop = <0xfe>; }; | [overlay_2.dts] /dts-v1/; /plugin/; &c { prop = <0xff>; }; |
Endgültiger DT |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |
Alle Inhalte und Codebeispiele auf dieser Seite unterliegen den Lizenzen wie im Abschnitt Inhaltslizenz beschrieben. Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder seinen Tochtergesellschaften.
Zuletzt aktualisiert: 2023-09-07 (UTC).