Hi,
here is the 3rd version of the JTAGkey patch against trunk.
* rename FTDI_2232H to FTDI_2232H_PID, same for FTDI_4232H * add AMONTEC_JTAGKEY_PID to flash.h * add FTDI_VID (0x0403) to flash.h
Signed-off-by: Joerg Fischer turboj@gmx.de
Index: flashrom.8 =================================================================== --- flashrom.8 (Revision 1109) +++ flashrom.8 (Arbeitskopie) @@ -177,11 +177,11 @@ .sp .BR "* atahpt" " (for flash ROMs on Highpoint ATA/RAID controllers)" .sp -.BR "* it87spi" " (for flash ROMs behind an ITE IT87xx Super I/O LPC/SPI\ +.BR "* it87spi" " (for flash ROMs behind an ITE IT87xx Super I/O LPC/SPI \ translation unit)" .sp -.BR "* ft2232_spi" " (for SPI flash ROMs attached to a FT2232H/FT4232H based\ -USB SPI programmer)" +.BR "* ft2232_spi" " (for SPI flash ROMs attached to a FT2232H/FT4232H/JTAGkey \ +based USB SPI programmer)" .sp .BR "* serprog" " (for flash ROMs attached to a programmer speaking serprog)" .sp @@ -351,7 +351,7 @@ syntax where .B model can be any of -.BR 2232H ", or " 4232H +.BR 2232H ", "JTAGkey ", or " 4232H and .B interface can be any of Index: flash.h =================================================================== --- flash.h (Revision 1109) +++ flash.h (Arbeitskopie) @@ -530,8 +530,10 @@ #endif
/* ft2232_spi.c */ -#define FTDI_FT2232H 0x6010 -#define FTDI_FT4232H 0x6011 +#define FTDI_VID 0x0403 +#define FTDI_FT2232H_PID 0x6010 +#define FTDI_FT4232H_PID 0x6011 +#define AMONTEC_JTAGKEY_PID 0xCFF8 int ft2232_spi_init(void); int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt, const unsigned char *writearr, unsigned char *readarr); int ft2232_spi_read(struct flashchip *flash, uint8_t *buf, int start, int len); Index: ft2232_spi.c =================================================================== --- ft2232_spi.c (Revision 1109) +++ ft2232_spi.c (Arbeitskopie) @@ -45,8 +45,29 @@ #define BITMODE_BITBANG_NORMAL 1 #define BITMODE_BITBANG_SPI 2
+/* Set data bits low-byte command: + * value: 0x08 CS=high, DI=low, DO=low, SK=low + * dir: 0x0b CS=output, DI=input, DO=output, SK=output + * + * JTAGkey(2) needs to enable its output via Bit4 / GPIOL0 + * value: 0x18 OE=high, CS=high, DI=low, DO=low, SK=low + * dir: 0x1b OE=output, CS=output, DI=input, DO=output, SK=output + * + */ +static unsigned char cs_bits = 0x08; +static unsigned char pindir = 0x0b; static struct ftdi_context ftdic_context;
+static const char * getFT2232name(int ft2232_type) +{ + switch(ft2232_type) { + case FTDI_FT2232H_PID: return "2232H"; + case AMONTEC_JTAGKEY_PID: return "JTAGkey"; + default: return "4232H"; + } + return "4232H"; +} + static int send_buf(struct ftdi_context *ftdic, const unsigned char *buf, int size) { int r; @@ -76,16 +97,22 @@ int f; struct ftdi_context *ftdic = &ftdic_context; unsigned char buf[512]; - int ft2232_type = FTDI_FT4232H; + int ft2232_type = FTDI_FT4232H_PID; enum ftdi_interface ft2232_interface = INTERFACE_B; char *arg;
arg = extract_programmer_param("type"); if (arg) { if (!strcasecmp(arg, "2232H")) - ft2232_type = FTDI_FT2232H; + ft2232_type = FTDI_FT2232H_PID; else if (!strcasecmp(arg, "4232H")) - ft2232_type = FTDI_FT4232H; + ft2232_type = FTDI_FT4232H_PID; + else if (!strcasecmp(arg, "jtagkey")) { + ft2232_type = AMONTEC_JTAGKEY_PID; + ft2232_interface = INTERFACE_A; + cs_bits = 0x18; + pindir = 0x1b; + } else { msg_perr("Error: Invalid device type specified.\n"); free(arg); @@ -110,7 +137,7 @@ } free(arg); msg_pdbg("Using device type %s ", - (ft2232_type == FTDI_FT2232H) ? "2232H" : "4232H"); + getFT2232name(ft2232_type)); msg_pdbg("interface %s\n", (ft2232_interface == INTERFACE_A) ? "A" : "B");
@@ -119,7 +146,7 @@ return EXIT_FAILURE; // TODO }
- f = ftdi_usb_open(ftdic, 0x0403, ft2232_type); + f = ftdi_usb_open(ftdic, FTDI_VID, ft2232_type);
if (f < 0 && f != -5) { msg_perr("Unable to open FTDI device: %d (%s)\n", f, @@ -178,14 +205,9 @@ return -1;
msg_pdbg("Set data bits\n"); - /* Set data bits low-byte command: - * value: 0x08 CS=high, DI=low, DO=low, SK=low - * dir: 0x0b CS=output, DI=input, DO=output, SK=output - */ -#define CS_BIT 0x08 buf[0] = SET_BITS_LOW; - buf[1] = CS_BIT; - buf[2] = 0x0b; + buf[1] = cs_bits; + buf[2] = pindir; if (send_buf(ftdic, buf, 3)) return -1;
@@ -230,8 +252,8 @@ */ msg_pspew("Assert CS#\n"); buf[i++] = SET_BITS_LOW; - buf[i++] = 0 & ~CS_BIT; /* assertive */ - buf[i++] = 0x0b; + buf[i++] = 0 & ~cs_bits; /* assertive */ + buf[i++] = pindir;
if (writecnt) { buf[i++] = 0x11; @@ -272,8 +294,8 @@
msg_pspew("De-assert CS#\n"); buf[i++] = SET_BITS_LOW; - buf[i++] = CS_BIT; - buf[i++] = 0x0b; + buf[i++] = cs_bits; + buf[i++] = pindir; ret = send_buf(ftdic, buf, i); failed |= ret; if (ret)