Altera®(Intel®)SoC FPGA では HPS(ハード・プロセッサー・システム)側のブートローダーに U-Boot を採用していますが、U-Boot に実装されるコマンド機能を使用することで所定のアドレスへの Read/Write アクセスを行うことができます。
ボード立ち上げ確認時など、本番用のソフトウェア、OS/ドライバの準備が整う前の簡易テストに利用可能です。
1. 準備:U-Boot の設定
使用する U-Boot には特別なカスタマイズは必要ありません。SoC FPGA エンベデッド開発スイート(SoC EDS)ツール付属の BSP-Editor で生成される Preloader/U-Boot プロジェクトをそのまま make するだけです。
シリアルターミナルを接続した状態でターゲットボードの電源を投入。U-Boot のカウントダウン表示中に Enter キーを入力して、コマンド待ち受けのプロンプトが表示された状態にします。
U-Boot 2013.01.01-00140-g0c9a3bd (Sep 19 2018 - 18:06:10)
CPU : Altera SOCFPGA Platform
BOARD : Altera SOCFPGA Cyclone V Board
I2C: ready
DRAM: 1 GiB
MMC: ALTERA DWMMC: 0
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: mii0
Hit any key to stop autoboot: 0 ⇒ U-Boot のカウントダウン表示中に Enter キーを入力
SOCFPGA_CYCLONE5 #
この記事では、Cyclone® V SoC ターゲットの U-Boot で試した内容を基にしていますが、他のデバイスファミリーでも同様の手順でご確認いただけるはずです。予め U-Boot のビルドおよび書き込み方法については理解している前提で記載しています。
参考: SoC はじめてガイド - Preloader Generator の使用方法
2. 使用するコマンド
Read/Write アクセスに利用可能なコマンドとして以下の 4 種類が用意されています。
- md - memory display
- mw - memory write (fill)
- mm - memory modify (auto-incrementing address)
- nm - memory modify (constant address)
各コマンドラインの仕様は以下の内容になっています。仕様通りにコマンドラインを入力するのみで Read/Write アクセスが実行されます。
<md - memory display>
Usage: md [.b, .w, .l] address [# of objects]
<mw - memory write (fill)>
Usage: mw [.b, .w, .l] address value [count]
<mm - memory modify (auto-incrementing address)>
Usage: mm [.b, .w, .l] address
<nm - memory modify (constant address)>
Usage: nm [.b, .w, .l] address
※ [.b, .w, .l] の部分ではアクセス幅を指定します。
{.b: Byteアクセス、.w: Word(2Byte)アクセス、.l: LongWord(4Byte)}
注記:
address や value、count などに指定する数値は 16 進数として扱われる点に注意が必要です。
例えば、先頭に 0x を付けずに 40 と指定した場合でも 0x40(64)として処理されます。
3. 実行例
参考として、各コマンドの実行例を記載しておきます。ここに掲載されているログは、Cyclone® V SoC 搭載ボードの U-Boot 上で実行した内容となります。前述の通り、他のデバイスファミリー向けの U-Boot でも同じ方法で利用可能なはずです。
【メモリーダンプ】
■ Byte アクセス
SOCFPGA_CYCLONE5 # md.b 0x10000000 0x40
10000000: b7 bc eb 3d e9 ff fe f7 ef df bf 77 ea f5 ff e7 ...=.......w....
10000010: d7 a1 af be df f6 bb fe df f6 d5 fd 77 f2 bf f1 ............w...
10000020: 4e 5f ff aa df bf 1a f2 bb df cd fa 7f e9 7b 6f N_............{o
10000030: bf af de a5 df f7 68 7f ff f6 ec e7 93 fb b9 ff ......h.........
■ Word アクセス
SOCFPGA_CYCLONE5 # md.w 0x10000000 0x20
10000000: bcb7 3deb ffe9 f7fe dfef 77bf f5ea e7ff ...=.......w....
10000010: a1d7 beaf f6df febb f6df fdd5 f277 f1bf ............w...
10000020: 5f4e aaff bfdf f21a dfbb facd e97f 6f7b N_............{o
10000030: afbf a5de f7df 7f68 f6ff e7ec fb93 ffb9 ......h.........
■ LongWord アクセス
SOCFPGA_CYCLONE5 # md.w l 0x10000000 0x10
10000000: 3debbcb7 f7feffe9 77bfdfef e7fff5ea ...=.......w....
10000010: beafa1d7 febbf6df fdd5f6df f1bff277 ............w...
10000020: aaff5f4e f21abfdf facddfbb 6f7be97f N_............{o
10000030: a5deafbf 7f68f7df e7ecf6ff ffb9fb93 ......h.........
【メモリーモディファイ(インクリメンタルアドレス)】
SOCFPGA_CYCLONE5 # mw mm.b 0x10000030
10000030: bf ? 0
10000031: af ? 1
10000032: de ? 2
10000033: a5 ? 3
: <Ctrl+C> で終了
【メモリーモディファイ(固定アドレス)】
SOCFPGA_CYCLONE5 # nm.b 0x10000030
10000030: be ? a
10000030: 0a ? b
10000030: 0b ? c
10000030: 0c ? d
: <Ctrl+C> で終了
【メモリーライト】
SOCFPGA_CYCLONE5 # mw.b 0x10000000 0 1 # 0 を 1Byte x 1 書き込み
SOCFPGA_CYCLONE5 # mw.b 0x10000008 0 4 # 0 を 1Byte x 4 書き込み
SOCFPGA_CYCLONE5 # mw.w 0x10000010 0 1 # 0 を 2Byte x 1 書き込み
SOCFPGA_CYCLONE5 # mw.w 0x10000018 0 2 # 0 を 2Byte x 2 書き込み
SOCFPGA_CYCLONE5 # mw.l 0x10000020 0 1 # 0 を 4Byte x 1 書き込み
SOCFPGA_CYCLONE5 # mw.l 0x10000028 0 2 # 0 を 4Byte x 2 書き込み
SOCFPGA_CYCLONE5 # md.b 0x10000000 0x40 # 書き込み結果の確認 (メモリダンプ)
10000000: 00 bc eb 3d e9 ff fe f7 00 00 00 00 ea f5 ff e7 ...=............
10000010: 00 00 af be df f6 bb fe 00 00 00 00 77 f2 bf f1 ............w...
10000020: 00 00 00 00 df bf 1a f2 00 00 00 00 00 00 00 00 ................
10000030: bf af de a5 df f7 68 7f ff f6 ec e7 93 fb b9 ff ......h.........
※ 最後のメモリーダンプ結果の青色部分が事前にメモリーライトした箇所になります。
まとめ
紹介した通り、気軽に Read/Write アクセスが試せるので非常に便利なコマンドですが、1つだけ注意するべきポイントがあります。
注記:
FPGA 側のメモリーやレジスターへのアクセス確認に使用する場合には、事前に FPGA 側のコンフィグレーションが完了している前提で、H2F, LWH2F ブリッジの開放を行う必要があります。
ブリッジの開放についても U-Boot コマンドで対応できます。
<Cyclone® V / Arria® V SoC の場合>
# run bridge_enable_handoff
<Arria® 10 SoC の場合>
# fpgabr 1
ブリッジの開放については、以下の記事も参考にしてください。
参考: HPS から FPGA へのインターフェイスの開通