Syntaxe DTO

Le format DTS (Device Tree Source) est une représentation textuelle d’une arborescence de périphériques. Le Device Tree Compiler (DTC) traite ce format en une arborescence de périphériques binaire, qui est la forme attendue par le noyau Linux.

Utiliser des références

Le projet DTC (Device Tree compiler + overlay patches) décrit le format DTS dans dtc-format.txt et manual.txt . Le format et les règles DTO sont décrits dans dt-object-internal.txt . Ces documents décrivent comment mettre à jour la DT principale à l'aide du nœud fragment@x et de la syntaxe __overlay__ dans la DT de superposition. Par exemple:

/ {
  fragment@0 {
    target = <&some_node>;
      __overlay__ {
        some_prop = "okay";
        ...
      };
  };
};

Cependant, Google vous recommande fortement de ne pas utiliser fragment@x et la syntaxe __overlay__ , mais d'utiliser plutôt la syntaxe de référence. Par exemple:

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

La syntaxe de référence est compilée par dtc dans le même objet que ci-dessus en utilisant la syntaxe __overlay__ . Cette syntaxe ne vous oblige pas à numéroter les fragments, ce qui vous permet de lire et d'écrire facilement des DTS de superposition. Si votre dtc ne prend pas en charge ce sucre syntaxique, utilisez le dtc dans AOSP .

Utiliser des étiquettes

Pour autoriser des références non définies à des nœuds non présents au moment de la compilation, le fichier de superposition DT .dts doit avoir une balise /plugin/ dans son en-tête. Par exemple:

/dts-v1/;
/plugin/;

À partir de là, vous pouvez cibler les nœuds à superposer à l'aide d'une référence, qui est un chemin de nœud absolu préfixé par une esperluette (&). Par exemple, pour node@0 dans la DT principale :

Définir des étiquettes dans la DT principale... ...puis utilisez les étiquettes.
[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>;
};

Primordial

Si la propriété cible de référence existe dans la DT principale, elle est remplacée après DTO ; sinon, il est annexé. Par exemple:

main.dts superposition.dts Résultat fusionné
[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";
  };
};

Ajout

Si la propriété cible de référence n'existe pas dans la DT principale, elle est ajoutée après DTO. Par exemple:

main.dts superposition.dts Résultat fusionné
[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œuds enfants

Exemples de syntaxe de nœud enfant :

main.dts superposition.dts Résultat fusionné
[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";
    };
  };
};