Il formato DTS (Device Tree Source) è una rappresentazione testuale di un albero dei dispositivi (DT). Il compilatore dell'albero dei dispositivi (DTC) elabora questo formato in un DT binario, che è la forma prevista 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__
, ma di utilizzare la sintassi di riferimento. Ad esempio:
&some_node { some_prop = "okay"; ... };
La sintassi di riferimento viene compilata da dtc
nello stesso oggetto di sopra utilizzando la sintassi __overlay__
. Questa sintassi non ti obbliga a numerare i frammenti, il che ti consente di leggere e scrivere facilmente i file DTS overlay. Se il tuo
dtc
non supporta questa sintassi, utilizza il
dtc
in AOSP.
Utilizzare le etichette
Per consentire riferimenti non definiti a nodi non presenti al momento della compilazione, il
file DT .dts
dell'overlay deve avere un tag /plugin/
nell'header. Ad esempio:
/dts-v1/; /plugin/;
Da qui puoi scegliere come target i nodi da sovrapporre utilizzando un riferimento, ovvero un percorso del nodo assoluto preceduto da una e commerciale (&). Ad esempio, per node@0
nel DT principale:
Definisci le etichette nel DT principale ... | ... quindi utilizza 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à target di riferimento non esiste nel DT principale, viene aggiunta dopo il 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 del nodo secondario:
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"; }; }; }; |