Mit dem Device Tree Compiler (DTC) können Sie die DTS-Dateien (Device Tree Source) kompilieren. Bevor Sie den Overlay-Gerätebaum auf den Ziel-Haupt-Gerätebaum anwenden, sollten Sie das Ergebnis jedoch auch überprüfen, indem Sie das Verhalten des Gerätebaum-Overlays simulieren.
Mit DTC kompilieren
Wenn Sie dtc verwenden, um .dts zu kompilieren, müssen Sie die Option -@ hinzufügen, um dem resultierenden .dtbo einen __symbols__-Knoten hinzuzufügen. Der __symbols__-Knoten enthält eine Liste aller Knoten, die mit einem Label gekennzeichnet sind, das von der DTO-Bibliothek für Referenzen verwendet werden kann.
Beispielbefehl zum Erstellen des Haupt-Gerätebaums .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 überprüfen
Die Überprüfung kann Ihnen helfen, Fehler zu 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 Overlaying von Gerätebaum auf dem Host simulieren, indem Sie das Verhalten von Gerätebaum-Overlays mit /include/ in .dts simulieren.

Abbildung 1: Verwenden Sie die Syntax „/include/“, um das DTO auf dem Host zu simulieren.
- Erstelle 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 mit einem beliebigen anderen Dateinamen). - Erstellen Sie eine Kopie der Hauptdatei
.dts. Fügen Sie in der Kopie nach der letzten Zeile die Include-Syntax für die Datei ein, 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 mit einem beliebigen anderen Dateinamen). - Verwenden Sie
dtc, ummy_main_dt_with_include.dtszu kompilieren und den zusammengeführten Gerätebaum zu erhalten. Das Ergebnis sollte dasselbe wie beim DTO sein. Beispiel:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Verwenden Sie
dtc, ummy_merged_dt.dtozu sichern.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Gerätebaum-Overlays unter 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 Sie dem SoC-Gerätebaum Knoten hinzufügen oder Änderungen an den Eigenschaften vornehmen möchten, muss der Bootloader dynamisch einen gerätespezifischen Gerätebaum über den SoC-Gerätebaum legen.
Angewendete Overlays angeben
Damit die
Vendor Test Suite (VTS) die Richtigkeit der Overlay-App bewerten 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 Kernelversion 5.10 oder höher wird dieser Parameter über die Bootkonfiguration übergeben.
Beispielsweise meldet der Parameter androidboot.dtbo_idx=x,y,z die Werte x, y und z als nullbasierte Indexe der DTOs aus der DTBO-Partition, die (in dieser Reihenfolge) vom Bootloader auf den Basis-Gerätebaum angewendet wurden.
Overlays können auf Knoten aus dem Haupt-Gerätebaum angewendet werden oder neue Knoten hinzufügen. Sie 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 Symboltabelle des Overlays nicht mit der Symboltabelle des Haupt-Gerätebaums zusammenführt. Dadurch werden Konflikte bei Symbolnamen und Komplikationen bei 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-Gerätebaum angewendet wurde, schlägt der Versuch, overlay_2 auf den resultierenden Gerätebaum anzuwenden, mit einem Fehler fehl, dass das Symbol e nicht in der Symboltabelle für den Basis-Gerätebaum 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-Gerätebaum 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
Damit die erforderliche DTBO-Partition implementiert werden kann, muss der Bootloader Folgendes ausführen können:
- 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_idxan die Kernel-Befehlszeile an.- Der Parameter muss die nullbasierten Indexe der DTOs aus dem DTBO-Partitions-Image angeben, die auf den Basis-Gerätebaum angewendet wurden (in derselben Reihenfolge).
- Die Indexe müssen sich auf die Position des Overlays auf der DTBO-Partition beziehen.
Weitere Informationen zur Struktur der DTBO-Partition finden Sie unter Gerätebaum-Overlays.
DTBO-Partition validieren
Mit VTS können Sie Folgendes überprüfen:
- Vorhandensein des Kernel-Befehlszeilenparameters
androidboot.dtbo_idx(indem geprüft wird, obInitdie entsprechendero.boot.dtbo_idx-Systemeigenschaft automatisch eingerichtet hat). - Gültigkeit der Systemeigenschaft
ro.boot.dtbo_idx(durch Prüfen, ob die Eigenschaft mindestens einen gültigen DTBO-Bildindex angibt). - Gültigkeit der DTBO-Partition (damit werden auch die Overlays in der DTBO-Partition überprüft, die auf den Basis-Gerätebaum angewendet werden).
- Zusätzliche Knoten oder Änderungen an Eigenschaften im resultierenden Gerätebaum werden dem Linux-Kernel präsentiert.
In den folgenden Overlays und dem endgültigen Gerätebaum wird beispielsweise die Validierung bestanden, wenn androidboot.dtbo_idx=5,3 der Kernel-Befehlszeile hinzugefügt wird. Wenn androidboot.dtbo_idx=3,5 der Kernel-Befehlszeile hinzugefügt wird, wird die Validierung nicht bestanden.
| Overlay-Gerätebaum bei Index 3 | Overlay-Gerätebaum bei Index 5 |
|---|---|
[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";
};
};
|