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 元組。系統啟動載入程式會使用每個 FDT 標頭中的 totalsize 欄位來讀取及剖析對應的 blob。

  • DTB/DTBO 分區。引導程式有一種有效的方法,可透過檢查 dt_table_entry 結構體 (包含 idrevcustom 欄位) 來選取正確的 DT blob,該結構體可儲存項目的硬體識別資訊。詳情請參閱「DTB/DTBO 區隔區」。

在開機映像檔中加入 DTB 映像檔

搭載 Android 10 的裝置可以在開機映像檔中加入 DTB 映像檔。這樣一來,Android 就不需要支援將 DTB 映像檔附加至核心的 image.gz 指令碼,並可使用供應商測試套件 (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
復原 DTBO (o 頁面) 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)

系統啟動載入程式支援

如要讓 VTS 在執行 Android 10 的裝置上順利執行,引導程式必須支援更新的啟動映像檔,並新增 androidboot.dtb_idx 核心指令列參數,指出所選裝置樹狀結構 (DT) 的索引。您只能指定一個 (1) 索引。舉例來說,參數 androidboot.dtb_idx=N 會將 N 回報為 bootloader 從啟動映像檔中一組 DTB 選取的裝置樹狀結構,以 0 為基底的索引。