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 binária de dispositivos, que é o formato esperado pelo kernel do Linux.
Usando referências
O projeto DTC (Device Tree compiler + overlay patches) 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 . Estes documentos descrevem como atualizar o DT principal usando o nó fragment@x
e a sintaxe __overlay__
no DT de sobreposição. Por exemplo:
/ { fragment@0 { target = <&some_node>; __overlay__ { some_prop = "okay"; ... }; }; };
No entanto, o Google recomenda fortemente que você não use fragment@x
e 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 por dtc
no mesmo objeto acima usando a sintaxe __overlay__
. Essa sintaxe não força você a numerar os fragmentos, permitindo que você leia e grave facilmente DTS de sobreposição. Se o seu dtc
não suportar esse açúcar sintático, use o dtc em 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 etiquetas no TAG principal ... | ... então 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 alvo de referência existir no DT principal, ela será substituída após o DTO; caso contrário, será anexado. Por exemplo:
principal.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 alvo de referência não existir no DT principal, ela será anexada após o DTO. Por exemplo:
principal.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:
principal.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"; }; }; }; |