Le implementazioni Android possono includere un'immagine DTB (Device Tree Blob) da utilizzare dal bootloader. La posizione dell'immagine DTB (e le opzioni per specificare i parametri dell'immagine DTB) variano a seconda delle release di Android.
In Android 11, i dispositivi che utilizzano l'immagine del kernel generico (GKI) devono supportare la partizione di avvio del fornitore, che include tutte le informazioni specifiche del fornitore spostate 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 delle immagini DTB, consulta Intestazione boot del fornitore.
In Android 10, i dispositivi possono includere l'immagine DTB nella partizione di avvio. Per specificare i parametri dell'immagine DTB, consulta 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 il kernel + immagine DTB (che viene quindi passata amkbootimg
per creareboot.img
).
Formato dell'immagine DTB
In Android 10 e versioni successive, l'immagine DTB deve utilizzare uno tra i seguenti formati:
Blob DT concatenati uno dopo l'altro. Il bootloader utilizza il campo
totalsize
in ogni intestazione FDT per leggere e analizzare il blob corrispondente.Partizioni DTB/DTBO. Il bootloader ha un modo efficiente per selezionare il blob DT corretto esaminando la struttura
dt_table_entry
(contiene i campiid
,rev
ecustom
) che può contenere informazioni di identificazione dell'hardware per la voce. Per maggiori dettagli, vedi DTB/DTBO Partitions.
Includi l'immagine DTB nell'immagine di avvio
I dispositivi con Android 10 possono includere l'immagine DTB nell'immagine di avvio. In questo modo, Android non deve supportare script che aggiungono l'immagine DTB a image.gz
nel kernel e consente l'utilizzo 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 all'interno dell'immagine di recupero anziché in una partizione separata per evitare problemi causati da OTA interrotte. Durante una OTA, se si verifica un problema dopo l'aggiornamento della partizione DTB (ma prima di completare l'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). L'immagine DTB all'interno del formato dell'immagine di avvio previene questi problemi rendendo l'immagine di ripristino autosufficiente (ovvero non dipende da un'altra partizione).
Struttura dell'immagine di avvio
I dispositivi con Android 10 possono includere un'immagine DTB utilizzando la seguente struttura dell'immagine di avvio.
Sezione Immagine di avvio | Numero di pagine |
---|---|
Intestazione del boot (1 pagina) | 1 |
Kernel (pagine L) | 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 |
DTBO (o pagine) di recupero | o = (recovery_dtbo_size + page_size -
1) / page_size |
DTB (pagine) | p = (dtb_size + page_size -
1) / page_size |
Percorso immagine DTB
Per i dispositivi con Android 10, puoi utilizzare lo strumentomkbootimg.py
e i seguenti argomenti per specificare il percorso dell'immagine DTB.
Argomento | Descrizione |
---|---|
dtb |
Percorso dell'immagine DTB da includere nelle immagini di avvio/recupero. |
dtb_offset |
Se aggiunto all'argomento base , fornisce l'indirizzo di caricamento fisico per la struttura ad albero del dispositivo finale. Ad esempio, se l'argomento base è 0x10000000 e l'argomento dtb_offset è 0x01000000 , dtb_addr_field nell'intestazione dell'immagine di avvio viene inserito come 0x11000000 . |
Per specificare il percorso dell'immagine DTB, devi utilizzare la variabile di configurazione della scheda BOARD_PREBUILT_DTBIMAGE_DIR
. Se nella directory BOARD_PREBUILT_DTBIMAGE_DIR
è presente più di un file con estensione *.dtb
, il sistema di build di 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
. Ad 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. Ad 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 del bootloader
Affinché VTS venga eseguito correttamente sui dispositivi con Android 10, il bootloader deve supportare l'immagine di avvio aggiornata e aggiungere il parametro della riga di comando del kernel androidboot.dtb_idx
per indicare l'indice della struttura ad albero dei dispositivi (DT) selezionata. Puoi specificare un solo (1)
indici. Ad esempio, il parametro androidboot.dtb_idx=N
indica N
come indice in base zero della struttura ad albero dei dispositivi selezionato dal bootloader dall'insieme di DTB presenti nell'immagine di avvio.