Il formato Device Tree Source (DTS) è una rappresentazione testuale di un albero dei dispositivi (DT). Il compilatore dell'albero dei dispositivi (DTC) elabora questo formato in un DT binario, che è il formato previsto dal kernel Linux.
Utilizzare i riferimenti
Il DTC
(Compilatore Albero dei dispositivi + Patch di overlay) descrive il formato DTS in
dtc-format.txt
e
manual.txt.
Il formato e le regole dei DTO sono descritti in
dt-object-internal.txt.
Questi documenti descrivono come aggiornare il DT principale utilizzando
fragment@x
e sintassi __overlay__
nel DT overlay. Per
esempio:
/ { fragment@0 { target = <&some_node>; __overlay__ { some_prop = "okay"; ... }; }; };
Tuttavia, Google consiglia vivamente di non utilizzare
fragment@x
e la sintassi __overlay__
e di utilizzare invece la
sintassi di riferimento. Ad esempio:
&some_node { some_prop = "okay"; ... };
La sintassi di riferimento viene compilata da dtc
nello stesso oggetto di
quello precedente utilizzando la sintassi __overlay__
. Questa sintassi non ti obbliga a
numerare i frammenti, consentendoti di leggere e scrivere facilmente overlay DTS. Se il tuo
dtc
non supporta questa sintassi semplificata, utilizza
dtc
in AOSP.
Utilizzare le etichette
Per consentire riferimenti indefiniti a nodi non presenti al momento della compilazione, il
file DT .dts
deve avere un tag /plugin/
nell'intestazione. Ad esempio:
/dts-v1/; /plugin/;
Da qui puoi scegliere come target i nodi da sovrapporre utilizzando un riferimento, ovvero
un percorso del nodo assoluto con il prefisso &. Ad esempio, per
node@0
nel DT principale:
Definisci le etichette nel DT principale… | ... quindi usa le etichette. |
---|---|
[my_main_dt.dts] /dts-v1/; / { my_node: node@0 { status = "disabled"; my_child: child@0 { value = <0xffffffff>; }; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { status = "okay"; }; &my_child { value = <0x1>; }; |
Ignora
Se la proprietà target di riferimento esiste nel DT principale, viene sostituita dopo il DTO; in caso contrario, viene aggiunta. Ad esempio:
main.dts | overlay.dts | Risultato unito |
---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_node: node@0 { status = "disabled"; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { status = "okay"; }; |
/dts-v1/; / { compatible = "corp,foo"; ... node@0 { linux,phandle = <0x1>; phandle = <0x1>; status = "okay"; }; }; |
Aggiungi
Se la proprietà di destinazione del riferimento non esiste nel DT principale, viene aggiunta dopo DTO. Ad esempio:
main.dts | overlay.dts | Risultato unito |
---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_node: node@0 { status = "okay"; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { new_prop = "bar"; }; |
/dts-v1/; / { compatible = "corp,foo"; ... node@0 { linux,phandle = <0x1>; phandle = <0x1>; status = "okay"; new_prop = "bar"; }; }; |
Nodi secondari
Esempi di sintassi dei nodi secondari:
main.dts | overlay.dts | Risultato unito |
---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_nodes: nodes { compatible = "corp,bar"; node@0 { status = "disabled"; }; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_nodes { new_prop1 = "abc"; node@0 { status = "okay"; new_prop2 = "xyz"; }; }; |
/dts-v1/; / { compatible = "corp,foo"; ... nodes { linux,phandle = <0x1>; phandle = <0x1>; compatible = "corp,bar"; new_prop1 = "abc"; node@0 { linux,phandle = <0x2>; phandle = <0x2>; status = "okay"; new_prop2 = "xyz"; }; }; }; |