U-Bootの全志系ARM/ARM64プラットフォームにおけるビルド手順

対象とするハードウェアとアーキテクチャ

本稿では、オープンソースのブートローダであるU-Bootを、Allwinner製SoCを搭載した開発ボード向けにビルドするプロセスについて解説します。具体的には、32ビットARMアーキテクチャ(AArch32)のOrange Pi PC(H3チップ)と、64ビットARMアーキテクチャ(AArch64)のOrange Pi PC 2(H5チップ)を対象としています。

ビルド環境の準備

まず、安定したビルドを行うためのホスト環境を整えます。UbuntuベースのLinux環境(例:WSL2上でのUbuntu)を推奨します。必要なツールチェインおよび構築支援ツールを事前にインストールしてください。

sudo apt update
sudo apt install -y \
    gcc-arm-linux-gnueabi \
    gcc-aarch64-linux-gnu \
    bison flex libssl-dev m4 \
    bc build-essential

ソースコードの取得

公式FTPから最新のU-Bootソースをダウンロードします。ここでは2024年7月リリースのバージョンを使用します。

wget https://ftp.denx.de/pub/u-boot/u-boot-2024.07.tar.bz2
tar -xf u-boot-2024.07.tar.bz2
cd u-boot-2024.07

ARM (H3) プラットフォームのビルド

Orange Pi PC(Allwinner H3搭載)用の設定ファイルを利用して構成・ビルドを行います。

make orangepi_pc_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make -j$(nproc) ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

ARM64 (H5) プラットフォームのビルド

Orange Pi PC 2(Allwinner H5搭載)は64ビットCPUのため、異なるツールチェインを使用します。

make orangepi_pc2_defconfig ARCH=arm CROSS_COMPILE=aarch64-linux-gnu-
make -j$(nproc) ARCH=arm CROSS_COMPILE=aarch64-linux-gnu-

依存パッケージの注意点

ビルド中に以下のエラーが発生する場合、対応するパッケージが不足しています。
  • bison: command not foundbison パッケージ未インストール
  • m4 subprocess failedm4 コマンドが利用不可
  • flex related errorsflex パッケージが必要
これらは先述のapt installコマンドで一括解決可能です。

出力される主要なバイナリファイル

ビルド完了後、以下のようなファイルが出力されます。
ファイル名 説明
u-boot デバッグ情報を含むELF形式のU-Boot本体。GDBによる解析に使用。
u-boot.bin 純粋なバイナリイメージ。リンク後の内容をバイナリ化したもの。
spl/sunxi-spl.bin Secondary Program Loader(SPL)。ROM内ブートコードが最初に読み込む小さなローダ。
u-boot-sunxi-with-spl.bin SPLとU-Boot本体を結合したフルイメージ。SDカードやeMMCへの書き込みに使用。

ブートイメージのレイアウト構造

u-boot-sunxi-with-spl.bin は、特定の物理オフセットに従って構成されています。
  • 先頭8KB (0x0 - 0x1FFF): BROM(ブートROM)により読み込まれるブートヘッダ領域
  • 次なる24KB (0x2000 - 0x7FFF): SPLコードが配置される領域
  • 0x8000以降: U-Boot本体(u-boot.bin)が格納される
この構造を確認するには、hexdumpを使用します。

hexdump -C u-boot-sunxi-with-spl.bin | head -20

MMCデバイス上のロード位置に関する設定

SDカードやeMMCへ書き込まれた際、SPLがU-Boot本体を正しくロードできるよう、以下のKconfigマクロが重要です。

CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x40
これは、SPLイメージ終端からの相対セクタ数(512バイト単位)を示します。
実際の物理オフセットは、以下の通り計算されます:
  • ヘッダ8KB = 0x10 セクタ(8192 / 512)
  • SPLサイズ + アライメントにより、U-Boot開始位置は全体で0x50セクタ目(40KB)
  • ただし、内部関数spl_mmc_raw_uboot_offset()は、この0x40に加えてCONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET(通常0x10)を自動付加
したがって、ユーザー側は0x40を指定するだけで正しい位置が確保されます。

設定値の検証方法

マクロ定義の有効性を確認するには、ソース内を検索します。

grep -r "SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR" .
また、生成された.configファイルにも反映されているか確認してください。

タグ: U-Boot ARM arm64 Allwinner OrangePi

6月1日 21:16 投稿