El formato de código fuente del árbol de dispositivos (DTS) es una representación textual de un árbol de dispositivos (DT). El compilador de árbol de dispositivos (DTC) procesa este formato en un DT binario, que es la forma que espera el kernel de Linux.
Usa referencias
El proyecto DTC (compilador del árbol de dispositivos y parches de superposición) describe el formato DTS en dtc-format.txt y manual.txt.
El formato y las reglas del DTO se describen en dt-object-internal.txt.
En estos documentos, se describe cómo actualizar el DT principal con el nodo fragment@x
y la sintaxis __overlay__
en el DT de superposición. Por ejemplo:
/ { fragment@0 { target = <&some_node>; __overlay__ { some_prop = "okay"; ... }; }; };
Sin embargo, Google recomienda no usar fragment@x
ni la sintaxis __overlay__
, sino la sintaxis de referencia. Por ejemplo:
&some_node { some_prop = "okay"; ... };
dtc
compila la sintaxis de referencia en el mismo objeto que el anterior con la sintaxis __overlay__
. Esta sintaxis no te obliga a numerar los fragmentos, lo que te permite leer y escribir DTS de superposición con facilidad. Si tu dtc
no admite este azúcar sintáctico, usa dtc en AOSP.
Usa etiquetas
Para permitir referencias indefinidas a nodos que no están presentes en el momento de la compilación, el archivo .dts
de DT de superposición debe tener una etiqueta /plugin/
en su encabezado. Por ejemplo:
/dts-v1/; /plugin/;
Desde aquí, puedes segmentar los nodos que se superpondrán con una referencia, que es una ruta de acceso absoluta al nodo con un signo et (&) como prefijo. Por ejemplo, para node@0
en el DT principal:
Define etiquetas en el DT principal… | … luego, usa las etiquetas. |
---|---|
[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>; }; |
Anular
Si la propiedad de destino de referencia existe en el DT principal, se anula después del DTO; de lo contrario, se agrega. Por ejemplo:
main.dts | overlay.dts | Resultado de la combinación |
---|---|---|
[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"; }; }; |
Adjuntar
Si la propiedad de destino de referencia no existe en el DT principal, se agrega después del DTO. Por ejemplo:
main.dts | overlay.dts | Resultado de la combinación |
---|---|---|
[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"; }; }; |
Nodos secundarios
Ejemplos de sintaxis de nodos secundarios:
main.dts | overlay.dts | Resultado de la combinación |
---|---|---|
[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"; }; }; }; |