はじめに
この記事では、Mpression Sulfur Type-A Development Kit(以降、Sulfur)に搭載される eMMC の書き込み方法について記載します。
Sulfur ボードは、HPS(Hard Processor System)のブート用の外部フラッシュデバイスとして SD カードと eMMC のどちらを使用するか、SoM 上の DIPSW で選択できるようになっています。
【図 1】HPS 用 Flash デバイス選択スイッチ( SW1 [4] )
参考資料: 詳細な仕様は以下のページからダウンロード可能な各種ドキュメント( Sulfur Type-A キット ユーザーマニュアル Ver.1.1 、他)を参照ください。
1. 機材・開発環境
デザインデモを実行するために必要なツール、バージョン、開発マシンの要件(OS)などを記載します。
1-1. 機材
サンプルデザインの動作確認に必要な機材は以下のとおりです。
-
- Sulfur Type-A 開発キット『 Sulfur Type-A Development Kit 』x1
- FPGA ダウンロード・ケーブル『 Intel® FPGA Download Cable II 』x1
- USB メモリー、もしくは USB-SD アダプター(容量 8GB 以上、USB2.0 の製品推奨)x1
メモ: Sulfur には USB 3.x 対応の Type-A コネクターが 4 ポート搭載されていますが、現在は Agilex™ 5 の ES デバイスの制約により USB 3.x での接続が行えません。USB 3.x 対応の USB デバイスを挿し込む場合は、USB 2.0 仕様の 4 端子のみが接する状態に浅く挿し込む必要があります。
1-2. 開発環境
以下のツールのセットアップが必要です。開発マシンの要件(OS など)は以下のツールが対応する要件に合わせてご準備ください(こちらでは Windows 10 64bit 22H2 環境で確認実施しました)。
-
- FPGA 開発ツール(Version 24.3.1 の Windows 版にて動作確認実施)
- ターミナル・ソフトウェア(TeraTerm、PuTTY など)
ポイント: ビルド済みイメージの書き込みのみを行う場合には、FPGA 開発ツールのフルインストールは不要です。Intel® Quartus® Prime Pro Edition Programmer and Tools で対応いただけます。
ポイント: FPGA 開発ツールは Agilex™ 5 E-Series 向け無償ライセンスが利用できます。
Agilex™ 5 E 開発向け Quartus® Prime Pro Edition 無償ライセンスファイルを取得する方法
2. 提供ファイル
下表に、この記事で紹介する手順に必要なファイルを一覧で示します。
【表 1】 提供ファイル一覧
No. | ファイル名・ダウンロードリンク | 概要 | 更新日 / バージョン |
[1] |
Linux USB ブート用 QSPI イメージ(.jic) |
2025/3/5 | |
[2] |
NTFS 対応 Linux Kernel イメージ (Windows で 4GB 以上のイメージを書き込みたい場合のみ使用) |
2025/3/5 | |
[3] |
Linux USB ブート用 U-Boot 設定 |
2025/3/5 | |
[4] |
Programming File Generator 設定ファイル (QSPI イメージ作成用) |
2025/3/5 |
紹介する eMMC 書き込みの手順は、USB からブートした Linux 環境下で操作を行う方法となります。提供ファイルは USB から Linux をブートさせるために必要な設定変更を行った QSPI ブートイメージとなっています。
ポイント: eMMC へ書き込むイメージファイルは、以下のページから Linux SD カードイメージ(sdimage_agilex5_sulfur_QPDS24.3.1_v1.8.zip)を入手してください。
注記: FPGA 関連のファイル [2], [3] は Sulfur Type-A に搭載される SoM のシリアル番号に応じて、適切なファイルを使用してください。SDM OSC の周波数が異なると正常に動作しません。
ポイント: SDM OSC クロックの周波数設定は、SoM のシリアル番号 によって異なります。シリアル番号が A5SOM1E024D0001 ~ A5SOM1E024D0025 の SoM は 125MHz、それ以外の SoM は 25MHz です。
3. eMMC へのイメージ書き込み手順
ここからは、eMMC へ HPS ブート用のイメージを書き込む方法について説明します。
3-1. USB ストレージ(USB メモリー もしくは USB-SD アダプター)の準備
USB ストレージに Linux ブート環境と eMMC へ書き込む対象のイメージファイルを格納します。
3-1-1. HPS ブート用 SD カードイメージの書き込み
Linux SD カードイメージ(sdimage_agilex5_sulfur_QPDS24.3.1_v1.8.zip)をダウンロードして、USB ストレージに書き込んでください。USB ストレージへの書き込みは、SD カードへイメージを書き込む場合と同じ方法で対応できます。
USB ストレージは、通常の USB メモリー以外に下図の手前のような USB-SD アダプター製品に SD カードを装着する形でも対応できます。
【図 2】 USB ストレージの例(外観)
ヒント: SD カードイメージの書き込み方法は、Getting Started の「4.3 Sulfur Type-A 用 SD Boot Disk の作成」を参照ください。
3-1-2. USB ストレージのパーティションを確認
Sulfur 用の Linux SD カードイメージを書き込んだ USB ストレージをパソコンのディスク管理ツールで確認してください。以下のように、先頭から 4GB 近くを 2 つのパーティションが占有し、残りが空き領域(Unallocated や Free Space)の状態になっているはずです。
【図 3】 イメージ書き込み後の USB ストレージ
3-1-3. USB ストレージのパーティションを編集(新規パーティション追加)
空き領域に新しいパーティションを作成します。作成するパーティションのサイズは、eMMC へ書き込むイメージファイルが格納できるサイズを前提に余裕を持ったサイズで設定してください。
Windows の場合は、Windows メニューアイコンの右クリックメニュー「ディスクの管理(K)」から、Linux (Ubuntu) の場合はアプリケーション検索で Disks を選択していただくことでパーティション編集可能な管理ツールが起動可能です。 管理ツールの使い方は一般情報を検索してご対応ください。
注記: 4GB 以上のイメージファイルを格納する場合はファイルシステムの要件にご注意ください。ファイル単体サイズが 4GB 以上の場合は、FAT32 ではなく NTFS を選択してください。
ポイント: NTFS を選択した場合は、USB ストレージの FAT パーティションに格納されている Linux カーネルイメージ(Image)を 『2. 提供ファイル』の [2] に差し替えてください。Image 差し替えにより、NTFS を読み取り専用の FS として認識可能になります。
【図 4】 新規パーティション追加(Windows)
【図 5】 新規パーティション追加(Linux)
3-1-4. eMMC へ書き込むイメージを格納
前述の手順で新規作成したパーティションに書き込み対象のイメージファイルを格納します。
前述の手順で USB ストレージに書き込んだイメージと同じ Linux SD カードイメージ(sdimage_agilex5_sulfur_QPDS24.3.1_v1.8.zip)を格納する形でも大丈夫です。USB ストレージの容量が限られるため、あらかじめ解凍した SD カードイメージを格納することをお勧めします。
ポイント: 新規パーティションを NTFS で作成した場合は、必ずパソコン側で解凍したイメージファイルを格納する点にご注意ください。ターゲット Linux 側では NTFS が読み取り専用となるため解凍が行えません。
ここまでで USB ストレージの準備は完了です。USB ストレージをパソコンから外して Sulfur ボードのセットアップに進みます。
3-2. 事前準備/ボード・セットアップ
3-2-1. ケーブル接続および DIPSW / スライドスイッチ設定
基本は Getting Started の「4.2 ボード・セットアップ」に記載の設定に合わせてください。
本手順向けに変更する点は以下のとおりです。
-
- HPS 用 Flash デバイス選択スイッチ( SW1 [4] )を OFF(eMMC)に設定
- USB 4ポート (Hub) コネクタに前の手順で作成した USB ストレージを挿入
- SD カードスロットにはカードを装着しない
メモ: USB ストレージは 4 ポートのどこに挿入しても構いません。装着する USB ストレージは1個のみとしてください(複数装着するとデバイス番号やパスが変わる可能性があるため)。
【図 6】 ボード・セットアップ後の状態(参考)
3-2-2. ターミナル・ソフトウェア(TeraTerm)のセットアップ
ターミナル・ソフトウェアを起動して、FPGA のシリアルターミナルを「ボーレート:115200、パリティなし、Stop ビット:1、フロー制御なし」の設定で接続を行ってください。
COM ポートは、以下の情報を参考に FPGA のターミナルを選択してください。
-
- FPGA の接続名: USB Serial Port(COMx)
3-2-3. FPGA コンフィグレーション・ファイルの書き込み&MSEL 変更
『2. 提供ファイル』の [1] から、適切な .jic ファイルを選択して、ダウンロードおよび書き込みを行ってください。書き込みが完了したら MSEL(SW 1.1, 1.2, 1.3)を AS(Fast)mode(OFF, ON, ON) に変更してください。
ヒント: コンフィグレーション・ファイルの書き込み方法は、Getting Started の「5.3.2 .sof ファイルの書き込み」を参照ください。Change File で指定するファイルを .sof から .jic に読み替えてご対応ください。
3-3. 電源投入 ~ Linux USB ブート
3-3-1. ボードの電源投入
電源スイッチ(SW18)を ON に切り替えます。
3-3-2. ブートログ & U-Boot の起動元を確認
ターミナルのログより U-Boot の起動元を確認してください。下図のように U-Boot 起動前の最後に表示される "Trying to boot from ... " のメッセージにて起動元が確認できます。
【図 7】 U-Boot 起動元の確認
注記: U-Boot 起動元のログが「Trying to boot from SPI」であることを確認してください。【図 7】の赤枠のように「from MMC1」と表示される場合は eMMC から起動した状態となりますので、eMMC のデータ消去が必要です。
U-Boot プロンプトで以下のコマンドを実行することで eMMC のデータを消去してください。
$ mmc list
$ mmc dev 0
$ mmc erase 0 0x22000
ポイント: mmc erase 0 0x22000 は、先頭ブロック(0) からサイズ: 0x22000 × 512Byte を消去する指定です。eMMC 全体の消去には時間がかかるため、U-Boot イメージの格納領域が消去対象となるサイズに限定して消去を行っています。
3-3-3. 電源再投入および Linux のブート確認
電源スイッチ(SW18)を ON→OFF→ON してください。QSPI から U-Boot が起動した後に、自動的に USB 経由で Linux がブートします。
注記: Linux がブートしない場合は、USB ストレージの挿し込み状態を確認してください。特に USB 3.x 対応の USB デバイスを使用している場合、深く挿し込み過ぎると USB を認識できない状態になります(挿し込み加減を調整しても認識しない場合は、USB 2.0 のストレージデバイスをご使用いただくか、USB 2.0 の HUB を介して接続してください)。
下図のように、ログインプロンプトが表示された状態になれば Linux ブート完了です。
【図 8】 Linux ブート完了
3-4. Linux ログイン ~ eMMC 書き込み実行
ログインプロンプト(agilex5 login: )にユーザー名:"root" を入力してください。以降、Linux にログインした状態で操作を行います。
3-4-1. eMMC へ書き込むイメージファイルを確認
書き込み対象のイメージファイルが参照可能なことを確認してください。rootfs とは別のパーティションに格納した場合は該当のパーティションを mount してください。
# mkdir part3
# mount /dev/sda3 part3
# ls -al part3
【図 9】 書き込み対象イメージファイルの確認
ポイント: 過去に別のイメージを eMMC へ書き込んでいる場合は、念のため fdisk コマンドでパーティション情報を確認(p)して削除(d)しておくことをお勧めします(任意)。
【図 10】 eMMC デバイスファイルの確認と既存パーティション削除
3-4-2. eMMC へのイメージ書き込み実行
以下のコマンドで書き込みを行います。dd コマンド実行後、書き込み完了してプロンプトが戻るまで暫く時間がかかります。プロンプトが戻ったら sync コマンドを実行します。
# dd if=./part3/sdimage_agilex5_sulfur_QPDS24.3.1_20250129_01.img of=/dev/mmcblk0 bs=1M
# sync
ポイント: dd コマンドの if= (Input File) には書き込み対象イメージを指定してください。
ポイント: dd コマンド実行後には必ず sync コマンドを行ってください。この操作によりキャッシュのみに書き込まれたデータが物理メモリにも反映されます。
3-4-3. 書き込み完了(Linux シャットダウン)
halt コマンドを実行して Linux を終了します。"reboot: System halted" のメッセージが表示されたら電源スイッチ(SW18)を OFF して、USB デバイスを抜いてください。
# halt
ここまでで eMMC への書き込み作業は完了です。
3-5. 書き込み結果の確認(eMMC ブート)
最後に、USB ストレージを外した状態で電源を再投入し、書き込んだイメージを使用したブートが正常に動作することを確認してください。
正常にブートすることが確認できたら書き込み手順は終了になります。
4. 補足情報:提供ファイルの内容について
ここからは、『2. 提供ファイル』と同じ環境を作成するために必要な情報を記載します。
4-1. U-Boot の環境設定(USBブート向けの編集内容)
『2. 提供ファイル』[1] に含まれる FSBL (U-Boot SPL) と SSBL (U-Boot) の環境設定について補足します。詳細な設定内容は『2. 提供ファイル』[3] の内容を確認してださい。
主に以下の 3 点を変更しています。
-
- bootcmd 変数の変更(usb start の追加、Linux ブートデバイスを mmc から usb に変更)
- U-Boot の環境変数の保存場所指定(ENV_IS_IN_FAT から ENV_IS_IN_UBI に変更)
- U-Boot のロード元オフセット(0x4000000 -> 0xD00000 に変更:イメージサイズ削減のため)
変更後の bootcmd 変数の内容は以下のとおりです。
CONFIG_BOOTCOMMAND="usb start && bridge enable && fatload usb 0:1 0x82000000 Image && fatload usb 0:1 0x86000000 socfpga_agilex5_sulfur.dtb && setenv bootargs console=ttyS0,115200 root=/dev/sda2 rw rootwait && booti 0x82000000 - 0x86000000"
ポイント: eMMC から U-Boot の起動が行える場合は、bootcmd を変更後の内容に書き換えるのみで USB ブートが可能です。QSPI イメージを書き込まなくても USB ブートからの eMMC 書き換えが可能です。
メモ: U-Boot プロンプト上で setenv や editenv コマンドを使用して bootcmd を変更した後に、「run bootcmd」を実行することで Linux のブートが開始します。
参考: ブートローダー/Linux カーネルのビルド方法:for Mpression Sulfur Type-A Development Kit – 株式会社マクニカ アルティマ カンパニー
4-2. USB ブート用 .jic ファイルの内容および作り方
『2. 提供ファイル』[1] の .jic ファイルの作成手順についても紹介しておきます。
手順に含まれるコマンドは、開発マシン(PC)の Quartus® Prime のパスが通ったターミナル環境で実行してください。
注記: この作業は Linux OS 環境で行う必要があります。ubinize など手順に必要なパッケージがインストールされていない場合は別途インストールしてご対応ください。
4-2-1. 作業ディレクトリーの作成および材料準備
作業ディレクトリーを作成して、以下のファイルを格納します。
-
- sulfur_flash_image_uboot.pfg(『2. 提供ファイル』[4] )
- fpga.sof(GHRD の output_files 以下の .sof をリネームして格納、もしくは、シンボリックリンクを作成)
- spl.hex( FSBL (U-Boot SPL) の .hex をリネームして格納、もしくは、シンボリックリンクを作成)
- u-boot.itb( SSBL (U-Boot) と ATF を含む u-boot.itb をそのまま格納)
ポイント: spl.hex と u-boot.itb は『4-1. U-Boot の環境設定(USBブート向けの編集内容)』の設定変更を適用した環境でビルドしたファイルを使用してください。
4-2-2. U-Boot イメージのサイズ調整(パディング)
u-boot.itb を 2MByte のサイズに調整した上で u-boot.bin にリネームします。
# uboot_part_size=2*1024*1024
# uboot_size=`wc -c < u-boot.itb`
# uboot_pad="$((uboot_part_size-uboot_size))"
# truncate -s +$uboot_pad u-boot.itb
# mv u-boot.itb u-boot.bin
4-2-3. UBIFS の作成
USBFS 用の領域に書き込むバイナリーを作成します。Linux を起動するための QSPI ブート環境を構築する場合は、Linux Kernel や rootfs 等も UBIFS に含めますが、今回の用途では U-Boot の環境変数保存領域(env)のみにしています。
# cat <<EOT > ubinize.cfg
[env]
mode=ubi
vol_id=0
vol_name=env
vol_size=256KiB
vol_type=dynamic
EOT
# ubinize -o root.ubi -p 65536 -m 1 -s 1 ubinize.cfg
# ln -s root.ubi hps.bin
4-2-4. quartus_pfg コマンドの実行( .jic ファイルを生成)
以下のコマンドを実行すると flash_image.jic が生成されます。
# quartus_pfg -c sulfur_flash_image_uboot.pfg
4-3. NTFS 対応 Linux Kernel イメージ
『2. 提供ファイル』[2] の Linux Kernel イメージの設定について補足します。
Sulfur 向けのリファレンス・デザインで使用する Linux Kernel イメージをベースに、Linux Kernel のコンフィグレーション設定の一部を変更してビルドしています。
コンフィグレーション設定の変更については、make defconfig の後に make menuconfig を実行し、"File systems > DOS/FAT/EXFAT/NT Filesysmems” を下図のとおりに編集しています。
変更したコンフィグレーションは以下の水色枠の内容のとおりです。
【図 11】 NTFS 対応 Linux Kernel イメージの設定
メモ: NTFS だけではなく exFAT も有効化しています。尚、NTFS write support を有効にしていますが、この設定だけでは書き換え可能なファイルシステムとしては利用できず、読み取り専用のファイルシステムとして動作します。NTFS Read-Write file system support を追加で有効化した場合も同様に、読み取り専用での動作となるようです。
参考: ブートローダー/Linux カーネルのビルド方法:for Mpression Sulfur Type-A Development Kit – 株式会社マクニカ アルティマ カンパニー
おわりに
eMMC の書き込み手順の紹介は以上になります。SD カードに比べると、eMMC への書き込みには手間がかかる印象を持ったのではないでしょうか?
Sulfur ボードの場合は、DIPSW 1 つで eMMC と SD カードの切り替えが可能になっていますので、用途に応じて eMMC と SDカードを使い分けていただくと便利です。例えば、頻繁にイメージを書き換えるデバッグ用途には SD カードをご使用いただき、デモ環境やリリース環境など完成形に近いイメージを書き込む用途に eMMC をご使用いただくような使い分けが考えられます。