VisionFive 2をJTAGデバッグ
VisionFive 2 (以下、VF2) はStarFive Technologyが開発したSBCである。名前からわかるように、RISC-VのSoCを搭載している。ここではVF2をJTAGデバッグする方法を簡単にまとめる。
なお、この記事の内容は以下のVF2のフォーラムの投稿を参考に、具体的な手順を整理したものである。
- https://forum.rvspace.org/t/openocd-config-for-visionfive-2/1452
- https://forum.rvspace.org/t/using-jlink-edu-jtag-with-visionfive-2/1943
JTAGインターフェースのピン配置
まずピンヘッダ上でのJTAGインターフェースの配置を確認する。以下の通りである。
JTAG: Header Number
U74_TMS: 35
U74_TCK: 37
U74_TRSTN: 36
U74_TDI: 38
U74_TDO: 40
上記の通り接続すると以下の写真のようになる。
今回は手元にあったSipeed RV-Debugger-BL702というRISC-Vベースのデバッガを利用した。
OpenOCDを使ったJTAGデバッグの設定
次にデバッガをPCに接続してOpenOCDを起動する。
OpenOCDの設定ファイルは利用するJTAGデバッガに合わせて用意する必要がある。以下に一例として、RV-Debugger-BL702向けの設定を掲載する。
# REF: https://github.com/orangecms/RV-Debugger-BL702/blob/nezha/tools/openocd/openocd-usb-sipeed.cfg
# REF: https://github.com/strangerover2002/visionfive2-/blob/main/u74.cfg
# SiPEED USB-JTAG/TTL based on FT2232D
adapter driver ftdi
ftdi vid_pid 0x0403 0x6010
# http://blog.sipeed.com/p/727.html
ftdi channel 0
reset_config trst_only
transport select jtag
adapter speed 1000
ftdi layout_init 0x0508 0x0f1b
ftdi layout_signal nTRST -data 0x0200 -noe 0x0100
ftdi layout_signal nSRST -data 0x0800 -noe 0x0400
jtag newtap e24 cpu -irlen 5 -expected-id 0x07110cfd
jtag newtap u74 cpu -irlen 5 -expected-id 0x07110cfd
target create e24.cpu0 riscv -chain-position u74.cpu -coreid 0 -rtos hwthread
target create u74.cpu1 riscv -chain-position u74.cpu -coreid 1
target create u74.cpu2 riscv -chain-position u74.cpu -coreid 2
target create u74.cpu3 riscv -chain-position u74.cpu -coreid 3
target create u74.cpu4 riscv -chain-position u74.cpu -coreid 4
target smp e24.cpu0 u74.cpu1 u74.cpu2 u74.cpu3 u74.cpu4 #remove for separate harts gdb
init
この設定をファイルに保存した上で、以下のようにOpenOCDを起動する。
openocd -f openocd-usb-sipeed-visionfive2.cfg
OpenOCDが起動してVF2側のJTAGが認識されれば、以下のようにOpenOCDがGDBを待ち受ける。
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : Hardware thread awareness created
Error: Invalid command argument
Error: Invalid command argument
Error: Invalid command argument
Error: Invalid command argument
Error: Invalid command argument
Warn : libusb_detach_kernel_driver() failed with LIBUSB_ERROR_ACCESS, trying to continue anyway
Info : clock speed 1000 kHz
Info : JTAG tap: e24.cpu tap/device found: 0x07110cfd (mfg: 0x67e (Guangdong StarFive Technology Co), part: 0x7110, ver: 0x0)
Info : JTAG tap: u74.cpu tap/device found: 0x07110cfd (mfg: 0x67e (Guangdong StarFive Technology Co), part: 0x7110, ver: 0x0)
Info : datacount=2 progbufsize=16
Info : Disabling abstract command reads from CSRs.
Info : Examined RISC-V core; found 5 harts
Info : hart 0: XLEN=64, misa=0x8000000000901107
Info : datacount=2 progbufsize=16
Info : Disabling abstract command reads from CSRs.
Info : Core 1 made part of halt group 1.
Info : Examined RISC-V core; found 5 harts
Info : hart 1: XLEN=64, misa=0x800000000094112f
Info : datacount=2 progbufsize=16
Info : Disabling abstract command reads from CSRs.
Info : Core 2 made part of halt group 1.
Info : Examined RISC-V core; found 5 harts
Info : hart 2: XLEN=64, misa=0x800000000094112f
Info : datacount=2 progbufsize=16
Info : Disabling abstract command reads from CSRs.
Info : Core 3 made part of halt group 1.
Info : Examined RISC-V core; found 5 harts
Info : hart 3: XLEN=64, misa=0x800000000094112f
Info : datacount=2 progbufsize=16
Info : Disabling abstract command reads from CSRs.
Info : Core 4 made part of halt group 1.
Info : Examined RISC-V core; found 5 harts
Info : hart 4: XLEN=64, misa=0x800000000094112f
Info : starting gdb server for e24.cpu0 on 3333
Info : Listening on port 3333 for gdb connections
Info : starting gdb server for u74.cpu1 on 3334
Info : Listening on port 3334 for gdb connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
待ち受けているポートに対してGDBをアタッチすると、以下のようにVF2をGDBでデバッグできるようになる。
(gdb) target extended-remote :3334
Remote debugging using :3334
warning: No executable has been specified and target does not support
determining executable automatically. Try using the "file" command.
0xffffffff8000329a in ?? ()
(gdb) i r
ra 0xffffffff800322d2 0xffffffff800322d2
sp 0xffffffff81403ed0 0xffffffff81403ed0
gp 0xffffffff815006b8 0xffffffff815006b8
tp 0xffffffff81411fc0 0xffffffff81411fc0
t0 0x1b057 110679
t1 0x8 8
t2 0x1b057 110679
fp 0xffffffff81403ee0 0xffffffff81403ee0
s1 0x0 0
a0 0x0 0
a1 0x200000020 8589934624
a2 0x1 1
a3 0x1b7df 112607
a4 0x1b7df 112607
a5 0xffffffe1f89776e0 -128973310240
a6 0x0 0
a7 0x54494d45 1414090053
s2 0xffffffff815021c0 -2125454912
s3 0xffffffff81502374 -2125454476
s4 0xffffffff80c21778 -2134763656
s5 0xffffffff815020a8 -2125455192
s6 0xffffffff81535218 -2125245928
s7 0x1 1
s8 0x0 0
s9 0x0 0
s10 0x0 0
s11 0xfffb9cd0 4294679760
t3 0x0 0
t4 0x23a 570
t5 0xc5672a10 3311872528
t6 0x2 2
pc 0xffffffff8000329a 0xffffffff8000329a
(gdb) x/8i $pc
=> 0xffffffff8000329a: csrsi sstatus,2
0xffffffff8000329e: ld s0,8(sp)
0xffffffff800032a0: addi sp,sp,16
0xffffffff800032a2: ret
0xffffffff800032a4: addi sp,sp,-32
0xffffffff800032a6: sd s0,16(sp)
0xffffffff800032a8: sd s1,8(sp)
0xffffffff800032aa: sd ra,24(sp)
JTAGデバッグで気になる点
以上の手順でJTAGデバッグができるが、一点だけ気になることがある。それは、電源投入直後の待ち受け方法についてである。JTAGが使いたくなる場面の多くはUARTも使えない起動初期のタイミングだが、VF2で待ち受けさせる方法がわからない。
この点については、何かわかったことがあれば追記したい。
参考文献
- https://forum.rvspace.org/t/openocd-config-for-visionfive-2/1452
- https://forum.rvspace.org/t/using-jlink-edu-jtag-with-visionfive-2/1943
- https://github.com/riscv/riscv-debug-spec
- https://github.com/sipeed/RV-Debugger-BL702
- https://github.com/orangecms/RV-Debugger-BL702/blob/nezha/tools/openocd/openocd-usb-sipeed.cfg
- https://github.com/strangerover2002/visionfive2-/blob/main/u74.cfg
- https://gist.github.com/retrage/e0377380dfdbcd9aebe68ee360908d3d