DE0-Nano-SoCを使って、LinuxなどのOSを使わない生アプリ(Bare Metal:ベアメタル)を実行するまでの手順です。
DE0-Nano-SoCでのブートについて
DE0-Nano-SoCに搭載されているCyclone VにはBOOTSEL(BSEL[2:0])という外部端子が存在し、その設定によってCPU(HPS)のブート先が設定てきるようになっています。具体的には、次の場所からブートできるようです。
- SD/MMC
- QSPI
- NAND
- FPGA
ただ、DE0-Nano-SoCのボードにはBOOTSELを簡単に変更できるようなジャンパやスイッチは見当たりません。ボードの回路図を見ると、SDカードからのブートに固定されているようです。(BOOTSEL[2:0] = 3’d5 = 3’b101)このため、ブートはSDカードから行うことになります。
実行環境作成手順
ベアメタルアプリを実行できる環境の作成手順は次のとおりです。
- DE0-Nano-SoCのFPGAプロジェクトを用意する
- Preloaderを生成してコンパイルする
- SDカードにsd_card_linux_boot_image.imgを書き込む
- SDカードにPreloaderを書き込む
- SDカードにベアメタルアプリを書き込む
それぞれの手順の詳細は次のとおりです。今回利用したQuartus IIのバージョンは15.0です。
DE0-Nano-SoCのFPGAプロジェクトを用意する
適当なプロジェクトのデータを用意します。今回は、DE0-Nano-SoCに付属のHPS_CONTROL_FPGA_LEDを利用します。プロジェクトのデータはベアメタルのブート自体には直接関係しませんが、Preloaderを生成するために必要になります。まず、HPS_CONTROL_LEDを適当なディレクトリにコピーしてから、Quartus IIでコンパイルを行います。
Preloaderを生成してコンパイルする
BSP EditorでPreloaderのソースを生成してコンパイルします。まず、Embedded Command Shellを起動します。Embedded Command Shellは、Quartus II(SoC EDS)のインストールディレクトリのembeddedに格納されています。
BSP Editorを起動します。
BSP EditorのFile->New HPS BSP…から新しいBSPを作成します。
Preloader settings directry:にFPGAのプロジェクトディレクトリ内のhps_isw_handoff\soc_system_hps_0を指定します。この例の場合は、C:\tmp\HPS_CONTROL_FPGA_LED\HPS_CONTROL_FPGA_LED\hps_isw_handoff\soc_system_hps_0です。後はデフォルトのままでOKをクリックします。
BSP EditorのMainタブでSettingsを選択します。次に、以下のパラメータにチェックを入れます。これ以外のパラメータはチェックしません。
spl.warm_reset_handshale | FPGA |
ETR | |
spl.boot | CHECKSUM_NEXT_IMAGE |
STATE_REG_ENABLE | |
BOOTROM_HANDSHAKE_CFGIO | |
WARMRST_SKIP_CFGIO | |
RAMBOOT_PLLRESET | |
BOOT_FROM_SDMMC | |
FAT_SUPPORT | |
spl.performance | SERIAL_SUPPORT |
また、FAT_SUPPORTのFAT_LOAD_PAYLOAD_NAME:には、ベアメタルアプリの名前を入れます。この例ではhello-mkimage.binとしています。
設定ができたら、Generateボタンをクリックしてソースコードを生成します。
BSP Editorを終了し、Embedded Command Shellのカレント・ディレクトリをFPGAプロジェクト内のsoftware/spl-bspに変更します。この例の場合は、C:\tmp\HPS_CONTROL_FPGA_LED\HPS_CONTROL_FPGA_LED\software\spl_bspです。
makeを実行します。
正常に処理が終了すると、preloader-mkpimage.binが生成されます。
SDカードにsd_card_linux_boot_image.imgを書き込む
次に、SDカードにsd_card_linux_boot_image.imgを書き込みます。名前を見るとLinuxがブートしそうですが、気にしなくて良いようです。このファイルはQuartus IIのインストールディレクトリに格納されています。場所は、インストールディレクトリ内のembedded\embeddedsw\socfpga\prebuilt_imagesです。sd_card_linux_boot_image.tar.gzとして圧縮されているので、適当な場所にコピーしてから解凍します。次にSDカードに書き込みます。書き込みには、例えば無償ツールのWin32DiskImagerなどが利用できます。
この例では、SDカードはDドライブです。SDカードにLinuxなどのデータが既に格納されている場合は、書き込み前にWin32DiskImagerでバックアップしておいた方が良いかも知れません。
SDカードにPreloaderを書き込む
BSP Editorとmakeで生成したpreloader-mkpimage.binをSDカードに書き込みます。書き込みには、alt-boot-disk-utilを使用します。コマンドは、alt-boot-disk-util -a write -p preloader-mkpimage.bin -d <SDカードドライブ>です。この例の場合、SDカードはDドライブなので、alt-boot-disk-util -a write -p preloader-mkpimage.bin -d dになります(Windowsの場合)。
このとき、Embedded Command Shellは管理者として実行していないとエラーが発生するので注意が必要です。
SDカードにベアメタルアプリを書き込む
ベアメタルアプリは、まずはブートを確認するためにビルド済みのものを利用します。データはhttp://www.altera.com/literature/an/cv_boot_guide.zipに公開されています。このzipファイルを解凍すると、cv_boot_guide\cv_boot_guide\prebuilt\applicationディレクトリが生成され、その中にhello-mkimage.binが格納されています。このベアメタルアプリは、コンソールにHello World!と表示するだけの簡単なものです。ベアメタルアプリは、SDカードのFATパーティションに書き込みます。この例の場合は、Dドライブ直下にhello-mkimage.binを格納するだけです。
これで、ベアメタルアプリの実行環境が完成しました。
ベアメタルアプリの実行方法
DE0-Nano-SoCにSDカードを挿入して電源をONにするだけです。ターミナルを接続すると、以下の様なログが表示されます。この例の場合は、FPGAをコンフィギュレーションしなくてもベアメタルアプリを実行できます。
まとめ
これでベアメタルアプリのブート環境が整いました。あとは、アプリをオリジナルに変更してSDカードの内容を更新するだけです。アプリの名前を変更する場合にはBSP EditorのFAT_LOAD_PAYLOAD_NAMEを書き換えます。
参考になる資料
DE0-Nano-SoC用ではありませんが、以下の資料が参考になります。
DE0-Nano-SoCはBOOTSELの設定をジャンパなどで変更することができないので、ブート先を簡単に変更することができません。このため、参考資料と同じ手順でベアメタルをブートすることはできません。例えば、Preloader生成時のパラメータの設定などは修正が必要です。
altera wiki: SocBootFromFPGA
RocketBoards.org: Booting From FPGA – v13.1
HPS SoC Boot Guide