DTB 映像檔

Android 實作項目可以包含供開機載入程式使用的裝置樹狀結構 Blob (DTB) 映像檔。DTB 映像檔的位置 (以及指定 DTB 映像檔參數的選項) 會因 Android 版本而異。

  • 在 Android 11 中,使用通用核心映像檔 (GKI) 的裝置必須支援供應商啟動分區,其中包含從啟動分區重新定位的所有供應商專屬資訊。由於 DTB 映像檔包含廠商專屬資料,因此現在屬於廠商開機分割區。如要指定 DTB 映像檔參數,請參閱供應商開機標頭

  • 在 Android 10 中,裝置可以在啟動分割區中加入 DTB 映像檔。如要指定 DTB 映像檔參數,請參閱「在開機映像檔中加入 DTB 映像檔」。

  • 在 Android 9 以下版本中,DTB 映像檔可以存在於自己的分割區中,也可以附加至核心 image.gz,以建立核心 + DTB 映像檔 (然後傳遞至 mkbootimg 以建立 boot.img)。

DTB 圖片格式

在 Android 10 以上版本中,DTB 映像檔必須使用下列其中一種格式:

  • DT blob 會一個接一個串連。開機載入程式會使用每個 FDT 標頭中的 totalsize 欄位,讀取及剖析對應的 Blob。

  • DTB/DTBO 分區。啟動載入器會檢查 dt_table_entry 結構 (包含 idrevcustom 欄位),其中可保留項目的硬體識別資訊,藉此有效選取正確的 DT Blob。詳情請參閱「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 頁面) m = (ramdisk_size + page_size - 1) / page_size
第二階段啟動載入程式 (n 頁) n = (second_size + page_size - 1) / page_size
Recovery DTBO (o pages) o = (recovery_dtbo_size + page_size - 1) / page_size
DTB (p 頁面) 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,並使用 BOARD_PREBUILT_DTBIMAGE_DIR 指定目錄中的 DTB 映像檔,主機板設定變數 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)

系統啟動載入程式支援

如要在搭載 Android 10 的裝置上順利執行 VTS,開機載入程式必須支援更新後的開機映像檔,並新增 androidboot.dtb_idx 核心指令列參數,指出所選裝置樹狀結構 (DT) 的索引。您只能指定一個 (1) 索引。舉例來說,參數 androidboot.dtb_idx=N 會回報 N,這是開機載入器從開機映像檔中的 DTB 集合選取的裝置樹狀結構,以零為起始的索引。