JTAG, BL702, Gowin FPGA
JTAGFPGA
2023-5-17 13:52 JST

Tang Nano 4K/9K の JTAG でちょっと遊んでみた。

ほぼほぼ私的メモになっている。ないよりましということで。

BL702

BL702 が 0403 6010 と FTDI のふりをしている。

Bus 001 Device 043: ID 0403:6010 Future Technology Devices International, Ltd FT2232C/D/H Dual UART/FIFO IC

FTDI の資料であるTN_100によると 6010 を返すのは FT2232C/D/L と FT2232HL/Q らしい。

dmesg で確認すると FT2232C と認識している。

[3374092.746071] usb 1-5: Detected FT2232C

どうやって認識しているのだろうと思って kernel のソースを見る。ftdi_sio.cがそれ。

version = le16_to_cpu(udev->descriptor.bcdDevice);
...
	case 0x500:
		priv->chip_type = FT2232C;
		priv->baud_base = 48000000 / 2;
		break;

USB の descriptor で bcdDevice というのがあって(バージョンかな?)それが 0x500 だと FT2232C とするみたいだった。lsusb で確認する。まるっきり FTDI のフリしているところがすごい。

$ lsusb -v -d 0403:

Bus 001 Device 043: ID 0403:6010 Future Technology Devices International, Ltd FT2232C/D/H Dual UART/FIFO IC
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x0403 Future Technology Devices International, Ltd
  idProduct          0x6010 FT2232C/D/H Dual UART/FIFO IC
  bcdDevice            5.00
  iManufacturer           1 SIPEED
  iProduct                2 JTAG Debugger
  iSerial                 3 FactoryAIOT Pro
  ...

MPSSE と openFPGALoader

MPSSE はAN_108を読めばだいたいいける。

Rust でいろいろ書くも、うまくいかず。どうも、BL702 は MPSSE の 0x4a とかサポートしてないみたいよ (0xfa 0x4a を返してくる)。

openFPGALoader ではうまくいくので、 src/ftdipp_mpsse.cpp を書き換えて write/read の情報 printf するようにした。

$ ./openFPGALoader --detect
try to open 403 6010 0 0
Jtag frequency : requested 6.00MHz   -> real 6.00MHz
86 00 00
80 08 0b 82 08 0b
4b 05 bf 4b 03 82 39 03 00 ff ff ff ff 87
RECV 1b 98 00 01
39 03 00 ff ff ff ff 87
RECV ff ff ff ff
39 03 00 ff ff ff ff 87
RECV ff ff ff ff
39 03 00 ff ff ff ff 87
RECV ff ff ff ff
39 02 00 ff ff ff 87
RECV ff ff ff
3b 06 ff 6b 00 81 87
RECV fe 80
4b 05 bf
index 0:
        idcode 0x100981b
        manufacturer Gowin
        family GW1NSR
        model  GW1NSR-4C
        irlength 8
80 ff 00 82 ff 00 84 39 04 00 aa 55 00 ff aa 85 87
RECV ff ff ff ff ff

う〜ん。なんでこれ80 08 0b 82 08 0bやっているのだろう?0x0b を設定しているけど、0xfb じゃないの?いや、それだと出力になっちゃうから 0x0b なのか?High Byte は設定しなくて良さそうだが、、、両方とも 0x0b にしておくと安心ってこと?謎。(たぶん High Byte は設定の必要なし)

ついでにかくと GPIO は BL702 から直接コントロールするので、そもそも GPIO の設定は MPSSE 経由で必要ない(たぶん動かない)。念の為に、全部 IN にしておけばいいはず。

openFPGALoader は 0x4B を使っていた。OUT CLK EDGE が -VE だ。あれ?規格通り。0xbf で 7bit 目が立っている。必要ないんじゃないか?

Rust でもう一回。あれうまくいっちゃった。

start
[85, 8d, 87]
send [4b, 5, bf]
send [4b, 3, 82]
send [39, 3, 0, ff, ff, ff, ff, 87]
RECV [1b, 98, 0, 1]

0x80 いるかどうかチェック。reset も一つ短くする。

start
[85, 8d, 87]
send [4b, 4, 1f]
send [4b, 3, 2]
send [39, 3, 0, ff, ff, ff, ff, 87]
RECV [1b, 98, 0, 1]

うまいくいくね。Tang Nano 9K でもやってみる。(実はいままで Tang Nano 4K)

start
[85, 8d, 87]
send [4b, 4, 1f]
send [4b, 3, 2]
send [39, 3, 0, ff, ff, ff, ff, 87]
RECV [1b, 48, 0, 11]

User Code 書き換え

Gowin の Designer (IDE) で User Code を書き換えることが出来るので、書き換えてみた。すると、openFPGALoader でダウンロードすると最後にエラーになった。通常は User Code はチェックサムなので、チェックサムをチェックしているみたい。

4b 03 83 1b 06 3a 4b 00 01
4b 01 81 4b 05 80 4b 03 83 1b 06 02 4b 00 01
4b 01 81 4b 05 80 4b 03 83 1b 06 41 4b 00 01
4b 01 81 4b 05 80 4b 02 81 39 02 00 00 00 00 87
RECV 20 f0 03
3b 06 00 6b 00 01 87
RECV 00 00
4b 01 81 4b 05 80
4b 03 83 1b 06 13 4b 00 01
4b 01 81 4b 05 80 4b 02 81 39 02 00 00 00 00 87
RECV 17 08 29
3b 06 00 6b 00 01 87
RECV 0a 00
4b 01 81 4b 05 80
SRAM Flash: FAIL
f4e9 5290817
80 ff 00 82 ff 00 84 39 04 00 aa 55 00 ff aa 85 87
RECV ff ff ff ff ff

リンク集