Compila e verifica

Puoi utilizzare il compilatore dell'albero dei dispositivi (DTC) per compilare i file sorgente dell'albero dei dispositivi (DTS). Tuttavia, prima di applicare l'albero dei dispositivi (DT) in overlay al DT principale di destinazione, devi anche verificare il risultato simulando il comportamento dell'overlay dell'albero dei dispositivi (DTO).

Compilare con DTC

Quando utilizzi dtc per compilare .dts, devi aggiungere l'opzione -@ per aggiungere un nodo __symbols__ nel .dtbo risultante. Il nodo __symbols__ contiene un elenco di tutti i nodi contrassegnati con un'etichetta, che la libreria DTO può utilizzare per i riferimenti.

Comando di esempio per creare il DT principale .dts:

dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

Comando di esempio per creare l'overlay DT .dts:

dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

Verifica i risultati del DTO sull'host

La verifica può aiutarti a identificare gli errori che potrebbero verificarsi durante il posizionamento della DT overlay sulla DT principale. Prima di aggiornare la destinazione, puoi verificare il risultato della sovrapposizione di DT sull'host simulando il comportamento di DTO utilizzando /include/ in .dts.

Figura 1. Utilizza la sintassi /include/ per simulare il DTO sull'host.

  1. Crea una copia dell'overlay .dts. Nella copia, rimuovi l'intestazione della prima riga. Esempio:
    /dts-v1/;
    /plugin/;
    
    Salva il file come my_overlay_dt_wo_header.dts (o qualsiasi altro nome file).
  2. Crea una copia del .dts principale. Nella copia, dopo l'ultima riga, aggiungi la sintassi include per il file creato nel passaggio 1. Ad esempio:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Salva il file come my_main_dt_with_include.dts (o qualsiasi altro nome file).
  3. Utilizza dtc per compilare my_main_dt_with_include.dts per ottenere il DT unito, che dovrebbe essere lo stesso risultato di DTO. Ad esempio:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. Utilizza dtc per scaricare my_merged_dt.dto.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

Verificare il DTO in Android 9

Android 9 richiede una partizione DTBO (Device Tree Blob Overlay). Per aggiungere nodi o apportare modifiche alle proprietà nel DT SoC, il bootloader deve sovrapporre dinamicamente un DT specifico del dispositivo al DT SoC.

Indica gli overlay applicati

Per consentire alla Vendor Test Suite (VTS) di valutare la correttezza dell'app di overlay, i fornitori devono aggiungere un nuovo parametro della riga di comando del kernel androidboot.dtbo_idx che indica gli overlay selezionati dalla partizione DTBO. In Android 12 con versione del kernel 5.10 o successive, questo parametro viene passato tramite bootconfig. Ad esempio, il parametro androidboot.dtbo_idx=x,y,z riporta x, y e z come indici a base zero dei DTO della partizione DTBO applicata (in questo ordine) dal bootloader al DT di base.

Gli overlay possono essere applicati ai nodi della DT principale o aggiungere nuovi nodi, ma non possono fare riferimento a un nodo aggiunto in un overlay precedente. Questa limitazione è necessaria perché l'app di overlay non unisce la tabella dei simboli di overlay con la tabella dei simboli DT principale (l'unione evita conflitti nei nomi dei simboli e complicazioni delle dipendenze tra overlay).

Esempio: overlay non validi

In questo esempio, overlay_2.dts si riferisce al nodo e , aggiunto da overlay_1.dts. Dopo l'applicazione di overlay_1 al DT principale, se viene effettuato un tentativo di applicare overlay_2 al DT risultante, l'app di overlay non riesce a causa di un errore che indica che il simbolo e non è presente nella tabella dei simboli per il DT di base.

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>;
};

Esempio: overlay validi

In questo esempio, overlay_2.dts si riferisce solo al nodo b del DTS principale. Quando overlay_1 viene applicato al DT di base, seguito dall'app di overlay_2, il valore della proprietà prop nel nodo e (impostato da overlay_1.dts) viene sovrascritto dal valore impostato da 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>;
      };
};

Implementa la partizione DTBO

Per implementare la partizione DTBO richiesta, assicurati che il bootloader possa eseguire le seguenti operazioni:

  1. Identifica la scheda su cui viene eseguito e seleziona gli overlay corrispondenti da applicare.
  2. Aggiungi il parametro androidboot.dtbo_idx alla riga di comando del kernel.
    • Il parametro deve indicare gli indici a base zero dei DTO dall'immagine della partizione DTBO applicata al DT di base (nello stesso dell'ordine).
    • Gli indici devono fare riferimento alla posizione dell'overlay nella partizione DTBO.

Per informazioni dettagliate sulla struttura della partizione DTBO, consulta Overlay dell'albero dei dispositivi.

Convalida la partizione DTBO

Puoi utilizzare VTS per verificare quanto segue:

  • Esistenza del parametro della riga di comando del kernel androidboot.dtbo_idx (verificando che Init abbia configurato automaticamente la proprietà di sistema ro.boot.dtbo_idx corrispondente).
  • Validità della proprietà di sistema ro.boot.dtbo_idx (verificando che la proprietà specifichi almeno un indice di immagine DTBO valido).
  • Validità della partizione DTBO (verifica anche gli overlay nella partizione DTBO applicati al DT di base).
  • I nodi aggiuntivi o le modifiche alle proprietà nel DT risultante vengono presentati al kernel Linux.

Ad esempio, nelle seguenti sovrapposizioni e DT finale, l'aggiunta di androidboot.dtbo_idx=5,3 alla riga di comando del kernel supera la convalida, mentre l'aggiunta di androidboot.dtbo_idx=3,5 alla riga di comando del kernel non supera la convalida.

Overlay DT all'indice 3 Overlay DT all'indice 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
DT finale

/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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