Images DTB

Les implémentations Android peuvent inclure une image DTB (Device Tree Blob) à utiliser par le chargeur de démarrage. L'emplacement de l'image DTB (et les options de spécification des paramètres de l'image DTB) diffère selon les versions d'Android.

  • Sous Android 11, les appareils utilisant Generic Kernel Image (GKI) doivent prendre en charge la partition de 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 .

  • Sous 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, voir Inclure l'image DTB dans l'image de démarrage .

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

Format d'image DTB

Sous Android 10 et supérieur, l'image DTB doit utiliser l'un des formats suivants :

  • Les blobs DT sont concaténés les uns après les autres. Le chargeur de démarrage utilise le champ totalsize dans chaque en-tête FDT pour lire et analyser le blob correspondant.

  • Partitions DTB/DTBO. Le chargeur de démarrage dispose d'un moyen efficace pour sélectionner le blob DT correct en examinant la structure dt_table_entry (contient id , rev et des champs custom ) qui peut contenir des informations d'identification matérielle pour l'entrée). Pour plus de détails, 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. Cela supprime la nécessité pour Android de prendre en charge les scripts qui ajoutent l'image DTB à image.gz dans le noyau et permet d'utiliser le test Vendor Test Suite (VTS) pour vérifier (et normaliser) le placement DTB.

De plus, pour les appareils non-A/B, il est plus sûr d'avoir le DTB dans le cadre de l'image de récupération plutôt que dans une partition distincte pour éviter les problèmes causés par les OTA interrompus. Lors d'une OTA, si un problème survient après la mise à jour de la partition DTB (mais avant de terminer la mise à jour complète), le périphérique tente de démarrer en mode de récupération pour terminer l'OTA ; cependant, 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'avoir l'image DTB dans le format de l'image de démarrage évite de tels problèmes en rendant l'image de récupération autosuffisante (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 en utilisant 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
Disque RAM (m pages) m = ( ramdisk_size + page_size - 1) / page_size
Chargeur de démarrage de deuxième étape (n pages) n = ( second_size + page_size - 1) / page_size
Récupération DTBO (pages non) o = ( recovery_dtbo_size + page_size - 1) / page_size
DTB (ppages) p = ( dtb_size + page_size - 1) / page_size

Chemin 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 , fournit l'adresse de charge physique pour l'arborescence finale des périphériques. 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é sous la forme 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 build Android concatène les fichiers pour créer l'image DTB finale utilisée dans 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 de la carte 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)

Prise en charge du chargeur de démarrage

Pour que VTS s'exécute correctement sur les appareils exécutant Android 10, le chargeur de démarrage doit prendre en charge l'image de démarrage mise à jour et doit ajouter le paramètre de ligne de commande du noyau androidboot.dtb_idx pour indiquer l'index de l'arborescence des périphériques (DT) 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 de base zéro de l'arborescence des périphériques sélectionnée par le chargeur de démarrage parmi l'ensemble des DTB présents dans l'image de démarrage.