Raspberry Pi Zero/3B/4BでOpenOCDを使う(GPIOによるBitbanging)
FPGAのSVF PlayerとしてOpenOCDを使う
ベンダに依存しないJTAGテストパターン形式としてSVFがあります。
www.xjtag.com
OpenOCDもこれに対応しているため、出先でconfigをしなければならない場合など、FPGAのメイン開発じゃない時はかなり重宝しています。
ターミナルとSSHが動く端末 + ラズパイがあればFPGAのコンフィグができます。
以下はintel FPGA Cyclone10LPの場合に実施した内容です。SVFファイルはすでに準備しているものとして進めます。
Xilinx/AMDは知りません。調べてとか言われてもしないからな。
Latticeについては一部のMACHシリーズにおいてTRSTピンがあります。
下記の
- TRST=High, ENABLE=Lowにしてから以下の内容を実施する
- TRSTをラズパイの任意のピンに接続し、ENABLE=Lowにしてから後述する設定ファイルに明記する
いずれかを実施する必要があります。
ラズパイのGPIO番号を確かめておく
GPIOを使うので、ピン番号とGPIOに振られている番号の対応をしなければなりません。
sudo apt install python3-gpiozero pinout
世代によって表示は変わりますが以下のような感じになります。
$ pinout ,--------------------------------. | oooooooooooooooooooo J8 +==== | 1ooooooooooooooooooo | USB | +==== | Pi Model ???V1.4 | | +----+ +==== | |D| |SoC | | USB | |S| | | +==== | |I| +----+ | | |C| +====== | |S| | Net | pwr |HDMI| |I||A| +====== `-| |--------| |----|V|-------' Revision : d03114 SoC : Unknown RAM : NoneMb Storage : MicroSD USB ports : 4 (excluding power) Ethernet ports : 1 Wi-fi : False Bluetooth : False Camera ports (CSI) : 1 Display ports (DSI): 1 J8: 3V3 (1) (2) 5V GPIO2 (3) (4) 5V GPIO3 (5) (6) GND GPIO4 (7) (8) GPIO14 GND (9) (10) GPIO15 GPIO17 (11) (12) GPIO18 GPIO27 (13) (14) GND GPIO22 (15) (16) GPIO23 3V3 (17) (18) GPIO24 GPIO10 (19) (20) GND GPIO9 (21) (22) GPIO25 GPIO11 (23) (24) GPIO8 GND (25) (26) GPIO7 GPIO0 (27) (28) GPIO1 GPIO5 (29) (30) GND GPIO6 (31) (32) GPIO12 GPIO13 (33) (34) GND GPIO19 (35) (36) GPIO16 GPIO26 (37) (38) GPIO20 GND (39) (40) GPIO21 For further information, please refer to https://pinout.xyz/
上記を参考にしながらどのGPIOにOpenOCDでコンフィグする際のどの信号を割り当てるかを決定します。
OpenOCDの導入と設定ファイルの準備
2021年1月現在、特に独自にビルドしなくてもBitbangingがつかえるようになっていました。
sudo apt install openocd
参考:
https://github.com/arduino/OpenOCD/blob/master/tcl/interface/raspberrypi-native.cfg
設定ファイルを用意します。
openocd.cfg
# Cyclone 10LP FPGA Module (10CL025YU256) # https://lynxeyed.hatenablog.com/ # openocd -f openocd.cfg -c init -c "svf foobar.svf" adapter driver bcm2835gpio # raspi Zero:0x20000000 #bcm2835gpio_peripheral_base 0x20000000 # raspi 3B/3B+ :0x3F000000 #bcm2835gpio_peripheral_base 0x3F000000 # raspi 4B:0x7E000000 bcm2835gpio_peripheral_base 0x7E000000 bcm2835gpio_speed_coeffs 113714 28 # Each of the JTAG lines need a gpio number set: # tck tms tdi tdo Header pin numbers: tck tms tdi tdo bcm2835gpio_jtag_nums 26 19 21 20 #bcm2835gpio_trst_num 8 # <- Latticeの場合、これを設定する必要がある。 adapter speed 1000 transport select jtag # IDCODE Information for Cyclone 10 LP Devices # 0000 0010 0000 1111 0011 000 0110 1110 1 jtag newtap 10cl025u tap -expected-id 0x020F30dd -irlen 10
ラズパイの世代によってGPIOのベース番地が違う
bcm2835gpio_peripheral_base
がベース番地を設定する部分です。
使用する世代によってコメントアウトを適宜するなどして対応してください
- raspi Zero:0x20000000
- raspi 3B/3B+ :0x3F000000
- raspi 4B:0x7E000000
他のラズバイを使用したことがないので、動作検証したのはこの3世代だけです。すみません。
TCK, TMS, TDI, TDOの対応
bcm2835gpio_jtag_nums
に対応するGPIO番号(ラズパイの40pinアサインではなくGPIOの番号)を順番に書いていきます。
私の環境の場合、作成したFPGA基板が以下のように対応しています。
TCK = GPIO26
TMS = GPIO19
TDI = GPIO21
TDO = GPIO20
となっているので、
bcm2835gpio_jtag_nums 26 19 21 20
と書いています。
Latticeの一部のFPGAはTRSTピンが必要ですが、該当デバイスは、対応しているGPIO番号を設定し
bcm2835gpio_trst_num 8
のように書けます。
IDCODEの設定
これは10CL025Uの場合ですが、IDCODE = 0x020f30ddです。manufacturer idは0x06eとなってintelではなくAlteraと表示されるはずです。これはしゃーないね。
jtag newtap 10cl025u tap -expected-id 0x020F30dd -irlen 10
FPGAをコンフィグする
先程の設定ファイルをopenocd.cfg
と言う名前で任意の場所に保存します。ファイル名も場所も自由です。
foobar.svfをコンフィグするなら
sudo openocd -f openocd.cfg -c init -c "svf foobar.svf"
おしまい。