È possibile utilizzare Device Tree Compiler (DTC) per compilare i file Device Tree Source. Tuttavia, prima di applicare l'overlay DT sul DT principale di destinazione, è necessario verificare anche il risultato simulando il comportamento del DTO.
Compilazione con DTC
Quando si utilizza dtc
per compilare .dts
, è necessario aggiungere l'opzione -@
per aggiungere un nodo __symbols__
nel .dtbo
risultante. Il nodo __symbols__
contiene un elenco di tutti i nodi contrassegnati da un'etichetta, che la libreria DTO può utilizzare per i riferimenti.
Esempio di comando per compilare DT .dts
principale:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
Esempio di comando per creare l'overlay DT .dts
:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Verificare i risultati DTO sull'host
La verifica può aiutarti a identificare gli errori che potrebbero verificarsi quando si posiziona il DT overlay sul DT principale. Prima di aggiornare la destinazione, è possibile verificare il risultato della sovrapposizione di DT sull'host simulando il comportamento di DTO utilizzando /include/
in .dts
.
/include/
per simulare 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 qualsiasi nome file desiderato). - 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 comemy_main_dt_with_include.dts
(o qualsiasi nome file desiderato). - Usa
dtc
per compilaremy_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
- Usa
dtc
per scaricaremy_merged_dt.dto
.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Verifica DTO in Android 9
Android 9 richiede una partizione DTBO (Device Tree Blob Overlay). Per aggiungere nodi o apportare modifiche alle proprietà nel SoC DT, il bootloader deve sovrapporre dinamicamente un DT specifico del dispositivo al SoC DT.
Indicazione delle sovrapposizioni applicate
Per consentire a Vendor Test Suite (VTS) di valutare la correttezza dell'applicazione overlay, i fornitori devono aggiungere un nuovo parametro della riga di comando del kernel androidboot.dtbo_idx
che indichi gli overlay selezionati dalla partizione DTBO. In Android 12 che utilizza la versione del kernel 5.10 o successiva, questo parametro passa attraverso bootconfig. Ad esempio, il parametro androidboot.dtbo_idx=x,y,z
z
x
, y
come gli indici a base zero dei Device Tree Overlay (DTO) dalla partizione DTBO applicata (in quest'ordine) dal bootloader alla base Struttura dei dispositivi (DT).
Gli overlay possono essere applicati ai nodi dall'albero del dispositivo principale o aggiungere nuovi nodi, ma non possono fare riferimento a un nodo aggiunto in un overlay precedente. Questa restrizione è necessaria perché l'applicazione di sovrapposizione non unisce la tabella dei simboli di sovrapposizione con la tabella dei simboli DT principale (la mancata fusione evita conflitti nei nomi dei simboli e complicanze delle dipendenze tra le sovrapposizioni).
Esempio: overlay non validi
In questo esempio, overlay_2.dts
fa riferimento al nodo e
, che è stato aggiunto da overlay_1.dts
. Dopo overlay_1
è stato applicato al DT principale, se si tenta di applicare overlay_2
al DT risultante, l'applicazione overlay fallirà con un errore 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'applicazione 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>; }; }; |
Implementazione della partizione DTBO
Per implementare la partizione DTBO richiesta, assicurati che il bootloader possa eseguire le seguenti operazioni:
- 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 in base zero dei DTO dall'immagine della partizione DTBO che ha applicato al DT di base (nello stesso ordine).
- Gli indici devono fare riferimento alla posizione dell'overlay nella partizione DTBO.
Per i dettagli sulla struttura della partizione DTBO, fare riferimento a Device Tree Overlays su source.android.com.
Convalida della partizione DTBO
È possibile utilizzare VTS per verificare quanto segue:
- Esistenza del parametro della riga di comando del kernel
androidboot.dtbo_idx
(verificando cheInit
abbia impostato automaticamente la proprietà di sistemaro.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).
- Nodi aggiuntivi o modifiche alle proprietà nel DT risultante vengono presentati al kernel Linux.
Ad esempio, nelle sovrapposizioni seguenti e nel DT finale, l'aggiunta androidboot.dtbo_idx=5,3
alla riga di comando del kernel supera la convalida ma l'aggiunta androidboot.dtbo_idx=3,5
alla riga di comando del kernel non supera la convalida.
Sovrapporre DT all'indice 3 | Sovrapporre 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"; }; }; |
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2022-09-07 UTC.