Syntaxe DTO

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

Utiliser des références

Le projet DTC (compilateur d'arborescence d'appareils + correctifs de superposition) décrit le format DTS dans dtc-format.txt et manual.txt. Le format et les règles des DTO sont décrits dans dt-object-internal.txt. Ces documents décrivent comment mettre à jour le DT principal à l'aide du nœud fragment@x et de la syntaxe __overlay__ dans le DT de superposition. Exemple :

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

Toutefois, Google vous recommande vivement de ne pas utiliser fragment@x ni la syntaxe __overlay__, et d'utiliser plutôt la syntaxe de référence. 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 à l'aide de la syntaxe __overlay__. Cette syntaxe ne vous oblige pas à numéroter les fragments, ce qui vous permet de lire et d'écrire facilement des fichiers DTS de superposition. Si votre dtc n'est pas compatible avec cette simplification syntaxique, utilisez dtc dans AOSP.

Utiliser des libellés

Pour autoriser les références non définies à des nœuds non présents au moment de la compilation, le fichier DT de superposition .dts doit comporter un tag /plugin/ dans son en-tête. 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 d'accès de nœud absolu précédé d'un esperluette (&). Par exemple, pour node@0 dans le DT principal :

Définir des libellés dans le DT principal… … puis utilisez les libellés.
[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>;
};

Ignorer

Si la propriété cible de référence existe dans le DT principal, elle est remplacée après le DTO. Sinon, elle est ajoutée. Exemple :

main.dts overlay.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";
  };
};

Ajouter

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

main.dts overlay.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 overlay.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";
    };
  };
};