Kompilieren und verifizieren

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.

  1. 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 Namen my_overlay_dt_wo_header.dts (oder einem beliebigen anderen Speicherort). den gewünschten Dateinamen).
  2. 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 Namen my_main_dt_with_include.dts (oder einem beliebigen anderen Speicherort). den gewünschten Dateinamen).
  3. dtc zum Kompilieren verwenden my_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
    
  4. Dump von my_merged_dt.dto mit dtc.
    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. So gibt beispielsweise 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 den 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:

  1. Identifizieren Sie das Board, auf dem es ausgeführt wird, und wählen Sie das entsprechende angewendete Overlays.
  2. 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, ob Init Das entsprechende ro.boot.dtbo_idx-System automatisch einrichten Property).
  • 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 endgültigen 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";

	};
};