Vous pouvez utiliser Device Tree Compiler (DTC) pour compiler les fichiers Device Tree Source. Cependant, avant d'appliquer la DT superposée sur la DT principale cible, vous devez également vérifier le résultat en simulant le comportement de DTO.
Compilation 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'une étiquette, que la bibliothèque DTO peut utiliser comme références.
Exemple de commande pour construire le DT .dts
principal :
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
Exemple de commande pour construire la superposition DT .dts
:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Vérifier les résultats DTO sur l'hôte
La vérification peut vous aider à identifier les erreurs susceptibles de se produire lors du placement de la DT superposée sur la DT principale. 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
.
/include/
pour simuler 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 :/dts-v1/; /plugin/;
Enregistrez le fichier sousmy_overlay_dt_wo_header.dts
(ou le nom de fichier de votre choix). - 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. Par exemple :/include/ "my_overlay_dt_wo_header.dts"
Enregistrez le fichier sousmy_main_dt_with_include.dts
(ou le nom de fichier de votre choix). - Utilisez
dtc
pour compilermy_main_dt_with_include.dts
pour obtenir le DT fusionné, qui devrait être le même résultat que DTO. Par 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érification du DTO dans Android 9
Android 9 nécessite une partition DTBO (Device Tree Blob Overlay). Pour ajouter des nœuds ou apporter des modifications aux propriétés dans la DT SoC, le chargeur de démarrage doit superposer dynamiquement une DT spécifique à l'appareil sur la DT SoC.
Indication des superpositions appliquées
Pour permettre à Vendor Test Suite (VTS) d'évaluer l'exactitude 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 supérieure du noyau, ce paramètre passe par bootconfig. Par exemple, le paramètre androidboot.dtbo_idx=x,y,z
signale x
, y
et z
comme les indices de base zéro des superpositions d'arborescence de périphériques (DTO) de la partition DTBO appliquées (dans cet ordre) par le chargeur de démarrage à la base Arborescence des appareils (DT).
Les superpositions peuvent s'appliquer aux nœuds de l'arborescence de périphériques 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 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 que overlay_1
est appliqué à la DT principale, si une tentative est faite pour appliquer overlay_2
à la DT résultante, l'application de superposition échouera 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 | superposition_1.dts | superposition_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
fait uniquement référence au nœud b
du DTS principal. Lorsque overlay_1
est appliqué à la 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 | superposition_1.dts | superposition_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émentation de la partition DTBO
Pour implémenter la partition DTBO requise, assurez-vous que le chargeur de démarrage peut effectuer les opérations suivantes :
- Identifiez la carte sur laquelle il s'exécute et sélectionnez la ou les superpositions correspondantes à appliquer.
- Ajoutez le paramètre
androidboot.dtbo_idx
à la ligne de commande du noyau.- Le paramètre doit indiquer, les indices de base zéro des DTO de l'image de partition DTBO qu'il a appliqués à la DT de base (dans le même ordre).
- Les indices doivent faire référence à la position de la superposition dans la partition DTBO.
Pour plus de détails sur la structure de la partition DTBO, reportez-vous à Device Tree Overlays sur source.android.com.
Validation de 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 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 dans la partition DTBO qui sont appliquées à la DT de base).
- Des nœuds supplémentaires ou des changements de propriété dans la DT résultante sont présentés au noyau Linux.
Par exemple, dans les superpositions suivantes et la DT finale, l'ajout androidboot.dtbo_idx=5,3
à la ligne de commande du noyau passe la validation, mais l'ajout androidboot.dtbo_idx=3,5
à la ligne de commande du noyau ne passe pas la validation.
Superposition DT à l'indice 3 | Superposition DT à l'indice 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"; }; }; |
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2022-06-06 UTC.