Sintaxis de DTO

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";
    };
  };
};