Puoi utilizzare il compilatore Device Tree (DTC) per compilare i file di origine Device Tree (DTS). Tuttavia, prima di applicare l'overlay del Device Tree (DT) al DT principale di destinazione, devi anche verificare il risultato simulando il comportamento dell'overlay del Device Tree (DTO).
Compilare con DTC
Quando utilizzi dtc per compilare .dts, devi aggiungere
l'opzione -@ per aggiungere un nodo __symbols__ al file .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 il DT di overlay .dts:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Verificare i risultati dei DTO sull'host
La verifica può aiutarti a identificare gli errori che potrebbero verificarsi quando inserisci
il DT di overlay nel DT principale. Prima di aggiornare la destinazione, puoi verificare il
risultato dell'overlay del DT sull'host simulando il comportamento del DTO utilizzando
/include/ in .dts.

Figura 1. Utilizza la sintassi /include/ per simulare il DTO sull'host.
- Crea una copia del file
.dtsdi overlay. Nella copia, rimuovi l' intestazione della prima riga. Esempio: Salva il file come/dts-v1/; /plugin/;
my_overlay_dt_wo_header.dts(o qualsiasi altro nome file). - Crea una copia del file
.dtsprincipale. Nella copia, dopo l' ultima riga, aggiungi la sintassi di inclusione per il file creato nel passaggio 1. Ad esempio: Salva il file come/include/ "my_overlay_dt_wo_header.dts"
my_main_dt_with_include.dts(o qualsiasi altro nome file). - Utilizza
dtcper compilaremy_main_dt_with_include.dtsper ottenere il DT unito, che dovrebbe essere lo stesso risultato del DTO. Ad esempio:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Utilizza
dtcper eseguire il dump dimy_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 di overlay del BLOB di Device Tree (DTBO). Per aggiungere nodi o apportare modifiche alle proprietà nel DT SoC, il bootloader deve sovrapporre dinamicamente un DT specifico del dispositivo al DT SoC.
Indicare gli overlay applicati
Per consentire a
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 la versione kernel
5.10 o successive, questo parametro viene trasmesso tramite bootconfig.
Ad esempio, il parametro androidboot.dtbo_idx=x,y,z segnala
x, y e z come gli indici a base zero dei
DTO dalla partizione DTBO applicata (in questo ordine)
dal bootloader al DT di base.
Gli overlay possono essere applicati ai nodi del 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 del DT principale (la mancata unione evita conflitti nei nomi dei simboli e la complicazione delle dipendenze tra gli overlay).
Esempio: overlay non validi
In questo esempio, overlay_2.dts fa riferimento al nodo
e , che è stato aggiunto da
overlay_1.dts. Dopo aver applicato overlay_1 al
DT principale, se si tenta 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 fa riferimento 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>;
};
};
|
Implementare la partizione DTBO
Per implementare la partizione DTBO richiesta, assicurati che il bootloader possa eseguire le seguenti operazioni:
- Identificare la scheda su cui è in esecuzione e selezionare gli overlay corrispondenti da applicare.
- Aggiungere il parametro
androidboot.dtbo_idxalla 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 partition.
Per maggiori dettagli sulla struttura della partizione DTBO, consulta Overlay di Device Tree.
Convalidare la partizione DTBO
Puoi utilizzare VTS per verificare quanto segue:
- Esistenza del parametro della riga di comando del kernel
androidboot.dtbo_idx(controllando cheInitabbia configurato automaticamente la proprietà di sistemaro.boot.dtbo_idxcorrispondente). - Validità della proprietà di sistema
ro.boot.dtbo_idx(controllando 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 delle proprietà nel DT risultante vengono presentati al kernel Linux.
Ad esempio, nei seguenti overlay e nel 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.
| DT di overlay all'indice 3 | DT di overlay 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";
};
};
|