Il formato DTS (Device Tree source) è una rappresentazione testuale di una struttura ad albero dei dispositivi (DT). Il DTC (Device Tree compiler) 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 utilizza invece
la sintassi di riferimento. Ad esempio:
&some_node { some_prop = "okay"; ... };
La sintassi di riferimento viene compilata da dtc
nello stesso oggetto dell'elemento
in alto utilizzando la sintassi __overlay__
. Questa sintassi non ti obbliga a
numerare i frammenti, in modo da poter leggere e scrivere facilmente DTS overlay. Se le tue
dtc
non supporta questo zucchero sintattico, usa
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/
intestazione. Ad esempio:
/dts-v1/; /plugin/;
Da qui è possibile scegliere come target i nodi da sovrapporre utilizzando un riferimento, che viene
un percorso nodo assoluto preceduto dalla e commerciale (&). Ad esempio, per
node@0
nel DT principale:
Definisci le etichette nel DT principale ... | ... e poi 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à del target di riferimento esiste nel DT principale, viene ignorata dopo DTO; altrimenti 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à del target di riferimento non esiste nel DT principale, 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 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"; }; }; }; |