Images DTB

Les implémentations Android peuvent inclure une image DTB (Device tree tree blob) utilisable par le bootloader. L'emplacement de l'image DTB (et les options de spécification des paramètres d'image DTB) diffère selon les versions d'Android.

  • Sous Android 11, les appareils utilisant l'image générique du noyau (GKI) doivent être compatibles avec la partition de démarrage du fournisseur, qui inclut toutes les informations spécifiques au fournisseur qui ont été déplacées depuis la partition de démarrage. Comme 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 d'image DTB, consultez la section En-tête de démarrage du fournisseur.

  • Sous Android 10, les appareils peuvent inclure l'image DTB dans la partition de démarrage. Pour spécifier les paramètres d'image DTB, consultez la section Inclure l'image DTB dans l'image de démarrage.

  • Sous Android 9 et versions antérieures, l'image DTB peut exister sur sa propre partition ou être ajoutée au noyau image.gz pour créer le noyau et l'image DTB (qui est ensuite transmise à mkbootimg pour créer boot.img).

Format d'image DTB

Sous Android 10 et versions ultérieures, l'image DTB doit utiliser l'un des formats suivants:

  • Blobs DT concaténés l'un après l'autre. Le bootloader utilise le champ totalsize de 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 de DT approprié en examinant la structure dt_table_entry (contient les champs id, rev et custom) qui peut contenir des informations d'identification matérielle pour l'entrée. Pour en savoir plus, consultez la page Partitions DTB/DTBO.

Inclure l'image DTB dans l'image de démarrage

Les appareils équipés d'Android 10 peuvent inclure l'image DTB dans l'image de démarrage. Ainsi, Android n'a plus besoin de prendre en charge les scripts qui ajoutent l'image DTB à image.gz dans le noyau et permet d'utiliser le test VTS (Vendor Test Suite) pour vérifier (et standardiser) l'emplacement du fichier DTB.

En outre, pour les appareils non A/B, il est plus sûr d'inclure le DTB dans l'image de récupération plutôt que dans une partition distincte afin d'éviter les problèmes causés par les interruptions OTA. Lors d'une OTA, si un problème se produit 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 récupération pour effectuer l'OTA. Toutefois, comme la partition DTB a déjà été mise à jour, une incohérence peut se produire avec l'image de récupération (qui n'a pas encore été mise à jour). L'intégration de l'image DTB au format de l'image de démarrage permet d'éviter de tels problèmes en rendant l'image de récupération suffisante (c'est-à-dire qu'elle ne dépend pas d'une autre partition).

Structure de l'image de démarrage

Les appareils équipés d'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
Noyau (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 étape (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 équipés d'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'elle est ajoutée à l'argument base, elle fournit l'adresse de chargement physique pour l'arborescence finale de l'appareil. Par exemple, si l'argument base est 0x10000000 et que l'argument dtb_offset est 0x01000000, le dtb_addr_field dans l'en-tête de l'image de démarrage est renseigné comme 0x11000000.

La variable de configuration de carte BOARD_PREBUILT_DTBIMAGE_DIR doit être utilisée pour spécifier le chemin d'accès à l'image DTB. Si le répertoire BOARD_PREBUILT_DTBIMAGE_DIR contient plusieurs fichiers avec l'extension *.dtb, 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. Par exemple :

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

Vous pouvez ajouter l'argument dtb_offset à la variable de configuration du tableau BOARD_MKBOOTIMG_ARGS avec les autres décalages et la version d'en-tête. Par 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 équipés d'Android 10, le bootloader doit être compatible avec l'image de démarrage mise à jour et ajouter le paramètre de ligne de commande du noyau androidboot.dtb_idx pour indiquer l'index de l'arborescence d'appareils sélectionnée. Vous ne pouvez spécifier qu'un (1) seul index. Par exemple, le paramètre androidboot.dtb_idx=N indique N comme index basé sur zéro de l'arborescence d'appareils sélectionnée par le bootloader dans l'ensemble de DTB présents dans l'image de démarrage.