Hello,
I would like to submit a patch, that enables support for another FT2232 device, PicoTAP by GOEPEL electronic GmbH.
http://www.goepel.com/en/jtagboundary-scan/hardware/picotap.html
This device is actually a JTAG adapter, but since it uses standard FT2232 A interface pins, it can be easily used as SPI programmer (tested it here successfully). PicoTAP supports only 5V output, so one needs to reduce this to 3.3 in a same manner as DLP Design DLP-USB1232H (http://flashrom.org/FT2232SPI_Programmer). PicoTAP pin-out is as follows:
PicoTAP | SPI ---------+------- TCK | SCLK TMS | CS# TDI | SO TDO | SI /TRST | - GND | GND +5V | VCC, HOLD# & WP# after 3.3V regulator
Btw, I managed to run PicoTAP in 10MHz, 15MHz and 30Mhz modes (by forcing DIVIDE_BY), against SST25VF016B SPI flash, read/write/erase all worked fine (write seems somewhat slow). For the sake of more testing, is there any way 20Mhz can be set in FT2232?
I am also thinking about implementing passing frequency divider as an option, for example:
# flashrom -p ft2232_spi:type=picotap,divider=2
DIVIDE_BY constant would be used as default. I think this parameter would be useful, but would like to hear more opinions.
Index: ft2232_spi.c =================================================================== --- ft2232_spi.c (revision 1450) +++ ft2232_spi.c (working copy) @@ -43,6 +43,9 @@ #define OLIMEX_ARM_OCD_H_PID 0x002B #define OLIMEX_ARM_TINY_H_PID 0x002A
+#define GOEPEL_VID 0x096C +#define PICOTAP_PID 0x1449 + const struct usbdev_status devs_ft2232spi[] = { {FTDI_VID, FTDI_FT2232H_PID, OK, "FTDI", "FT2232H"}, {FTDI_VID, FTDI_FT4232H_PID, OK, "FTDI", "FT4232H"}, @@ -53,6 +56,7 @@ {OLIMEX_VID, OLIMEX_ARM_TINY_PID, OK, "Olimex", "ARM-USB-TINY"}, {OLIMEX_VID, OLIMEX_ARM_OCD_H_PID, NT, "Olimex", "ARM-USB-OCD-H"}, {OLIMEX_VID, OLIMEX_ARM_TINY_H_PID, NT, "Olimex", "ARM-USB-TINY-H"}, + {GOEPEL_VID, PICOTAP_PID, OK, "GOEPEL electronic GmbH", "PicoTAP"}, {}, };
@@ -66,7 +70,7 @@ * In either case, the divisor is a simple integer clock divider. * If clock_5x is set, this divisor divides 30MHz, else it divides 6MHz. */ -#define DIVIDE_BY 3 /* e.g. '3' will give either 10MHz or 2MHz SPI clock. */ +#define DIVIDE_BY 1 /* e.g. '3' will give either 10MHz or 2MHz SPI clock. */
#define BITMODE_BITBANG_NORMAL 1 #define BITMODE_BITBANG_SPI 2 @@ -198,6 +202,10 @@ ft2232_vid = OLIMEX_VID; ft2232_type = OLIMEX_ARM_TINY_H_PID; ft2232_interface = INTERFACE_A; + } else if (!strcasecmp(arg, "picotap")) { + ft2232_vid = GOEPEL_VID; + ft2232_type = PICOTAP_PID; + ft2232_interface = INTERFACE_A; } else { msg_perr("Error: Invalid device type specified.\n"); free(arg);
R, S