Syntaxe DTO

Le format de source d'arborescence de périphériques (DTS) est une représentation textuelle d'une arborescence d'appareils. Le compilateur d'arborescence de 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

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

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

Toutefois, Google vous recommande vivement de ne pas utiliser fragment@x et la syntaxe __overlay__, et utilisez à la place 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 DTS superposés. Si votre dtc n'est pas compatible avec ce sucre syntaxique. Utilisez la commande 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 .dts de superposition 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, un chemin d'accès absolu au nœud précédé d'une esperluette (&). Par exemple, pour node@0 dans le transfert de données principal:

Définissez les étiquettes dans le transfert de données principal ... ... 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>;
};

Ignorer

Si la propriété cible de la référence existe dans le transfert de données principal, elle est remplacée. après DTO ; sinon il est ajouté. 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";
  };
};

Ajouter

Si la propriété cible de la référence n'existe pas dans le transfert de données principal, elle est qui est ajoutée après DTO. 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";
    };
  };
};