O formato Device Tree Source (DTS) é uma representação textual de uma árvore de dispositivos. O Device Tree Compiler (DTC) processa esse formato em uma árvore de dispositivos binários, que é a forma esperada pelo kernel do Linux.
Usando referências
O projeto DTC (Compilador de Árvore de Dispositivos + patches de sobreposição) descreve o formato DTS em dtc-format.txt e manual.txt . O formato e as regras do DTO são descritos em dt-object-internal.txt . Esses documentos descrevem como atualizar o DT principal usando o nó fragment@x
e a sintaxe __overlay__
no overlay DT. Por exemplo:
/ { fragment@0 { target = <&some_node>; __overlay__ { some_prop = "okay"; ... }; }; };
No entanto, o Google recomenda enfaticamente que você não use fragment@x
e a sintaxe __overlay__
e, em vez disso, use a sintaxe de referência. Por exemplo:
&some_node { some_prop = "okay"; ... };
A sintaxe de referência é compilada pelo dtc
no mesmo objeto que o acima usando a sintaxe __overlay__
. Essa sintaxe não força você a numerar os fragmentos, permitindo que você leia e grave DTS de sobreposição facilmente. Se o seu dtc
não suporta este açúcar sintático, use o dtc no AOSP .
Usando rótulos
Para permitir referências indefinidas a nós não presentes no momento da compilação, o arquivo DT .dts
de sobreposição deve ter uma tag /plugin/
em seu cabeçalho. Por exemplo:
/dts-v1/; /plugin/;
A partir daqui, você pode direcionar os nós a serem sobrepostos usando uma referência, que é um caminho de nó absoluto prefixado com um e comercial (&). Por exemplo, para node@0
no DT principal:
Definir rótulos no DT principal ... | ... em seguida, use os rótulos. |
---|---|
[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>; }; |
Substituindo
Se a propriedade de destino de referência existir no DT principal, ela será substituída após o DTO; caso contrário, é anexado. Por exemplo:
main.dts | sobreposição.dts | Resultado mesclado |
---|---|---|
[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"; }; }; |
Anexando
Se a propriedade de destino de referência não existir no DT principal, ela será anexada após o DTO. Por exemplo:
main.dts | sobreposição.dts | Resultado mesclado |
---|---|---|
[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"; }; }; |
Nós filhos
Exemplos de sintaxe de nó filho:
main.dts | sobreposição.dts | Resultado mesclado |
---|---|---|
[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"; }; }; }; |