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構造体(id、rev、customの各フィールドが格納されている)を調べることにより、適切な 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 引数が 0x10000000 で dtb_offset 引数が 0x01000000 の場合、ブートイメージ ヘッダーの dtb_addr_field には 0x11000000 が代入されます。 |
DTB イメージのパスの指定にはボード構成変数 BOARD_PREBUILT_DTBIMAGE_DIR を使用する必要があります。拡張子が *.dtb であるファイルがディレクトリ BOARD_PREBUILT_DTBIMAGE_DIR に複数存在する場合、Android ビルドシステムはこれらのファイルを連結して、ブートイメージ作成に使用する最終的な DTB イメージを作成します。
BOARD_PREBUILT_DTBIMAGE_DIR で指定されたディレクトリにある DTB イメージと引数 dtb を mkbootimg.py に渡すには、ボード構成変数 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 のセットからブートローダーによって選択されたデバイスツリーのゼロベースのインデックスとしてレポートします。