Allwinner NezhaにJTAGで接続する
Allwinner NezhaはD1という64-bit RISC-VなSoCが載ったSBCである。Linuxがちゃんと動くRISC-Vマシンとしてはかなり安価なため一部で人気がある。 ここではこれにJTAGで接続してみた話をメモ程度に書いておく。なお、今回は接続してOpenOCDで認識できた程度でその先のGDBでのデバッグはできていない。
JTAGの端子について
NezhaにはUARTの端子が DEBUG
として用意されているが、JTAGには専用の端子が用意されていない。その代わりにmicroSDの端子と共通になっている。D1 SoCのデータシート4.3 GPIO Multiplex Functionから対応するピンと役割を読むと、PF0-PF6のI/Oがあり、SDカードのI/Oとしての役割がSDC0-*としてあり、その隣にJTAG関連のI/OがJTAG-*として記載されている。詳しくは回路図などを参照してもらいたいが、まとると以下のようになっている。
PF0: JTAG-MS - SDC0-D1 <--> DAT1
PF1: JTAG-DI - SDC0-D0 <--> DAT0
PF3: JTAG-DO - SDC0-CMD <--> CMD
PF5: JTAG-CK - SDC0-D2 <--> DAT2
これらの端子を引き出すために適当な延長アダプタを利用した。理想的には以下のようなブレークアウトボードを使うのが望ましい。
JTAGアダプタ
こちらの記事ではSipeed RV-Debugger-Plus (BL702C-A0)という別のRISC-VベースのJTAGアダプタを利用している。今回は手元にあったBus PirateをJTAGアダプタとして利用した。
Bus Pirate JTAG connections for OpenOCDにある通り以下のように接続した。
BP - JTAG
GND - GND
MOSI - TDI
MISO - TDO
CLK - TCK
CS - TMS
OpenOCDの実行
こちらの設定ファイルをベースに以下のようにBus Pirate向けに書き換えた設定ファイルを作成した。
# Based on: https://github.com/orangecms/RV-Debugger-BL702/blob/main/tools/openocd/openocd-usb-sipeed.cfg
source [find interface/buspirate.cfg]
buspirate_vreg 0
buspirate_mode open-drain
buspirate_pullup 1
buspirate_port /dev/tty.usbserial-AH03FKZ4
transport select jtag
# adapter speed 1000
set _CHIPNAME riscv
#jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000001
#jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x0
# wrong?
# jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x00185900
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x08052b43
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME
#$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1
#$_TARGETNAME.0 configure -work-area-phys 0x50000000 -work-area-size 32768 -work-area-backup 0
riscv set_prefer_sba on
# riscv set_mem_access progbuf
FEL modeへの切り替えとJTAGの有効化
AllwinnerのSoCにはFEL modeというモードがあり、起動時にこのモードに入ることでJTAGの有効化を含むさまざまな低レベルな操作が可能となっている。 FEL modeではNezhaのOTG USB経由でホストから操作を行う必要がある。今回はxboot/xfelというFELのツールをホストで動かしてJTAGを有効にした。
具体的には次の手順でFEL modeに入ってJTAGを有効化する。
- Nezhaにある
FEL
ボタンを長押しする - 1.のままNezhaのOTG USBとホストを接続する
- 2秒待ってボタンを離す
- これでFEL modeに入る
- ホストで
./xfel sid
を実行して値が取れることを確認 - ホストで
./xfel jtag
を実行してJTAGを有効化 - (ホストで
./xfel ddr ddr3
を実行してDRAMを初期化)
JTAGが有効になったら上記の設定ファイルでOpenOCDを実行する。
openocd -f openocd-buspirate.cfg
うまくいくと以下のように riscv.cpu
のJTAG tapが見える。
ただし、現時点では
Error: riscv.cpu: IR capture error; saw 0x1e not 0x01
とあるようにエラーがあり、GDBでの接続ができていない。
参考文献
- https://linux-sunxi.org/Allwinner_Nezha
- https://whycan.com/t_6440.html
- https://linux-sunxi.org/JTAG
- https://github.com/orangecms/RV-Debugger-BL702/blob/nezha/tools/openocd/openocd-usb-sipeed.cfg
- http://dangerousprototypes.com/docs/Bus_Pirate_JTAG_connections_for_OpenOCD
- https://linux-sunxi.org/FEL
- https://xboot.org/xfel/#/