はじめに
アルテラの SoC FPGA は従来からの FPGA 部分に加えて、Hard Processor System (HPS) というプロセッサ・ユニットが 1 つのダイに搭載されているデバイスです。この SoC FPGA では Linux 起動時に U-Boot というブートローダ使用しますが、この U-Boot には様々な機能があり、デバックや開発時に活用できます。
その一つの機能であるボード上の QSPI への書き込みを U-Boot を用いて実施する方法を紹介します!
ファイルのサイズにもよりますが、Preloader を書き込む場合は、通常 QSPI の書き込みに使用する HPS Flash Programmer と比較すると約 15 倍高速に書き込むことが可能です。
今回は ①"SD カードブートで行う方法"と②"DS-5 から U-Boot で行う方法" の 2通りを説明します。
- U-Boot の起動する環境の作成方法は、『Preloader Generator の使用方法』をご覧ください。
- DS-5 から U-Boot を起動する環境の作成方法は、『簡易デバックに最適!DS-5 で U-Boot を起動する方法』をご覧ください。
実証環境
【ツール】
ターミナル・ソフトウェア:Tera Term
【用意するもの】
・U-Boot の起動環境
SD カードブート環境、または DS-5 上で U-Boot を起動できる環境
・QSPI に書き込むファイル
今回は QSPI Boot 用の Preloader イメージ(preloader-mkpimage.bin : 256 KB) ※16 進数で 0x40000
1. 書き込みファイルの準備
まずは 書き込むファイルを用意します。ブート方法によって、書き込むファイルの配置場所が ① ,② の方法で異なります。
①"SD カードブートで行う方法" の場合
SD ブートイメージの FAT 領域に書き込むファイルを保存しておきます。(図1)
その後、基板上の SD カードスロットに挿します。
②" DS-5 から U-Boot で行う方法" の場合
DS-5 で設定した workspace 内に書き込むファイルを保存しておきます。(図2)
2. Tera Term と U-Boot の起動
Tera Term を起動し HPS 側の UART を認識した後、基板の電源を入れます。
電源を入れると Preloader から U-Boot が起動され、次のイメージに移行するカウントダウンが始まるので、Enter Key で止めると U-Boot コンソールが使えるようになります。(図3)
①"SD カードブートで行う方法" の場合
Tera Term を起動し HPS 側の UART を認識した後、基板の電源を入れます。
電源を入れると Preloader から U-Boot が起動され、次のイメージに移行するカウントダウンが始まるので、Enter Key で止めると U-Boot コンソールが使えるようになります。(図3)
②" DS-5 から U-Boot で行う方法" の場合
『簡易デバックに最適!DS-5 で U-Boot を起動する方法』に沿って U-Boot を起動し、①と同様次のイメージに移行するカウントダウンが始まるので、Enter Key で止めると U-Boot コンソールが使えるようになります。(図3)
3. SDRAM へのファイル展開
U-Boot 起動後、書き込むファイルを SDRAM 上に展開します。SDRAM 上で書き込むファイルを展開するアドレスを 0x0200_0000 としています。
※SDRAM 上には U-Boot も展開されているため、U-Boot が使用していない領域を使用する必要があります。
そのため、今回は 0x0200_0000 にファイルを展開しています。
①"SD カードブートで行う方法" の場合
まずは、SD カード内に置いた書き込むファイルとファイル・サイズを確認します。
$fatls mmc 0:1
今回書き込む 262,144 (Byte) の preloader-mkpimage.bin ファイルがあることがわかります。(図4)
ここで書き込むファイル・サイズを 16 進数表示で計算しておきます。
例)10 進数 : 262144 16 進数 : 0x40000
書き込むファイルを確認したら、 QSPI に書き込むファイル(preloader-mkimage.bin)を一旦 SDRAM 上に展開します。(図4)
ここで指定している 0x2000000 は ファイルを展開する SDRAM 上の番地です。
$fatload mmc 0:1 0x2000000 preloader-mkpimage.bin
②" DS-5 から U-Boot で行う方法" の場合
CPU が動作している場合は割り込みボタンで一時停止し、コマンド・ビューにおいて以下コマンドで QSPI に書き込むファイル(preloader-mkimage.bin)を一旦 SDRAM 上に展開します。(図5)
ここで指定している 0x2000000 は ファイルを展開する SDRAM 上の番地です。
$restore $sdir/preloader-mkpimage.bin binary 0x2000000
その後、続行ボタンで CPU を動作させます。
4. QSPI の認識とファイルの書き込み
最後に SDRAM 上に展開した書き込みファイルを QSPI に書き込みます。書き込む方法は①、②共に同じです。
QSPI に書き込むために、まず U-Boot 上で QSPI を初期化します。
$sf probe
sf probe でターゲット・デバイス上でつながっている QSPI フラッシュを認識します。このコマンドにより、使用している QSPI のページ・サイズやトータル・サイズがわかります。(図6)
QSPI はページ・サイズでしか読み書きできませんので、今回の QSPI だと 10進数で64 KiB、16進数で 0x10000 単位でしか操作できません。
最後に SDRAM 上に展開したファイルを QSPI へ書き込みます。
$sf update 0x2000000 0x0 0x40000
指定するパラメータは、
・SDRAM 上に展開された書き込むデータの先頭アドレス:0x2000000
・書き込む QSPI 上のオフセット値 :0x0(Preloader は先頭番地に配置するため)
・書き込むファイルのデータ・サイズ(16 進数表示):0x40000
コンソールが有効になれば、書き込み終了です!
さいごに
今回は Preloader のバイナリ・ファイルを使って書き込む方法を説明しましたが、ファイルを変更すれば、同じように他のファイルを QSPI に書き込むことができます。また書き込むファイル・サイズが大きくなるほど HPS Flash Programmer より、U-Boot を使用した今回の方法の方が書き込み時間短縮の恩恵を受けられます。
みなさんも是非ご活用ください!