O formato de origem da árvore de dispositivos (DTS, na sigla em inglês) é uma representação textual de uma árvore de dispositivos (DT). O compilador de árvore de dispositivos (DTC) processa esse formato em um DT binário, que é a forma esperada pelo kernel do Linux.
Usar 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.
Estes documentos descrevem como atualizar o DT principal usando o nó
fragment@x
e a sintaxe __overlay__
na DT de sobreposição. Por
exemplo:
/ { fragment@0 { target = <&some_node>; __overlay__ { some_prop = "okay"; ... }; }; };
No entanto, o Google recomenda não usar
fragment@x
e a sintaxe __overlay__
, e, em vez disso, usar a
sintaxe de referência. 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 ler e gravar DTS de sobreposição com facilidade. Se o
dtc
não oferecer suporte a esse açúcar sintático, use o
dtc
no AOSP.
Usar rótulos
Para permitir referências indefinidas a nós que não estão presentes no momento da compilação, o
arquivo .dts
do DT de sobreposição precisa ter uma tag /plugin/
no
cabeçalho. Exemplo:
/dts-v1/; /plugin/;
A partir daqui, você pode segmentar 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 ... | ... e depois 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>; }; |
Substituir
Se a propriedade de destino de referência existir no DT principal, ela será substituída após o DTO. Caso contrário, ela será anexada. Exemplo:
main.dts | overlay.dts | Resultado combinado |
---|---|---|
[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"; }; }; |
Anexar
Se a propriedade de destino de referência não existir no DT principal, ela será anexada após o DTO. Exemplo:
main.dts | overlay.dts | Resultado combinado |
---|---|---|
[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 | overlay.dts | Resultado combinado |
---|---|---|
[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"; }; }; }; |