Puoi utilizzare il compilatore dell'albero dei dispositivi (DTC) per compilare i file DTS (sorgente dell'albero dei dispositivi). Tuttavia, prima di applicare la struttura ad albero del dispositivo (DT) in overlay al DT principale di destinazione, devi anche verificare il risultato simulando il comportamento della struttura ad albero del dispositivo in overlay (DTO).
Compilare con DTC
Quando utilizzi dtc
per compilare .dts
, devi aggiungere
l'opzione -@
per aggiungere un nodo __symbols__
nell'elemento
.dtbo
risultante. Il nodo __symbols__
contiene un
elenco di tutti i nodi contrassegnati da un'etichetta, che la raccolta DTO può utilizzare
come 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 overlay .dts
:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Verifica i risultati DTO sull'host
La verifica può aiutarti a identificare gli errori che potrebbero verificarsi durante il posizionamento del set di dati in overlay sul set di dati principale. Prima di aggiornare il target, puoi verificare il risultato dell'applicazione 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 dell'overlay
.dts
. Nella copia, rimuovi l'intestazione della prima riga. Esempio:/dts-v1/; /plugin/;
Salva il file comemy_overlay_dt_wo_header.dts
(o come preferisci). - Crea una copia del
.dts
principale. Nella copia, dopo l'ultima riga, aggiungi la sintassi di inclusione per il file creato nel passaggio 1. Ad esempio:/include/ "my_overlay_dt_wo_header.dts"
Salva il file comemy_main_dt_with_include.dts
(o qualsiasi nome file che preferisci). - Utilizza
dtc
per compilaremy_main_dt_with_include.dts
per ottenere il DT unito, che dovrebbe avere lo stesso risultato del DTO. Ad esempio:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Utilizza
dtc
per 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 DTBO (Device Tree Blob Overlay). Per aggiungere nodi o apportare modifiche alle proprietà nel DT del SoC, il bootloader deve sovrapporre dinamicamente un DT specifico del dispositivo sul DT del SoC.
Indicare gli overlay applicati
Per abilitare la
Vendor Test Suite (VTS) e valutare la correttezza dell'app di overlay, i fornitori devono aggiungere un nuovo parametro della riga di comando kernel
androidboot.dtbo_idx
che indichi gli overlay selezionati dalla
partizione DTBO. In Android 12 con kernel versione 5.10 o successiva, questo parametro passa attraverso bootconfig.
Ad esempio, il parametro androidboot.dtbo_idx=x,y,z
riporta x
, y
e z
come indici a zero dei DTO della partizione DTBO applicati (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 in overlay non unisce la tabella dei simboli in overlay con la tabella dei simboli del DT principale (l'unione evita conflitti nei nomi dei simboli e complicazioni delle dipendenze tra gli overlay).
Esempio: overlay non validi
In questo esempio, overlay_2.dts
si riferisce 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 overlay non riesce e restituisce un errore che informa 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>; }; }; |
Implementare la partizione DTBO
Per implementare la partizione DTBO richiesta, assicurati che il bootloader possa eseguire quanto segue:
- Identifica la scheda su cui è in esecuzione e seleziona gli overlay corrispondenti da applicare.
- 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 della struttura ad albero del dispositivo.
Convalida la partizione DTBO
Puoi utilizzare VTS per verificare quanto segue:
- Esistenza del parametro della riga di comando del kernel
androidboot.dtbo_idx
(controllando cheInit
abbia configurato automaticamente la proprietà di sistemaro.boot.dtbo_idx
corrispondente). - 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 (vengono verificati anche gli overlay nella partizione DTBO applicati al DT di base).
- Ulteriori nodi o modifiche alle 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, ma 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"; }; }; |