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 イメージをブートイメージに含めることができます。これにより、カーネルで DTB イメージを image.gz に追加するスクリプトを Android がサポートする必要がなくなり、ベンダー テストスイート(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
第 2 段階のブートローダー(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 引数が 0x10000000dtb_offset 引数が 0x01000000 の場合、ブートイメージ ヘッダーの dtb_addr_field には 0x11000000 が代入されます。

DTB イメージのパスの指定にはボード構成変数 BOARD_PREBUILT_DTBIMAGE_DIR を使用する必要があります。拡張子が *.dtb であるファイルがディレクトリ BOARD_PREBUILT_DTBIMAGE_DIR に複数存在する場合、Android ビルドシステムはこれらのファイルを連結して、ブートイメージ作成に使用する最終的な DTB イメージを作成します。

BOARD_PREBUILT_DTBIMAGE_DIR で指定されたディレクトリにある DTB イメージと引数 dtbmkbootimg.py に渡すには、ボード構成変数 BOARD_INCLUDE_DTB_IN_BOOTIMGtrue に設定する必要があります。次に例を示します。

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 のセットからブートローダーによって選択されたデバイスツリーのゼロベースのインデックスとしてレポートします。