Il formato DTS (Device Tree Source) è una rappresentazione testuale di un DT (Device Tree). Il compilatore DT (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__, ma di utilizzare la sintassi di riferimento. Per esempio:
&some_node {
some_prop = "okay";
...
};La sintassi di riferimento viene compilata da dtc nello stesso oggetto di quella sopra utilizzando la sintassi __overlay__. Questa sintassi non ti costringe a numerare i frammenti, consentendoti di leggere e scrivere facilmente DTS di overlay. Se il tuo
dtc non supporta questo zucchero sintattico, utilizza il
dtc
in AOSP.
Utilizzare le etichette
Per consentire riferimenti non definiti ai nodi non presenti in fase di compilazione, il file .dts del DT di overlay deve avere un tag /plugin/ nell'intestazione. Per 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 di 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>; }; |
Sostituisci
Se la proprietà di destinazione del riferimento esiste nel DT principale, viene sostituita dopo il DTO; in caso contrario, viene aggiunta. 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"; }; }; |
Aggiungi
Se la proprietà di destinazione del riferimento non esiste nel DT principale, viene aggiunta dopo il 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 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"; }; }; }; |