retrage.github.io

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を有効化する。

  1. Nezhaにある FEL ボタンを長押しする
  2. 1.のままNezhaのOTG USBとホストを接続する
  3. 2秒待ってボタンを離す
  • これでFEL modeに入る
  1. ホストで ./xfel sid を実行して値が取れることを確認
  2. ホストで ./xfel jtag を実行してJTAGを有効化
  3. (ホストで ./xfel ddr ddr3を実行してDRAMを初期化)

JTAGが有効になったら上記の設定ファイルでOpenOCDを実行する。

openocd -f openocd-buspirate.cfg

うまくいくと以下のように riscv.cpu のJTAG tapが見える。

Nezha JTAG OpenOCD

ただし、現時点では

Error: riscv.cpu: IR capture error; saw 0x1e not 0x01

とあるようにエラーがあり、GDBでの接続ができていない。

参考文献