DE0-Nano-SoCでベアメタルアプリを実行する手順

FPGA

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に格納されています。

Embedded Command Shellの起動

Embedded Command Shellの起動

Embedded Command Shell

Embedded Command Shell

BSP Editorを起動します。

BSP Editorの起動

BSP Editorの起動

BSP EditorのFile->New HPS BSP…から新しいBSPを作成します。

新しい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としています。

BSP Editor の設定

BSP Editor の設定

設定ができたら、Generateボタンをクリックしてソースコードを生成します。

Preloaderのソースコードを生成

Preloaderのソースコードを生成

BSP Editorを終了し、Embedded Command Shellのカレント・ディレクトリをFPGAプロジェクト内のsoftware/spl-bspに変更します。この例の場合は、C:\tmp\HPS_CONTROL_FPGA_LED\HPS_CONTROL_FPGA_LED\software\spl_bspです。

カレント・ディレクトリの変更

カレント・ディレクトリの変更

makeを実行します。

makeを実行

makeを実行

正常に処理が終了すると、preloader-mkpimage.binが生成されます。

make正常終了時

make正常終了時

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_card_linux_boot_image.imgの書き込み

sd_card_linux_boot_image.imgの書き込み

この例では、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の場合)。

Preloaderの書き込み

Preloaderの書き込み

このとき、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

タイトルとURLをコピーしました