Kompilieren und Verifizieren

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.

Abbildung 1. Verwenden Sie die Syntax /include/ um DTO auf dem Host zu simulieren
  1. 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 unter my_overlay_dt_wo_header.dts (oder einem beliebigen Dateinamen).
  2. 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 als my_main_dt_with_include.dts (oder einen beliebigen Dateinamen).
  3. Verwenden Sie dtc , um my_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
    
  4. Verwenden Sie dtc um my_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 erforderlich, 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:

  1. Identifizieren Sie die Platine, auf der es läuft, und wählen Sie die entsprechenden Overlays aus, die angewendet werden sollen.
  2. 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, ob Init die entsprechende Systemeigenschaft ro.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";
	};
};