対象とするハードウェアとアーキテクチャ
本稿では、オープンソースのブートローダである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 found→bisonパッケージ未インストールm4 subprocess failed→m4コマンドが利用不可flex related errors→flexパッケージが必要
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 -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)を自動付加
設定値の検証方法
マクロ定義の有効性を確認するには、ソース内を検索します。
grep -r "SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR" .
また、生成された.configファイルにも反映されているか確認してください。