A couple of weeks ago I wrote a post about using the FTDI FT232R as a cheap JTAG debugger. I’ve been using it for a bit now to play with my Raspberry Pi 3B, and now that my code size has grown, the FT232R is just too slow to cut it.
Here’s a breakdown: on the FT232R, the max speed I can set the adapter to is 3MHz. This has given me a transfer speed (loading via GDB) of around 3KB/s. Not too bad for small projects of only a few hundred KiB. But now my code size is approaching a ~5 MiB, the debug cycle was way too long… 5MiB @ 3KB/s = ~28mins to load… not good!
Still in my pursuit of a cheap JTAG debugger (I mean come on! It’s just a serial protocol!), I did buy something. The Adafruit FT232H breakout is exactly what I was looking for. At only $15 with Amazon Prime shipping, I was back to debugging at a reasonable speed in two days.
The FT232H breakout is about as barebones as it gets. The board breaks out untouched ACBUS0-ACBUS7 and ADBUS0-ADBUS7 to 0.10″ pitch headers. Since the FT232H has a single MPSSE channel, I can use this breakout to get faster JTAG speeds.
My configuration files from the previous post had to change a little to accommodate. I’ll break it down below in comments in the file because it’s a little bit cryptic.
# # FTDI USB Hi-Speed to MPSSE Breakout from Adafruit # # This should work for any bare FT232H # # Setup driver type adapter driver ftdi # 30000 kHZ -> 30MHz adapter speed 30000 # Using JTAG (also could be SWD) transport select jtag # Common PID for FT232H ftdi_vid_pid 0x0403 0x6014 # Set sampling to allow higher clock speed ftdi_tdo_sample_edge falling # Layout # On this breakout, the LEDs are on ACBUS8 and ACBUS9, can't assign them # registers are <ACVALUE><ADVALUE> <ACCONFIG><ADCONFIG> # so we set 0x0308 to mean only ACBUS nTRST and nSRST, ADBUS3 (TMS) asserted high # and we set 0x000B to mean only AC3,AC2,AC0 outputs -> (TMS,TD0, TCK) ftdi_layout_init 0x0308 0x000b # Pins # pin name | func. | # --------------|-------| # ADBUS0 | TCK | # ADBUS1 | TDI | # ADBUS2 | TDO | # ADBUS3 | TMS | # ACBUS0 | nTRST | # ACBUS1 | nSRST | #---------------|-------| # When data == oe -> pins are switched from output to input to give # the tri state (L, H, Hi-Z) effect ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 ftdi_layout_signal nSRST -data 0x0200 -oe 0x0200
So now it is as simple as connecting the corresponding pins on this breakout to the RPi3, and running OpenOCD again.
With the increased throughput of this MPSSE-supported interface, I now get ~587KB/s. Much better! It only takes ~8s to load my image now.