Syntaxe DTO

Le format DTS (Device Tree Source) est une représentation textuelle d'une arborescence de périphériques. Le compilateur d'arborescence de périphériques (DTC) traite ce format dans une arborescence de périphériques binaires, 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 plutôt d'utiliser 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 superposés. 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 indé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écédé d'une esperluette (&). Par exemple, pour node@0 dans la DT principale :

Définir les libellés 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 ajouté. 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 le 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";
    };
  };
};