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'arborescence de périphériques (DT) superposée sur l'arborescence de périphériques principale cible, vous devez également vérifier le résultat en simulant le comportement de l'arborescence de périphériques superposée (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
généré. Le nœud __symbols__
contient une liste de tous les nœuds marqués d'un libellé, que la bibliothèque DTO peut utiliser à des fins de référence.
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 permettant de créer le DT de superposition .dts
:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Vérifier les résultats de la DTO sur l'hôte
La validation peut vous aider à identifier les erreurs susceptibles de se produire lors de la mise en place du DT de superposition sur le DT principal. Avant de mettre à jour la cible, vous pouvez vérifier le résultat de la superposition de DT sur l'hôte en simulant le comportement de DTO à l'aide de /include/
dans .dts
.
Figure 1 : Utilisez la syntaxe /include/ pour simuler la DTO sur l'hôte.
- Créez une copie de la superposition
.dts
. Dans la copie, supprimez l'en-tête de la première ligne. Exemple : Enregistrez le fichier sous le nom/dts-v1/; /plugin/;
my_overlay_dt_wo_header.dts
(ou tout autre nom de fichier de votre choix). - Créez une copie de l'
.dts
principal. Dans la copie, après la dernière ligne, ajoutez la syntaxe d'inclusion du fichier que vous avez créé à l'étape 1. Exemple : Enregistrez le fichier sous le nom/include/ "my_overlay_dt_wo_header.dts"
my_main_dt_with_include.dts
(ou tout autre nom de fichier de votre choix). - Utilisez
dtc
pour compilermy_main_dt_with_include.dts
afin d'obtenir la DT fusionnée, 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
- Utilisez
dtc
pour vidermy_merged_dt.dto
.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Vérifier le DTO dans Android 9
Android 9 nécessite une partition DTBO (Device Tree Blob Overlay). Pour ajouter des nœuds ou modifier les propriétés du DT du SoC, le bootloader doit superposer dynamiquement un DT spécifique à l'appareil sur le DT du SoC.
Indique les superpositions appliquées
Pour permettre à la
suite de tests du fournisseur (VTS) d'évaluer l'exactitude de l'application de superposition, les fournisseurs doivent ajouter un nouveau paramètre de ligne de commande du kernel androidboot.dtbo_idx
qui indique les superpositions sélectionnées à partir de la partition DTBO. Dans Android 12 avec la version du kernel 5.10 ou ultérieure, 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ée (dans cet ordre) par le bootloader à la DT de base.
Les superpositions peuvent s'appliquer aux nœuds de la table de données principale 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 de symboles de superposition avec la table de symboles DT principale (la non-fusion évite les conflits de 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é au DT principal, si une tentative d'application de overlay_2
au DT obtenu est effectuée, l'application de superposition échoue et indique que le symbole e
n'est pas présent dans la table des symboles du 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>; }; |
Exemples de 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, 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 écrasé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:
- Identifiez la carte sur laquelle il s'exécute et sélectionnez les superpositions correspondantes à appliquer.
- Ajoutez le paramètre
androidboot.dtbo_idx
à la ligne de commande du kernel.- 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 de l'arborescence des 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 kernel
androidboot.dtbo_idx
(en vérifiant queInit
a automatiquement configuré la propriété systèmero.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 de la partition DTBO appliquées à la DT de base).
- Des nœuds ou des modifications de propriété supplémentaires dans la DT générée sont présentés au noyau Linux.
Par exemple, dans les superpositions suivantes et le DT final, l'ajout de androidboot.dtbo_idx=5,3
à la ligne de commande du kernel passe la validation, mais l'ajout de androidboot.dtbo_idx=3,5
à la ligne de commande du kernel ne passe pas la validation.
Superposition DT à l'index 3 | Superpositionner la table de données à 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"; }; }; |