Les implémentations Android peuvent inclure une image DTB (Device Tree Blob) à utiliser par le bootloader. L'emplacement de l'image DTB (et les options permettant de spécifier les paramètres de l'image DTB) diffère selon les versions d'Android.
Dans Android 11, les appareils utilisant l'image générique du noyau (GKI) doivent être compatibles avec la partitionde démarrage du fournisseur, qui inclut toutes les informations spécifiques au fournisseur qui ont été déplacées de la partition de démarrage. Étant donné que l'image DTB contient des données spécifiques au fournisseur, elle fait désormais partie de la partition de démarrage du fournisseur. Pour spécifier les paramètres de l'image DTB, consultez En-tête de démarrage du fournisseur.
Dans Android 10, les appareils peuvent inclure l'image DTB dans la partition de démarrage. Pour spécifier les paramètres de l'image DTB, consultez Inclure l'image DTB dans l'image de démarrage.
Dans Android 9 et versions antérieures, l'image DTB peut exister dans sa propre partition ou être ajoutée au noyau
image.gzpour créer l'image noyau + DTB (qui est ensuite transmise àmkbootimgpour créerboot.img).
Format de l'image DTB
Dans Android 10 et versions ultérieures, l'image DTB doit utiliser l'un des formats suivants :
Blobs DT concaténés les uns après les autres. Le bootloader utilise le champ
totalsizedans chaque en-tête FDT pour lire et analyser le blob correspondant.Partitions DTB/DTBO. Le bootloader dispose d'un moyen efficace de sélectionner le blob DT approprié en examinant la structure
dt_table_entry(qui contient les champsid,revetcustom) pouvant contenir des informations d'identification matérielle pour l'entrée. Pour en savoir plus, consultez Partitions DTB/DTBO.
Inclure l'image DTB dans l'image de démarrage
Les appareils exécutant Android 10 peuvent inclure l'image DTB dans l'image de démarrage. Android n'a donc plus besoin de prendre en charge les scripts qui ajoutent
l'image DTB à image.gz dans le noyau, et il est possible d'utiliser le test Vendor Test
Suite (VTS) pour vérifier (et standardiser) le placement
de la DTB.
De plus, pour les appareils non A/B, il est plus sûr d'inclure la DTB dans l'image de restauration plutôt que dans une partition distincte afin d'éviter les problèmes causés par les OTA interrompues. Lors d'une OTA, si un problème survient après la mise à jour de la partition DTB (mais avant la fin de la mise à jour complète), l'appareil tente de démarrer en mode de récupération pour terminer l'OTA. Toutefois, comme la partition DTB a déjà été mise à jour, une incompatibilité peut se produire avec l'image de récupération (qui n'a pas encore été mise à jour). Le fait d'inclure l'image DTB dans le format de l'image de démarrage évite ces problèmes en rendant l'image de restauration autonome (c'est-à-dire qu'elle ne dépend pas d'une autre partition).
Structure de l'image de démarrage
Les appareils exécutant Android 10 peuvent inclure une image DTB à l'aide de la structure d'image de démarrage suivante.
| Section de l'image de démarrage | Nombre de pages |
|---|---|
| En-tête de démarrage (1 page) | 1 |
| Kernel (l pages) | l = (kernel_size + page_size -
1) / page_size |
| Ramdisk (m pages) | m = (ramdisk_size + page_size -
1) / page_size |
| Bootloader de deuxième niveau (n pages) | n = (second_size + page_size -
1) / page_size |
| DTBO de récupération (o pages) | o = (recovery_dtbo_size + page_size -
1) / page_size |
| DTB (p pages) | p = (dtb_size + page_size -
1) / page_size |
Chemin d'accès de l'image DTB
Pour les appareils exécutant Android 10, vous pouvez utiliser l'outil mkbootimg.py et les arguments suivants pour spécifier le chemin d'accès à l'image DTB.
| Argument | Description |
|---|---|
dtb |
Chemin d'accès à l'image DTB à inclure dans les images de démarrage/récupération. |
dtb_offset |
Lorsqu'il est ajouté à l'argument base, il fournit l'adresse de chargement physique
pour l'arborescence finale de l'appareil. Par exemple, si l'argument base
est 0x10000000 et l'argument dtb_offset
est 0x01000000, le dtb_addr_field dans l'en-tête de l'image de démarrage
est renseigné avec la valeur 0x11000000. |
La variable de configuration de la carte BOARD_PREBUILT_DTBIMAGE_DIR doit être utilisée pour spécifier le chemin d'accès à l'image DTB. Si plusieurs fichiers avec l'extension *.dtb sont présents dans le répertoire BOARD_PREBUILT_DTBIMAGE_DIR, le système de compilation Android concatène les fichiers pour créer l'image DTB finale utilisée lors de la création de l'image de démarrage.
Pour transmettre l'argument dtb à mkbootimg.py avec l'image DTB du répertoire spécifié par BOARD_PREBUILT_DTBIMAGE_DIR, la variable de configuration de la carte BOARD_INCLUDE_DTB_IN_BOOTIMG doit être définie sur true. Exemple :
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
Vous pouvez ajouter l'argument dtb_offset à la variable de configuration de la carte BOARD_MKBOOTIMG_ARGS avec les autres décalages et la version de l'en-tête. Exemple :
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Compatibilité avec le bootloader
Pour que VTS s'exécute correctement sur les appareils exécutant Android 10, le bootloader doit être compatible avec l'image de démarrage mise à jour et doit ajouter le paramètre de ligne de commande du kernel androidboot.dtb_idx pour indiquer l'index de l'arborescence de périphériques (DT) sélectionnée. Vous ne pouvez spécifier qu'un seul index. Par exemple, le paramètre androidboot.dtb_idx=N indique N comme
index de base zéro de l'arborescence de l'appareil sélectionnée par le bootloader à partir de l'ensemble des
DTB présents dans l'image de démarrage.