はじめに
この記事では、Mpression Sulfur Type-A Development Kit(以降、Sulfur)向けのブートローダーおよび Linux カーネルをビルドする手順をご紹介します。基本的な手順は以下のリンク先の内容と概ね同じになっています。
参考資料:Building Bootloader for Agilex 5 | Documentation | RocketBoards.org
以下の3点だけ独自の対応となっているのでご留意ください。
- 各種ソースツリーは Sulfur 向け専用のソースツリーをダウンロードして使用。
- U-Boot のコンフィグ設定は専用の defconfig(socfpga_agilex5_sulfur_defconfig)を使用。
- Linux デバイスツリーは専用のデバイスツリー・ソース(socfpga_agilex5_sulfur.dts)から生成。
注記:U-Boot および Linux カーネルのビルド作業は、Linux OS 環境下で行う必要があるという点にご注意ください。このドキュメントの手順については Ubuntu 22.04 LTS で確認を行っています。
1. コンパイラー・ツールチェーンのセットアップ
1-1. ツールチェーンのダウンロード & 解凍
開発マシンの適当な場所へツールチェーンを格納します。格納場所にする予定のディレクトリーに移動して以下を実行してください。
wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz tar xf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz rm -f gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
1-2. 環境変数のセットアップ
export PATH=`pwd`/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH
export ARCH=arm64
export CROSS_COMPILE=aarch64-none-linux-gnu-
上記の export 文を ~/.bashrc などの初期設定ファイルに追記しておくと、端末起動時に環境変数が自動適用されます。もしくは、専用のシェルスクリプトに記述しておき、端末起動毎にスクリプトを実行してください。
1-3. その他に必要なパッケージのインストール
ツールチェーン以外にも必要なパッケージがあるので、以下のコマンドでインストールします。
sudo apt install build-essential bison flex ncurses-dev swig libssl-dev
ポイント: Ubuntu 以外の OS 環境を使用する場合は、パッケージ管理のコマンドや必要なパッケージが異なります。
2. ソースツリーの入手方法
Sulfur 向けに公開している SD カードイメージを構成するブートローダー(U-Boot & ATF)と Linux カーネルのソースツリーは、SD カードイメージの Note 欄のリンクからダウンロードが可能です。
参考資料:Macnica Sulfur ~ Development Kit for Agilex™ 5 FPGA E-Series ~ | Documentation | RocketBoards.org
ダウンロードしたアーカイブの中身は、以下のようなファイル構成になっています。
各ファイルの概要は以下の通りです。
ファイル名(xxx は可変) | 概要 |
README.EN / README.JP | オリジナルのソースツリーの所在情報およびビルド方法のテキスト |
arm-trusted-firmware-xxx.tgz | Arm Trusted Firmware(ATF) のソースツリー |
u-boot-socfpga-xxx.tgz | U-Boot のソースツリー |
linux-socfpga-xxx.tgz | Linux カーネル/ドライバーのソースツリー |
poky-build-xxx.tgz | RootFS(Yocto Poky)ビルド用設定およびレシピのアーカイブ |
poky-socfpga-sources-xxx.tgz | RootFS に含まれる OSS のソースツリーのアーカイブ (*1) |
(*1) ファイルサイズが大きい為、別途ダウンロード頂く構成とする場合があります。(README を参照ください)
3. Arm Trusted Firmware(ATF)のビルド
ソースツリーを解凍して、解凍後のソースツリー Top ディレクトリーへ移動します。
tar xf arm-trusted-firmware-xxx.tgz
cd arm-trusted-firmware-xxx
以下のコマンドで ATF をビルドします。
make -j 48 PLAT=agilex5 bl31
実行例:
4. SSBL(U-Boot)および FSBL(U-Boot SPL)のビルド
ソースツリーを解凍して、解凍後のソースツリー Top ディレクトリーへ移動します。
tar xf u-boot-socfpga-xxx.tgz
cd u-boot-socfpga-xxx
先にビルドした ATF(bl31.bin)を U-Boot ソースツリー直下にリンクします(以下のコマンドで指定している ATF ソースツリーの所在は、自身のビルド環境に合わせて読み替えて対応ください)。
ln -s ../arm-trusted-firmware-xxx/build/agilex5/release/bl31.bin .
この手順は、U-Boot と ATF の両方を含むイメージファイル(u-boot.itb)をビルドするために必要です。リンク設定後に ls -al コマンドで以下のようにリンク先を正しく認識していることも確認ください。
以下のコマンドで FSBL(U-Boot SPL)および SSBL(U-Boot)をビルドします。
make mrproper
make socfpga_agilex5_sulfur_defconfig
make -j 48
FSBL (U-Boot SPL) は Intel HEX 形式に変換したファイルを使用しますが、make 契機で自動生成される spl/u-boot-spl-dtb.hex がそのまま使用可能です。以下のコマンドにて手動で変換する事も可能です。
aarch64-none-linux-gnu-objcopy -I binary -O ihex --change-addresses 0x0 spl/u-boot-spl-dtb.bin spl/u-boot-spl.ihex
ポイント: 自動生成される u-boot-spl-dtb.hex と手動で生成する u-boot-spl.ihex の内容は同一です。後者は Quartus® Prime 24.2 向け以前のデザインで使用していた古い手順となります。
実行例:
5. Linux カーネル/ドライバーのビルド
ソースツリーを解凍して、解凍後のソースツリー Top ディレクトリーへ移動します。
tar xf linux-socfpga-xxx.tgz
cd linux-socfpga-xxx
以下のコマンドで Linux カーネルおよびデバイスツリーをビルドします。
make defconfig make -j 48 Image && make intel/socfpga_agilex5_sulfur.dtb
実行例:
続けて、以下のコマンドでドライバーモジュール(.ko)をビルドします。さらに、ドライバーモジュールを modules_install ディレクトリー以下にインストールします。
make -j 48 modules
mkdir modules_install
export INSTALL_MOD_PATH=./modules_install
make modules_install
実行例:
modules_install ディレクトリー以下にインストールされたカーネルモジュール(.ko)をアーカイブしておきます。アーカイブしたカーネルモジュールは rootfs にインストールする際に使用します。
cd modules_install
tar czf modules_sulfur_xxx.tgz lib
実行例:
6. ビルド成果物
最後に、ここまでの手順でビルドされる成果物の一覧を示します。
成果物 | ファイル名(xxx は任意) | 概要 |
FSBL |
u-boot-spl-dtb.hex or u-boot-spl.ihex |
U-Boot SPL の ihex イメージ。SDM へ書き込むコンフィグレーション・データと結合して使用(※ 補足参照)。 |
SSBL & ATF | u-boot.itb | U-Boot と ATF を含む .itb ファイル。ブート用 SD カードの FAT パーティションへ格納。 |
Linux カーネル | Image | Linux カーネルイメージ。ブート用 SD カードの FAT パーティションへ格納。 |
Linux デバイスツリー | socfpga_agilex5_sulfur.dtb |
Linux デバイスツリー Blob。ブート用 SD カードの FAT パーティションへ格納。 |
Linux ドライバー モジュール |
modules_sulfur_xxx.tgz | Linux ドライバーモジュールのアーカイブ。ブート用 SD カードの rootfs パーティションの /lib/modules 以下に展開して使用。 |
補足: FSBL をコンフィグレーション・ファイルに結合
FSBL(u-boot-spl-dtb.hex or u-boot-spl.ihex)を Sulfur 用の Quartus プロジェクトの output_files 以下に上書き格納した上で、次のコマンドを実行してください。
ポイント: この手順には、適切なバージョンの Quartus® Prime もしくは、Quartus® Prime Programmer がセットアップされた(quartus_pfg が実行可能な)環境が必要です。結合対象のコンフィグレーション・データを生成したツールバージョンにて対応してください。
.sof に結合する場合:
quartus_pfg -c output_files/sulfur_ghrd_top.sof output_files/sulfur_ghrd_top_hps.sof \ -o hps_path=output_files/u-boot-spl-dtb.hex
.jic に結合する場合(.sof も自動生成されます):
quartus_pfg -c output_files/sulfur_ghrd_top.sof output_files/sulfur_ghrd_top_hps.jic \ -o device=MT25QU128 \ -o flash_loader=A5ED065BB32AE5SR0 \ -o hps_path=output_files/u-boot-spl-dtb.hex \ -o mode=ASX4
注記: FSBL の Intel HEX 形式ファイルの名前が、デザインのバージョンにより2通り存在しています。コマンド実行時には「-o hps_path=」で指定する FSBL (u-boot-spl-dtb.hex or u-boot-spl.ihex) のファイル名を適宜変更して対応ください。
まとめ
この記事では、ブートローダーおよび Linux カーネルを個別にビルドする手順についてご紹介しました。プレビルドの SD カードイメージをベースに、ブートローダーもしくは Linux カーネル(もしくは両方)をカスタマイズした物に差し替えて検証したい場合などにご活用ください。