Kompilieren & Verifizieren

Sie können Device Tree Compiler (DTC) verwenden, um die Device Tree Source-Dateien zu kompilieren. Bevor Sie jedoch das Überlagerungs-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 von .dts , müssen Sie die Option -@ hinzufügen, um einen __symbols__ Knoten in der resultierenden .dtbo . Der Knoten __symbols__ enthält eine Liste aller mit einem Label gekennzeichneten Knoten, die die DTO-Bibliothek für Referenzen verwenden kann.

Beispielbefehl zum Erstellen von 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-BMK auf dem Haupt-BMK 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 .

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 . Hängen 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 unter my_main_dt_with_include.dts (oder einem beliebigen Dateinamen).
  3. Verwenden Sie my_main_dt_with_include.dts dtc kompilieren, um das zusammengeführte DT zu erhalten, das dasselbe Ergebnis wie DTO sein sollte. Zum 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üfung von DTO in Android 9

Android 9 erfordert eine Device Tree Blob Overlay (DTBO)-Partition. 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 Überlagerungen an

Damit die Vendor Test Suite (VTS) die Korrektheit der Overlay-Anwendung bewerten kann, müssen Anbieter einen neuen Kernel-Befehlszeilenparameter androidboot.dtbo_idx , der die von der DTBO-Partition ausgewählten Overlays angibt. In Android 12 mit Kernel-Version 5.10 oder höher durchläuft dieser Parameter bootconfig. Beispielsweise meldet der Parameter androidboot.dtbo_idx=x,y,z x , y und z als die nullbasierten Indizes der Device Tree Overlays (DTOs) von der DTBO-Partition, die (in dieser Reihenfolge) vom Bootloader auf die Basis angewendet werden Gerätebaum (DT).

Overlays können auf Knoten aus dem Hauptgerätebaum angewendet oder neue Knoten hinzugefügt werden, aber nicht auf einen Knoten verweisen, 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 (das Nicht-Mischen vermeidet Konflikte in Symbolnamen und komplizierte Abhängigkeiten zwischen Overlays).

Beispiel: Ungültige Overlays

In diesem Beispiel verweist overlay_2.dts auf den Knoten e , der durch 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 einem Fehler 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 das Basis-DT angewendet wird, gefolgt von der Anwendung von overlay_2 , wird der Wert der Eigenschaft prop in Knoten e (festgelegt durch overlay_1.dts ) durch den Wert überschrieben, der durch overlay_2.dts festgelegt wird.

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 das Board, auf dem es ausgeführt wird, 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-Partitionsabbild angeben, das er auf das 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

Sie können VTS verwenden, um Folgendes zu überprüfen:

  • Vorhandensein des Kernel-Befehlszeilenparameters androidboot.dtbo_idx (durch Überprüfung, ob Init automatisch die entsprechende ro.boot.dtbo_idx eingerichtet hat).
  • Gültigkeit der 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 präsentiert.

Beispielsweise besteht in den folgenden Überlagerungen und dem abschließenden DT das Hinzufügen von androidboot.dtbo_idx=5,3 zur Kernel-Befehlszeile die Validierung, aber das Hinzufügen von androidboot.dtbo_idx=3,5 zur Kernel-Befehlszeile besteht die Validierung nicht.

Overlay DT bei Index 3 Overlay DT bei Index 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xfe>; };
[overlay_2.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
Letzte DT
/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

	c {
		phandle = <0x3>;
		prop = <0xfe>;
	};

	__symbols__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};