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.
One comment
Did you contribute this to the openocd project? adafruit-ft232h-jtag.cfg?