Sintaxe de DTO

O formato de origem da árvore de dispositivos (DTS, na sigla em inglês) é uma representação textual de uma árvore de dispositivos (DT, na sigla em inglês). 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 da á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 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__. Em vez disso, use a sintaxe de referência. Exemplo:

&some_node {
  some_prop = "okay";
  ...
};

A sintaxe de referência é compilada por dtc no mesmo objeto que o acima usando a sintaxe __overlay__. Essa sintaxe não força você a numerar os fragmentos, permitindo ler e gravar facilmente sobreposições de DTS. Se o dtc não for compatível com esse açúcar sintático, use o dtc no AOSP.

Usar rótulos

Para permitir referências indefinidas a nós não presentes no momento da compilação, o arquivo DT de sobreposição .dts precisa ter uma tag /plugin/ no cabeçalho. Exemplo:

/dts-v1/;
/plugin/;

Aqui, 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 na DT principal:

Defina rótulos na principal DT ... ... e 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 da 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 da mesclagem
[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 da referência não existir no DT principal, ela será adicionada após o DTO. Exemplo:

main.dts overlay.dts Resultado da mesclagem
[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 da mesclagem
[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";
    };
  };
};