注記:
この記事の内容は、SoC Embedded Design Suite(以後、SoC EDS)のバージョン v18.1 以前を対象としています。
SoC EDS の v19.1 Standard Edition / v19.3 Pro Edition 以降からブートローダーの生成フローが変更となり、Preloader Generator は使用されなくなりました。
v19.1 Standard / v19.3 Pro 以降のブートローダー生成フローにつきましては以下のページをご参照ください。
- SoC EDS v19.1 std / v19.3 pro 以降のブートローダー生成フロー(Cyclone® V SoC / Arria® V SoC 編)
- SoC EDS v19.1 std / v19.3 pro 以降のブートローダー生成フロー(Arria® 10 SoC 編)
- Building Bootloader for Cyclone V and Arria 10
1. はじめに
この記事では、SoC EDS バージョン v18.1 以前に付属の Preloader Support Package Generator(別名、bsp-editor)の使用方法についてご紹介します。
1-1. 必要条件
この記事で説明している各種手順を実施するためには、次の開発環境があらかじめホスト PC にインストールされている必要があります。
- Quartus® Prime v18.1
- SoC EDS v18.1
この記事の説明ではバージョン v18.1 を使用しており、デフォルトのインストール・パスである以下のロケーションにツールをインストールしていることを前提として説明しています。
この記事内で使用されるスクリーン・キャプチャーなどで確認できるツールのインストール・パスなどについては必要に応じて適宜読み替えてご参照ください。
- Quartus® Prime のインストール・パス : C:¥intelFPGA¥18.1¥quartus
- SoC EDS のインストール・パス : C:¥intelFPGA¥18.1¥embedded
1-2. 関連文書
この記事は以下の資料および Web サイトの内容をベースに記述されております。これらの情報も併せてご確認ください。
参考資料:SoC Embedded Design Suite User Guide
参考資料:Cyclone V Device Handbook
参考資料:RocketBoards.org (SoC FPGA コミュニティー・ポータルサイト)
1-3. Preloader とは?
Preloader は U-boot second program loader(以後、u-boot spl)をベースに SoC FPGA 向けにカスタマイズが加えられたブートローダーです。
Preloader の役割は以下のとおりです:
- HPS ピン・マルチプレクスの設定
- HPS IOCSR の設定
- HPS PLL とクロックの設定
- HPS ペリフェラルのリセット解除
- SDRAM の初期化(キャリブレーションなど)
- SDRAM へ次ステージのブートイメージの展開
上記のとおり、Preloader は HPS ブロックの初期化と、u-boot や OS を SDRAM にロードする機能を提供します。
この記事で後述するとおり、Preloader は Quartus® / Platform Designer(旧 Qsys)によるデザイン時に自動生成されるハンドオフファイルを用いることで自動生成されます。このため、ユーザー側で初期化用ソフトウェアの構築をすることなく Quartus® / Platform Designer で設定した内容を HPS ブロックに反映することができます。
【図 1-1】 Platform Designer HPS の設定例
1-4. ブートシーケンス
以下に SoC デバイスにおける一般的なブートシーケンスを示します。HPS のブートは HPS 内部の BootROM を先頭に複数のステージに分かれて実施されます。
それぞれのステージは次のステージのブートイメージをロードする役割を担っており、これにより順々にブートイメージがロードされ実行されます。
以下で紹介するブートシーケンスはあくまでも一例であり、その他の構成で実現することも可能であることに注意してください。
以下に一般的なブートシーケンスの各ステージにおける役割を示します:
① BootROM
HPS 内部の Arm プロセッサーはリセットが解除されるとデバイスに内蔵されている BootROM にジャンプし、ソフトウェアの実行を開始します。BootROM では、BSEL ピン、CSEL ピンの設定から Preloader のロードに必要な最低限の初期化のみを実施し、BSEL ピンで指定された ブートソースから Preloader をロードします。BootROM ソフトウェアをユーザーが書き換えることはできません。
② Preloader
前述のとおり、Preloader は HPS 部の初期化を実行するためのブートローダーです。
Preloader を実行することで HPS 部の初期化および SDRAM の初期化を実行し、次ステージの Bootloader を SDRAM に展開し処理を渡します。
③ Bootloader
このステージのブートローダーは一般に Operating System(以後 OS)固有のローダーとして配置されます。Linux の場合には、オープンソースで提供される u-boot を Linux のブートローダーとして利用しています。
④ OS / Application
OS は起動時に必要な処理を実行しアプリケーションの実行を開始します。
ブートシーケンスに関する詳細は以下の資料をご参照ください。
参考資料:Booting and Configuration Introduction
【図 1-2】 SoC の一般的なブートシーケンス
2. Preloader Generator の使用方法
このセクションでは、Preloader Generator の使用手順および各種オプションに関して説明します。
2-1. Embedded Command Shell の起動
SoC EDS に付属の Embedded Command Shell を起動します。
Windows のスタートメニュー、もしくは、Windows エクスプローラーにて SoC EDS のインストール・フォルダー以下に格納される起動用スクリプトを実行します。
【図 2-1】 Embedded Command Shell の起動
2-2. bsp-editor(Preloader Generator)の起動
Embedded Command Shell に ”bsp-editor” とタイプし、bsp-editor の GUI を起動します。
【図 2-2】 bsp-editor の起動
2-3. 新規プロジェクトの作成
[File]⇒[New BSP…]を選択し、プロジェクトを新規作成します。
【図 2-3】 新規プロジェクトの作成
2-4. ハンドオフファイルの指定
Quartus® / Platform Designer にてプロジェクトをコンパイルした際に自動生成されるハンドオフファイルを指定します。この記事では SoC EDS に付属のリファレンス・デザイン内に格納されるハンドオフファイルを利用します。
<SoC EDS Install DIR>¥embedded¥examples¥hardware¥cv_soc_devkit_ghrd¥hps_isw_handoff¥soc_system_hps_0 |
【図 2-4】 ハンドオフファイルの指定
Operating System: 欄に Preloader が、Version: 欄に default が指定されていることを確認します。
BSP target directory にて bsp プロジェクトを生成するロケーションを指定します。
デフォルトでは、”<Quartus Project DIR>¥software¥spl_bsp” が指定されますが、use default locations のチェックを外すことで任意のディレクトリーを指定することが出来ます。
2-5. Preloader ユーザーオプションの設定
Preloader に生成時に与えるユーザーオプションの各種設定を行います。設定には大きく分けて “Common” と “Advanced” があります。それぞれ必要に応じて設定を変更します。
各設定をマウスオーバーすると設定の解説が表示されますので合わせてご確認ください。以降ではそれぞれの設定について説明します。
【図 2-5】 ユーザーオプションの設定
2-5-1. Common オプション設定
Common オプションの設定では、Preloader に関する基本的なオプションに関して設定を行います。以下に設定内容を示します。
大項目 | 小項目 | 概要 |
spl | PRELOADER_TGZ | Preloader ソースファイルのアーカイブを指定します。指定したアーカイブファイルを解凍し利用します。基本的に変更する必要はありません。 |
CROSS_COMPILE | Preloader のビルドに使用するクロスコンパイラを指定します。SoC EDS 付属のコンパイラが指定されておりますので、基本的に変更する必要はありません。 | |
spl.boot | BOOT_FROM_QSPI | Preloader に続くブートイメージを QSPI フラッシュからロードする場合にチェックを入れます。 |
BOOT_FROM_SDMMC | Preloader に続くブートイメージを SD カードからロードする場合にチェックを入れます。 | |
BOOT_FROM_NAND | Preloader に続くブートイメージを NAND フラッシュからロードする場合にチェックを入れます。 | |
BOOT_FROM_RAM | Preloader に続くブートイメージを RAMからロードする場合にチェックを入れます。 | |
* 上記、BOOT_FROM_XXX の設定は、いずれか1つのみ指定してください(複数にチェックを入れないでください)。 | ||
QSPI_NEXT_BOOT_IMAGE | BOOT_FROM_QSPI が有効の際、Preloader がロードするブートイメージが格納されるアドレスを指定します。 | |
SDMMC_NEXT_BOOT_IMAGE | BOOT_FROM_SDMMC が有効の際、Preloader がロードするブートイメージが格納されるアドレスを指定します。 | |
NAND_NEXT_BOOT_IMAGE | BOOT_FROM_NAND が有効の際、Preloader がロードするブートイメージが格納されるアドレスを指定します。 | |
FAT_SUPPORT | SD カード内の FAT パーティションに対するアクセスを有効化します。この設定は BOOT_FROM_SDMMC が指定されている時のみ有効です。FAT パーティションに次ステージのブートイメージが格納されている場合に利用します。 | |
FAT_BOOT_PARTITION | 次ステージのブートイメージが格納される FAT パーティションの番号を指定します。この設定は、FAT_SUPPORT オプションが指定されている時のみ有効です。 | |
FAT_LOAD_PAYLOAD_NAME | 次ステージのブートイメージのファイル名を指定します。この設定は、FAT_SUPPORT オプションが指定されている時のみ有効です。 |
2-5-2. Advanced オプション設定
Advanced オプション設定では、Preloader に関する高度な機能について設定します。基本的に変更の必要はありませんが状況に応じて設定を変更してください。
【図 2-6】 Advenced オプション設定
大項目 | 小項目 | 概要 |
spl.reset_assert | ― | Preloader 実行時に該当ペリフェラルのリセットの解除を実行するか指定します。チェックを入れるとリセット状態のままとなります。 |
spl.warm_reset_handshake | ― | WarmReset 時に該当ペリフェラルとのハンドシェイク機能の使用有無を指定します。 |
spl.boot | WATCHDOG_ENABLE | ウォッチドッグ・タイマーの使用有無を指定します。各種デバッグ時には無効化することを推奨します。 |
CHECKSUM_NEXT_IMAGE | 次ステージのブートイメージのロード時にチェックサムによるエラーチェックの実施有無を指定します。 | |
EXE_ON_FPGA | Preloader をFPGA メモリー上で実行する再にチェックを有効にします。このオプションは、BSEL を FPGA に指定した場合に利用します。 | |
FPGA_MAX_SIZE | FPGA メモリーに配置可能な.text、.rodata の最大サイズを指定します。Preloader のビルド時にこのサイズよりも実際のコードサイズが大きい場合にビルドエラーを返します。 | |
FPGA_DATA_BASE | EXE_ON_FPGA オプション有効時に、.data、.bss、malloc、stack を配置するベースアドレスを指定します。 | |
FPGA_DATA_MAX_SIZE | Preloader のビルド時にこのサイズよりも実際のデータ(.data 等) が大きい場合にビルドエラーを返します。 | |
STATE_REG_ENABLE | Preloader 実行時に STATE R レジスターに STATE_VALID データを書き込みます。これはBootROM に対して Preloader が正常にロードされたことを示します。 | |
BOOTROM_HANDSHAKE_CFGIO | IOCSR および Pin MUX の初期化時に BootROM とのハンドシェイクを実行します。本設定が有効時に WarmReset が発生した場合、Preloader が初期化を実施していても BootROM にて再設定を実行します。 |
|
WARMRST_SKIP_CFGIO | 本設定が有効な場合、Preloader は IOCSR および Pin MUX の設定をスキップします。この設定は、BOOTROM_HANDSHAKE_CFGIO が無効な場合にのみ有効となります。 | |
SDRAM_SCRUBBING | SDRAM ECC 有効時にメモリーの初期化を実行します。 | |
SDRAM_SCRUB_BOOT_REGION_START | SCRUB を実行するメモリーの先頭アドレスを指定します。 | |
SDRAM_SCRUB_BOOT_REGION_END | SCRUB を実行するメモリーの終了アドレスを指定します。 | |
SDRAM_SCRUB_REMAIN_REGION | 次ステージのブートイメージをロード中に上記 SCRUB オプションで指定されない残りのメモリー領域の初期化を実行するか指定します。 | |
spl.debug | DEBUG_MEMORY_WRITE | デバッグ情報をメモリーに書き出すオプションの使用有無を指定します。UART が使用出来ないシステムに有効です。 |
DEBUG_MEMORY_ADDR | デバッグ情報を書き出すメモリーの先頭アドレスを指定します。 | |
DEBUG_MEMORY_SIZE | デバッグ情報を書き出すメモリーに割り当てるメモリーサイズを指定します。 | |
SEMIHOSTING | セミホスティング機能の使用有無を指定します。このオプションはデバッガーと接続されていることが前提のオプションとなるため注意してください。UART が使用出来ないシステムにおける Preloader のデバッグに有効です。 | |
HARDWARE_DIAGNOSTIC | SDRAM メモリーの簡易テストを実行します。このオプションを利用するためには少なくとも 1 GB のメモリー領域が必要です。 | |
SKIP_SDRAM | Preloader の実行時に SDRAM メモリーの初期化およびキャリブレーションをスキップします。 | |
spl.performance | SERIAL_SUPPORT | UART を使用したログ出力を有効化します。 |
2-6. bsp プロジェクトの生成
各種設定が完了後、bsp プロジェクトを生成します。生成される bsp プロジェクトには *.c 、 *.h 、 Makefile を含む Preloader を生成(ビルド)するために必要なファイル群がすべて生成されます。
これらのファイルは、「2-4. ハンドオフファイルの指定」で “BSP target directory” に指定したロケーションに出力されます。
bsp-editor 右下の “Generate” ボタンを押下しプロジェクトを生成します。本資料では、以下のディレクトリーが該当します。
<SoC EDS Install DIR>¥embedded¥examples¥hardware¥cv_soc_devkit_ghrd¥software¥spl_bsp |
【図 2-7】 bsp プロジェクトの生成
3. Preloader の生成方法
このセクションでは、前述の手順で生成した bsp プロジェクトを利用し Preloader を生成する手順について説明します。
3-1. Embedded Command Shell の起動
Embedded Command Shell を起動します。起動方法については前述の「2-1. Embedded Command Shell の起動」を参照ください。
3-2. bsp プロジェクト・ディレクトリーへの移動
cd コマンドを利用して Preloader Generator(bsp-editor)で生成した bsp プロジェクトのルート・ディレクトリーに移動します。この記事の例では以下のディレクトリーが該当します。
<SoC EDS Install DIR>¥embedded¥examples¥hardware¥cv_soc_devkit_ghrd¥software¥spl_bsp |
【図 3-1】 bsp プロジェクト・ディレクトリーへの移動
3-3. Preloader のビルド
”make all” コマンドを実行し Preloader を生成します。
【図 3-2】 Preloader のビルド
実行後、”<Quartus Project Top DIR>¥software¥spl_bsp” 以下に、preloader-mkpimage.bin という名称のバイナリーファイルが生成されていることを確認します。
このファイルは BootROM にて参照される Preloader 用のヘッダ情報を付加したバイナリーとなっています。SD カードおよび QSPI フラッシュメモリー等への書き込みはこのバイナリーファイルを利用します。
【図 3-3】 生成された Preloader バイナリーファイル
注記:
この記事では、Windows® 7 Professional を使用して動作の確認を行っております。
ホスト PC の OS が Windows® 10 の場合、Preloader の生成でエラーが発生する場合が確認されております。もしご使用の OS が Windows® 10 でエラーが発生する場合は、下記のアルティマ技術サポートのコンテンツページで紹介している、bsp プロジェクト内 Makefile の編集が必要となりますのでご注意ください。
参考資料:Windows® 10 で Preloader がビルドできない場合の対処方法
3-4. u-boot のビルド(必要に応じて)
”make uboot” コマンドを実行し u-boot を生成します。
【図 3-4】 u-boot の生成
上記コマンドを実行すると、以下のディレクトリーに Preloader にてロード時に参照されるヘッダを付加した u-boot バイナリーイメージである u-boot.img が生成されます。
<Quartus Project Top DIR>¥software¥spl_bsp¥uboot-socfpga¥u-boot.img |
【図 3-5】 生成された u-boot イメージファイル
4. Preloader / u-boot の更新方法
このセクションでは前述の手順で新規に作成した Preloader バイナリーファイルをセットアップ済みの SD カードおよびオンボード上の QSPI Flash メモリーに書き込む方法について説明します。
この記事でご紹介する手順はあくまでも一例であり、他の方法で書き換えることも可能です。
4-1. SD カード上イメージの書き換え
SD カード上イメージの書き換えは、RocketBoards.org に公開されている SD カードイメージ、もしくは SoC EDS 付属の SD カードイメージが書き込まれていることを前提として説明します。
SD カードのセットアップが完了していない場合には、「1-2. 関連文書」で紹介した SoC Embedded Design Suite User Guide の Getting Started Guides を参考にセットアップを進めてください。
なお、SoC EDS に付属の SD カードイメージは以下に保存されています。
<SoC EDS Install DIR>¥embedded¥embeddedsw¥socfpga¥prebuilt_images¥sd_card_linux_boot_image.tar.gz |
SoC EDS v18.1 には Windows マシンから直接 SD カードの中身を書き換えるためのツール(Boot Disk Utility)が同梱されており、上記いずれかの SD カードイメージでセットアップ済みの SD カードに対し、Preloader / u-boot のデータのみを部分的に書き換えることが可能です。
Boot Disk Utility を実行する際は、Embedded Command Shell を管理者権限で起動する必要がありますので注意してください。
Preloader / u-boot を書き換える場合には以下のコマンドを使用します:
- Preloader:
$ alt-boot-disk-util -p preloader-mkpimage.bin -a write -d D
- u-boot:
$ alt-boot-disk-util -b uboot-socfpga/u-boot.img -a write -d D
* 上記コマンドの -d オプションで指定するドライブレターはホスト PC 環境により異なります。お使いの環境に合わせて読み替えてください。
【図 4-1】 SD カードイメージの書き換え
Linux マシンであれば dd ユーティリティーを使用することで同様の処理を実現可能です。Linux マシンにおける書き換え方法の詳細は以下のリンクをご参照ください。
参考資料:GSRD v14.0 - SD Card
Updating Individual Elements on the SD card
4-2. QSPI Flash メモリーの書き換え
オンボード上 の QSPI Flash メモリーの場合、SoC EDS に付属の HPS Flash Programmer が使用できます。このツールは JTAG を介し QSPI Flash メモリーに直接書き込みを実行します。
【図 4-2】 HPS Flash Programmer による Flash 書き込み
作業の開始前に BSEL ピンが QPSI ブートを選択していることを確認してください。
BSEL[2:0] Value | Flash Device |
0x0 | Reserved |
0x1 | FPGA (HPS-to-FPGA bridge) |
0x2 | 1.8 V NAND flash memory |
0x3 | 3.3 V NAND flash memory |
0x4 | 1.8 V SD/MMC flash memory with external transceiver |
0x5 | 3.3 V SD/MMC flash memory with internal transceiver |
0x6 | 1.8 V Quad SPI flash memory |
0x7 | 3.3 V Quad SPI flash memory |
HPS Flash Programmer にて Preloader / u-boot を書き換えるコマンドは以下のとおりです:
- Preloader:
$ quartus_hps -c 1 -o p preloader-mkpimage.bin
- u-boot:
$ quartus_hps -c 1 -o p -a 0x60000 uboot-socfpga/u-boot.img
【図 4-3】 HPS Flash Programmer を利用したイメージの書き込み
HPS Flash Programmer に関する詳細は、下記のドキュメント・ページをご参照ください。
参考資料:SoC Embedded Design Suite User Guide ⇒ 8. Using the HPS Flash Programmer