Imágenes de DTB

Las implementaciones de Android pueden incluir una imagen de BLOB del árbol de dispositivos (DTB) para que la use el bootloader. La ubicación de la imagen DTB (y las opciones para especificar los parámetros de la imagen DTB) difiere de una versión de Android a otra.

  • En Android 11, los dispositivos que usan la imagen genérica del kernel (GKI) deben ser compatibles con la partición de inicio del proveedor, que incluye toda la información específica del proveedor que se reubicó desde la partición de inicio. Debido a que la imagen de DTB contiene datos específicos del proveedor, ahora es parte de la partición de inicio del proveedor. Para especificar los parámetros de la imagen de DTB, consulta Encabezado de inicio del proveedor.

  • En Android 10, los dispositivos pueden incluir la imagen DTB en la partición de inicio. Para especificar los parámetros de la imagen de DTB, consulta Incluye la imagen de DTB en la imagen de arranque.

  • En Android 9 y versiones anteriores, la imagen DTB puede existir en su propia partición o anexarse al kernel image.gz para crear el kernel + la imagen DTB (que luego se pasa a mkbootimg para crear boot.img).

Formato de imagen DTB

En Android 10 y versiones posteriores, la imagen DTB debe usar uno de los siguientes formatos:

  • Búferes de DT concatenados uno tras otro. El bootloader usa el campo totalsize en cada encabezado de FDT para leer y analizar el BLOB correspondiente.

  • Particiones DTB/DTBO. El bootloader tiene una forma eficiente de seleccionar el BLOB de DT correcto a través del análisis del struct dt_table_entry (contiene los campos id, rev y custom) que puede contener información de identificación de hardware para la entrada. Para obtener más detalles, consulta Particiones DTB/DTBO.

Incluye la imagen DTB en la imagen de arranque.

Los dispositivos que ejecutan Android 10 pueden incluir la imagen DTB en la imagen de inicio. Esto elimina la necesidad de que Android admita secuencias de comandos que agregan la imagen DTB a image.gz en el kernel y habilita el uso de la prueba del paquete de pruebas del proveedor (VTS) para verificar (y estandarizar) la ubicación de DTB.

Además, en el caso de los dispositivos que no son A/B, es más seguro incluir la DTB como parte de la imagen de recuperación que en una partición separada para evitar problemas causados por la interrupción de OTA. Durante una actualización inalámbrica, si se produce un problema después de que se actualiza la partición de DTB (pero antes de completar la actualización completa), el dispositivo intenta iniciar en modo de recuperación para completar la actualización inalámbrica. Sin embargo, debido a que la partición de DTB ya se actualizó, podría ocurrir una discrepancia con la imagen de recuperación (que aún no se actualizó). Tener la imagen DTB como parte del formato de imagen de arranque evita esos problemas, ya que hace que la imagen de recuperación sea autosuficiente (es decir, no depende de otra partición).

Estructura de la imagen de arranque

Los dispositivos que ejecutan Android 10 pueden incluir una imagen DTB mediante la siguiente estructura de imagen de arranque.

Sección de imagen de arranque Cantidad de páginas
Encabezado de inicio (1 página) 1
Kernel (l páginas) l = (kernel_size + page_size - 1) / page_size
Ramdisk (m páginas) m = (ramdisk_size + page_size - 1) / page_size
bootloader de segunda etapa (n páginas) n = (second_size + page_size - 1) / page_size
DTBO de recuperación (o páginas) o = (recovery_dtbo_size + page_size - 1) / page_size
DTB (p páginas) p = (dtb_size + page_size - 1) / page_size

Ruta de acceso a la imagen de DTB

En el caso de los dispositivos que ejecutan Android 10, puedes usar la herramienta mkbootimg.py y los siguientes argumentos para especificar la ruta de acceso a la imagen de DTB.

Argumento Descripción
dtb La ruta de acceso a la imagen DTB que se incluirá en las imágenes de inicio y recuperación.
dtb_offset Cuando se agrega al argumento base, proporciona la dirección de carga física para el árbol de dispositivos final. Por ejemplo, si el argumento base es 0x10000000 y el argumento dtb_offset es 0x01000000, el dtb_addr_field en el encabezado de la imagen de arranque se propaga como 0x11000000.

Se debe usar la variable de configuración de la placa BOARD_PREBUILT_DTBIMAGE_DIR para especificar la ruta de acceso a la imagen de DTB. Si hay más de un archivo con la extensión *.dtb en el directorio BOARD_PREBUILT_DTBIMAGE_DIR, el sistema de compilación de Android concatena los archivos para crear la imagen DTB final que se usa en la creación de la imagen de arranque.

Para pasar el argumento dtb a mkbootimg.py con la imagen DTB del directorio que especifica BOARD_PREBUILT_DTBIMAGE_DIR, la variable de configuración de la placa BOARD_INCLUDE_DTB_IN_BOOTIMG debe establecerse en true. Por ejemplo:

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

Puedes agregar el argumento dtb_offset a la variable de configuración de la placa BOARD_MKBOOTIMG_ARGS con las otras compensaciones y la versión del encabezado. Por ejemplo:

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)

Compatibilidad con el bootloader

Para que VTS se ejecute correctamente en dispositivos que ejecutan Android 10, el bootloader debe admitir la imagen de arranque actualizada y agregar el parámetro de línea de comandos del kernel androidboot.dtb_idx para indicar el índice del árbol de dispositivos (DT) seleccionado. Solo puedes especificar un (1) índice. Por ejemplo, el parámetro androidboot.dtb_idx=N informa N como el índice basado en cero del árbol de dispositivos seleccionado por el bootloader del conjunto de DTB presentes en la imagen de inicio.