Изображения DTB

Реализации Android могут включать образ дерева устройств (DTB) для использования загрузчиком. Расположение образа DTB (и параметры указания параметров образа DTB) различаются в разных выпусках Android.

  • В Android 11 устройства, использующие Generic Kernel Image (GKI), должны поддерживать раздел загрузки поставщика , который включает всю информацию, специфичную для поставщика, которая была перемещена из раздела загрузки. Поскольку образ DTB содержит данные, специфичные для поставщика, он теперь является частью раздела загрузки поставщика. Чтобы указать параметры образа DTB, см. раздел Заголовок загрузки поставщика .

  • В Android 10 устройства могут включать образ DTB в загрузочный раздел. Чтобы указать параметры образа DTB, см . Включение образа DTB в загрузочный образ .

  • В Android 9 и ниже образ DTB может существовать в собственном разделе или быть добавлен к файлу kernel image.gz для создания образа ядра + DTB (который затем передается в mkbootimg для создания boot.img ).

Формат изображения DTB

В Android 10 и выше образ DTB должен использовать один из следующих форматов:

  • DT blobs, объединенные один за другим. Загрузчик использует поле totalsize в каждом заголовке FDT для чтения и анализа соответствующего blob.

  • Разделы DTB/DTBO. Загрузчик имеет эффективный способ выбора правильного DT blob, проверяя структуру dt_table_entry (содержит id , rev и custom поля), которая может содержать информацию об идентификации оборудования для записи. Подробности см. в разделе Разделы DTB/DTBO .

Включить образ DTB в загрузочный образ

Устройства под управлением Android 10 могут включать образ DTB в загрузочный образ. Это устраняет необходимость поддержки скриптов Android, которые добавляют образ DTB к image.gz в ядре, и позволяет использовать тест Vendor Test Suite (VTS) для проверки (и стандартизации) размещения DTB.

Кроме того, для устройств, не относящихся к A/B, безопаснее иметь DTB как часть образа восстановления, а не в отдельном разделе, чтобы предотвратить проблемы, вызванные прерванными OTA. Во время OTA, если проблема возникает после обновления раздела DTB (но до завершения полного обновления), устройство пытается загрузиться в режиме восстановления, чтобы завершить OTA; однако, поскольку раздел DTB уже был обновлен, может возникнуть несоответствие с образом восстановления (который еще не был обновлен). Наличие образа DTB как части формата загрузочного образа предотвращает такие проблемы, делая образ восстановления самодостаточным (то есть он не зависит от другого раздела).

Структура загрузочного образа

Устройства под управлением Android 10 могут включать образ DTB, используя следующую структуру загрузочного образа.

Раздел загрузочного образа Количество страниц
Заголовок загрузки (1 страница) 1
Ядро (l страниц) l = ( kernel_size + page_size - 1) / page_size
Ramdisk (млн страниц) m = ( ramdisk_size + page_size - 1) / page_size
Загрузчик второго этапа (n страниц) n = ( second_size + page_size - 1) / page_size
Восстановление DTBO (o страниц) o = ( recovery_dtbo_size + page_size - 1) / page_size
DTB (стр.) p = ( dtb_size + page_size - 1) / page_size

Путь к изображению DTB

Для устройств под управлением Android 10 можно использовать инструмент mkbootimg.py и следующие аргументы, чтобы указать путь к образу DTB.

Аргумент Описание
dtb Путь к образу DTB, который будет включен в образы загрузки/восстановления.
dtb_offset При добавлении к аргументу base предоставляет физический адрес загрузки для конечного дерева устройств. Например, если аргумент base равен 0x10000000 , а аргумент dtb_offset равен 0x01000000 , поле dtb_addr_field в заголовке образа загрузки заполняется как 0x11000000 .

Переменная конфигурации платы BOARD_PREBUILT_DTBIMAGE_DIR должна использоваться для указания пути к образу DTB. Если в каталоге BOARD_PREBUILT_DTBIMAGE_DIR присутствует более одного файла с расширением *.dtb , система сборки Android объединяет файлы для создания окончательного образа DTB, используемого при создании загрузочного образа.

Чтобы передать аргумент dtb в mkbootimg.py с образом DTB из каталога, указанного в BOARD_PREBUILT_DTBIMAGE_DIR , переменная конфигурации платы BOARD_INCLUDE_DTB_IN_BOOTIMG должна быть установлена ​​в true . Например:

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

Вы можете добавить аргумент dtb_offset к переменной конфигурации платы BOARD_MKBOOTIMG_ARGS с другими смещениями и версией заголовка. Например:

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)

Поддержка загрузчика

Для успешного запуска VTS на устройствах под управлением Android 10 загрузчик должен поддерживать обновленный загрузочный образ и должен добавить параметр командной строки ядра androidboot.dtb_idx для указания индекса выбранного дерева устройств (DT). Вы можете указать только один (1) индекс. Например, параметр androidboot.dtb_idx=N сообщает N как отсчитываемый от нуля индекс дерева устройств, выбранного загрузчиком из набора DTB, присутствующих в загрузочном образе.

,

Реализации Android могут включать образ дерева устройств (DTB) для использования загрузчиком. Расположение образа DTB (и параметры указания параметров образа DTB) различаются в разных выпусках Android.

  • В Android 11 устройства, использующие Generic Kernel Image (GKI), должны поддерживать раздел загрузки поставщика , который включает всю информацию, специфичную для поставщика, которая была перемещена из раздела загрузки. Поскольку образ DTB содержит данные, специфичные для поставщика, он теперь является частью раздела загрузки поставщика. Чтобы указать параметры образа DTB, см. раздел Заголовок загрузки поставщика .

  • В Android 10 устройства могут включать образ DTB в загрузочный раздел. Чтобы указать параметры образа DTB, см . Включение образа DTB в загрузочный образ .

  • В Android 9 и ниже образ DTB может существовать в собственном разделе или быть добавлен к файлу kernel image.gz для создания образа ядра + DTB (который затем передается в mkbootimg для создания boot.img ).

Формат изображения DTB

В Android 10 и выше образ DTB должен использовать один из следующих форматов:

  • DT blobs, объединенные один за другим. Загрузчик использует поле totalsize в каждом заголовке FDT для чтения и анализа соответствующего blob.

  • Разделы DTB/DTBO. Загрузчик имеет эффективный способ выбора правильного DT blob, проверяя структуру dt_table_entry (содержит id , rev и custom поля), которая может содержать информацию об идентификации оборудования для записи. Подробности см. в разделе Разделы DTB/DTBO .

Включить образ DTB в загрузочный образ

Устройства под управлением Android 10 могут включать образ DTB в загрузочный образ. Это устраняет необходимость поддержки скриптов Android, которые добавляют образ DTB к image.gz в ядре, и позволяет использовать тест Vendor Test Suite (VTS) для проверки (и стандартизации) размещения DTB.

Кроме того, для устройств, не относящихся к A/B, безопаснее иметь DTB как часть образа восстановления, а не в отдельном разделе, чтобы предотвратить проблемы, вызванные прерванными OTA. Во время OTA, если проблема возникает после обновления раздела DTB (но до завершения полного обновления), устройство пытается загрузиться в режиме восстановления, чтобы завершить OTA; однако, поскольку раздел DTB уже был обновлен, может возникнуть несоответствие с образом восстановления (который еще не был обновлен). Наличие образа DTB как части формата загрузочного образа предотвращает такие проблемы, делая образ восстановления самодостаточным (то есть он не зависит от другого раздела).

Структура загрузочного образа

Устройства под управлением Android 10 могут включать образ DTB, используя следующую структуру загрузочного образа.

Раздел загрузочного образа Количество страниц
Заголовок загрузки (1 страница) 1
Ядро (l страниц) l = ( kernel_size + page_size - 1) / page_size
Ramdisk (млн страниц) m = ( ramdisk_size + page_size - 1) / page_size
Загрузчик второго этапа (n страниц) n = ( second_size + page_size - 1) / page_size
Восстановление DTBO (o страниц) o = ( recovery_dtbo_size + page_size - 1) / page_size
DTB (стр.) p = ( dtb_size + page_size - 1) / page_size

Путь к изображению DTB

Для устройств под управлением Android 10 можно использовать инструмент mkbootimg.py и следующие аргументы, чтобы указать путь к образу DTB.

Аргумент Описание
dtb Путь к образу DTB, который будет включен в образы загрузки/восстановления.
dtb_offset При добавлении к аргументу base предоставляет физический адрес загрузки для конечного дерева устройств. Например, если аргумент base равен 0x10000000 , а аргумент dtb_offset равен 0x01000000 , поле dtb_addr_field в заголовке образа загрузки заполняется как 0x11000000 .

Переменная конфигурации платы BOARD_PREBUILT_DTBIMAGE_DIR должна использоваться для указания пути к образу DTB. Если в каталоге BOARD_PREBUILT_DTBIMAGE_DIR присутствует более одного файла с расширением *.dtb , система сборки Android объединяет файлы для создания окончательного образа DTB, используемого при создании загрузочного образа.

Чтобы передать аргумент dtb в mkbootimg.py с образом DTB из каталога, указанного в BOARD_PREBUILT_DTBIMAGE_DIR , переменная конфигурации платы BOARD_INCLUDE_DTB_IN_BOOTIMG должна быть установлена ​​в true . Например:

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

Вы можете добавить аргумент dtb_offset к переменной конфигурации платы BOARD_MKBOOTIMG_ARGS с другими смещениями и версией заголовка. Например:

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)

Поддержка загрузчика

Для успешного запуска VTS на устройствах под управлением Android 10 загрузчик должен поддерживать обновленный загрузочный образ и должен добавить параметр командной строки ядра androidboot.dtb_idx для указания индекса выбранного дерева устройств (DT). Вы можете указать только один (1) индекс. Например, параметр androidboot.dtb_idx=N сообщает N как отсчитываемый от нуля индекс дерева устройств, выбранного загрузчиком из набора DTB, присутствующих в загрузочном образе.