Compiler et valider

Vous pouvez utiliser le compilateur de l'arborescence des périphériques (DTC) pour compiler les fichiers source de l'arborescence des périphériques (DTS). Toutefois, avant d'appliquer l'arbre d'appareil (DT) de superposition sur le DT principal cible, vous devez également vérifier le résultat en simulant le comportement de l'arbre d'appareil de superposition (DTO).

Compiler avec DTC

Lorsque vous utilisez dtc pour compiler .dts, vous devez ajouter l'option -@ pour ajouter un nœud __symbols__ dans le .dtbo résultant. Le nœud __symbols__ contient une liste de tous les nœuds marqués d'un libellé, que la bibliothèque DTO peut utiliser pour les références.

Exemple de commande pour créer le DT principal .dts :

dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

Exemple de commande pour créer le DT de superposition .dts :

dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

Vérifier les résultats DTO sur l'hôte

La validation peut vous aider à identifier les erreurs qui peuvent se produire lors du placement du DT de superposition sur le DT principal. Avant de mettre à jour la cible, vous pouvez vérifier le résultat de la superposition du DT sur l'hôte en simulant le comportement du DTO à l'aide de /include/ dans .dts.

Figure 1 : Utilisez la syntaxe /include/ pour simuler un DTO sur l'hôte.

  1. Créez une copie de la superposition .dts. Dans la copie, supprimez l'en-tête de la première ligne. Exemple :
    /dts-v1/;
    /plugin/;
    
     Enregistrez le fichier sous le nom my_overlay_dt_wo_header.dts (ou tout autre nom de fichier de votre choix).
  2. Créez une copie du .dts principal. Dans la copie, après la dernière ligne, ajoutez la syntaxe d'inclusion pour le fichier que vous avez créé à l'étape 1. Exemple :
    /include/ "my_overlay_dt_wo_header.dts"
    
     Enregistrez le fichier sous le nom my_main_dt_with_include.dts (ou tout autre nom de fichier de votre choix).
  3. Utilisez dtc pour compiler my_main_dt_with_include.dts afin d'obtenir le DT fusionné, qui devrait être le même résultat que DTO. Exemple :
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. Utilisez dtc pour vider my_merged_dt.dto.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

Valider le DTO dans Android 9

Android 9 nécessite une partition de superposition de blob d'arborescence de périphériques (DTBO). Pour ajouter des nœuds ou modifier les propriétés dans le DT du SoC, le bootloader doit superposer dynamiquement un DT spécifique à l'appareil sur le DT du SoC.

Indiquer les superpositions appliquées

Pour permettre à la Vendor Test Suite (VTS) d'évaluer la correction de l'application de superposition, les fournisseurs doivent ajouter un nouveau paramètre de ligne de commande du noyau androidboot.dtbo_idx qui indique les superpositions sélectionnées à partir de la partition DTBO. Dans Android 12 utilisant la version 5.10 ou ultérieure du noyau, ce paramètre est transmis via bootconfig. Par exemple, le paramètre androidboot.dtbo_idx=x,y,z indique x, y et z comme indices de base zéro des DTO de la partition DTBO appliqués (dans cet ordre) par le bootloader à la DT de base.

Les superpositions peuvent s'appliquer aux nœuds du DT principal ou ajouter de nouveaux nœuds, mais ne peuvent pas faire référence à un nœud ajouté dans une superposition précédente. Cette restriction est nécessaire, car l'application de superposition ne fusionne pas la table des symboles de superposition avec la table des symboles DT principale (la non-fusion évite les conflits dans les noms de symboles et la complication des dépendances entre les superpositions).

Exemple : Superpositions non valides

Dans cet exemple, overlay_2.dts fait référence au nœud e , qui a été ajouté par overlay_1.dts. Une fois overlay_1 appliqué à la DT principale, si une tentative est faite pour appliquer overlay_2 à la DT résultante, l'application de superposition échoue avec une erreur indiquant que le symbole e n'est pas présent dans la table des symboles pour la DT de base.

main.dts overlay_1.dts overlay_2.dts
[main.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};
[overlay_1.dts]

/dts-v1/;
/plugin/;

&b { ref1 =  <&a>;
    e: e {
        prop = <0x0a>;
        phandle = <0x04>;
    };
};
[overlay_2.dts]

/dts-v1/;
/plugin/;

/* invalid! */
&e {
    prop = <0x0b>;
};

Exemple : Superpositions valides

Dans cet exemple, overlay_2.dts ne fait référence qu'au nœud b du DTS principal. Lorsque overlay_1 est appliqué au DT de base, puis suivi de l'application de overlay_2, la valeur de la propriété prop dans le nœud e (définie par overlay_1.dts) est remplacée par la valeur définie par overlay_2.dts.

main.dts overlay_1.dts overlay_2.dts
[final.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};
[overlay_1.dts]

/dts-v1/;
/plugin/;


&b { ref1 =  <&a>;
     e {
          prop = <0x0c>;
      };
};
[overlay_2.dts]

/dts-v1/;
/plugin/;

/* valid */
&b { ref1 =  <&c>;
     e {
          prop = <0x0d>;
      };
};

Implémenter la partition DTBO

Pour implémenter la partition DTBO requise, assurez-vous que le bootloader peut effectuer les opérations suivantes :

  1. Identifiez la carte sur laquelle il s'exécute et sélectionnez les superpositions correspondantes à appliquer.
  2. Ajoutez le paramètre androidboot.dtbo_idx à la ligne de commande du noyau.
    • Ce paramètre doit indiquer les indices de base zéro des DTO de l'image de partition DTBO appliquée à la DT de base (dans le même commande).
    • Les indices doivent faire référence à la position de la superposition dans la partition DTBO.

Pour en savoir plus sur la structure de la partition DTBO, consultez Superpositions d'arborescence d'appareils.

Valider la partition DTBO

Vous pouvez utiliser VTS pour vérifier les éléments suivants :

  • Existence du paramètre de ligne de commande du noyau androidboot.dtbo_idx (en vérifiant que Init a automatiquement configuré la propriété système ro.boot.dtbo_idx correspondante).
  • Validité de la propriété système ro.boot.dtbo_idx (en vérifiant que la propriété spécifie au moins un index d'image DTBO valide).
  • Validité de la partition DTBO (vérifie également les superpositions dans la partition DTBO qui sont appliquées à la DT de base).
  • Les nœuds ou les modifications de propriétés supplémentaires dans le DT résultant sont présentés au noyau Linux.

Par exemple, dans les superpositions et le DT final suivants, l'ajout de androidboot.dtbo_idx=5,3 à la ligne de commande du noyau réussit la validation, mais l'ajout de androidboot.dtbo_idx=3,5 à la ligne de commande du noyau ne réussit pas la validation.

Superposition DT à l'index 3 Superposition DT à l'index 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xfe>; };
[overlay_2.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
DT final

/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

	c {
		phandle = <0x3>;
		prop = <0xfe>;
	};

	__symbols__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};