Il formato Device Tree Source (DTS) è una rappresentazione testuale di un albero di dispositivi. Il Device Tree Compiler (DTC) elabora questo formato in un albero di dispositivi binario, che è la forma prevista dal kernel Linux.
Utilizzo di riferimenti
Il progetto DTC (Device Tree compiler + overlay patches) descrive il formato DTS in dtc-format.txt e manual.txt . Il formato e le regole DTO sono descritti in dt-object-internal.txt . Questi documenti descrivono come aggiornare il DT principale utilizzando il nodo fragment@x
e la sintassi __overlay__
in overlay DT. 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. Per esempio:
&some_node { some_prop = "okay"; ... };
La sintassi di riferimento viene compilata da dtc
nello stesso oggetto di cui sopra utilizzando la sintassi __overlay__
. Questa sintassi non ti obbliga a numerare i frammenti, consentendoti di leggere e scrivere facilmente DTS sovrapposti. Se il tuo dtc
non supporta questo zucchero sintattico, usa il dtc in AOSP .
Usare le etichette
Per consentire riferimenti indefiniti a nodi non presenti in fase di compilazione, il file DT .dts
overlay deve avere un tag /plugin/
nell'intestazione. Per esempio:
/dts-v1/; /plugin/;
Da qui puoi scegliere come target i nodi da sovrapporre usando un riferimento, che è un percorso del nodo assoluto preceduto da una e commerciale (&). Ad esempio, per node@0
nel DT principale:
Definisci 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>; }; |
Override
Se la proprietà target di riferimento esiste nel DT principale, viene sovrascritta dopo DTO; in caso contrario, viene aggiunto. Per 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"; }; }; |
Appendendo
Se la proprietà target di riferimento non esiste nel DT principale, viene aggiunta dopo DTO. Per 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 figli
Esempi di sintassi del nodo figlio:
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"; }; }; }; |