Immagini DTB

Le implementazioni Android possono includere un'immagine DTB (Device Tree BLOB) utilizzabile dal bootloader. La posizione dell'immagine DTB (e le opzioni per specificare i parametri dell'immagine DTB) differiscono tra le versioni Android.

  • In Android 11, i dispositivi che utilizzano l' immagine generica del kernel (GKI) devono supportare la partizione di avvio del fornitore , che include tutte le informazioni specifiche del fornitore che sono state riposizionate dalla partizione di avvio. Poiché l'immagine DTB contiene dati specifici del fornitore, ora fa parte della partizione di avvio del fornitore. Per specificare i parametri dell'immagine DTB, consulta Intestazione di avvio del fornitore .

  • In Android 10, i dispositivi possono includere l'immagine DTB nella partizione di avvio. Per specificare i parametri dell'immagine DTB, vedere Inclusione dell'immagine DTB nell'immagine di avvio .

  • In Android 9 e versioni precedenti, l'immagine DTB può esistere nella propria partizione o essere aggiunta al kernel image.gz per creare l'immagine kernel + DTB (che viene quindi passata a mkbootimg per creare boot.img ).

Formato immagine DTB

In Android 10 e versioni successive, l'immagine DTB deve utilizzare uno dei seguenti formati:

  • BLOB DT concatenati uno dopo l'altro. Il bootloader utilizza il campo totalsize in ciascuna intestazione FDT per leggere e analizzare il BLOB corrispondente.

  • Partizioni DTB/DTBO. Il bootloader dispone di un modo efficiente per selezionare il BLOB DT corretto esaminando la struttura dt_table_entry (contiene id , rev e campi custom ) che può contenere informazioni di identificazione dell'hardware per la voce). Per i dettagli, vedere Partizioni DTB/DTBO .

Inclusa l'immagine DTB nell'immagine di avvio

I dispositivi che eseguono Android 10 possono includere l'immagine DTB nell'immagine di avvio. Ciò elimina la necessità per Android di supportare script che aggiungono l'immagine DTB a image.gz nel kernel e consente l'uso del test Vendor Test Suite (VTS) per verificare (e standardizzare) il posizionamento DTB.

Inoltre, per i dispositivi non A/B, è più sicuro avere il DTB come parte dell'immagine di ripristino piuttosto che in una partizione separata per evitare problemi causati da OTA interrotte. Durante un OTA, se si verifica un problema dopo l'aggiornamento della partizione DTB (ma prima del completamento dell'aggiornamento completo), il dispositivo tenta di avviarsi in modalità di ripristino per completare l'OTA; tuttavia, poiché la partizione DTB è già stata aggiornata, potrebbe verificarsi una mancata corrispondenza con l'immagine di ripristino (che non è stata ancora aggiornata). Avere l'immagine DTB come parte del formato dell'immagine di avvio previene tali problemi rendendo l'immagine di ripristino autosufficiente (ovvero, non dipende da un'altra partizione).

Struttura dell'immagine di avvio

I dispositivi che eseguono Android 10 possono includere un'immagine DTB utilizzando la seguente struttura dell'immagine di avvio.

Sezione immagine di avvio Numero di pagine
Intestazione di avvio (1 pagina) 1
Kernel (l pagine) l = ( kernel_size + page_size - 1) / page_size
Ramdisk (m pagine) m = ( ramdisk_size + page_size - 1) / page_size
Bootloader di seconda fase (n pagine) n = ( second_size + page_size - 1) / page_size
Ripristino DTBO (o pagine) o = ( recovery_dtbo_size + page_size - 1) / page_size
DTB (p pagine) p = ( dtb_size + page_size - 1) / page_size

Percorso dell'immagine DTB

Per i dispositivi con Android 10, puoi utilizzare lo strumento mkbootimg.py e i seguenti argomenti per specificare il percorso dell'immagine DTB.

Discussione Descrizione
dtb Percorso dell'immagine DTB da includere nelle immagini di avvio/ripristino.
dtb_offset Se aggiunto all'argomento base , fornisce l'indirizzo del carico fisico per l'albero del dispositivo finale. Ad esempio, se l'argomento base è 0x10000000 e l'argomento dtb_offset è 0x01000000 , il dtb_addr_field nell'intestazione dell'immagine di avvio viene popolato come 0x11000000 .

La variabile di configurazione della scheda BOARD_PREBUILT_DTBIMAGE_DIR deve essere utilizzata per specificare il percorso dell'immagine DTB. Se nella directory BOARD_PREBUILT_DTBIMAGE_DIR è presente più di un file con estensione *.dtb , il sistema di build Android concatena i file per creare l'immagine DTB finale utilizzata nella creazione dell'immagine di avvio.

Per passare l'argomento dtb a mkbootimg.py con l'immagine DTB dalla directory specificata da BOARD_PREBUILT_DTBIMAGE_DIR , la variabile di configurazione della scheda BOARD_INCLUDE_DTB_IN_BOOTIMG deve essere impostata su true . Per esempio:

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

Puoi aggiungere l'argomento dtb_offset alla variabile di configurazione della scheda BOARD_MKBOOTIMG_ARGS con gli altri offset e la versione dell'intestazione. Per esempio:

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)

Supporto per il bootloader

Affinché VTS venga eseguito correttamente sui dispositivi che eseguono Android 10, il bootloader deve supportare l'immagine di avvio aggiornata e deve aggiungere il parametro della riga di comando del kernel androidboot.dtb_idx per indicare l'indice dell'albero dei dispositivi selezionato (DT). È possibile specificare solo un (1) indice. Ad esempio, il parametro androidboot.dtb_idx=N riporta N come indice in base zero dell'albero dei dispositivi selezionato dal bootloader dall'insieme di DTB presenti nell'immagine di avvio.