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