X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fft2232.c;h=8c2382a15ebb3b5251a1710ea52f31ca811242ae;hp=dd11aec666aa097896785b3e06b81846d24bd11d;hb=e3f3f60a02abfd836c555e84b997de778177bc83;hpb=c2f714bd4482cfe3c09efdc57e8b6b7e8536e181 diff --git a/src/jtag/drivers/ft2232.c b/src/jtag/drivers/ft2232.c index dd11aec666..8c2382a15e 100644 --- a/src/jtag/drivers/ft2232.c +++ b/src/jtag/drivers/ft2232.c @@ -81,6 +81,7 @@ /* project specific includes */ #include +#include #include #if IS_CYGWIN == 1 @@ -187,6 +188,9 @@ static int signalyzer_init(void); static int signalyzer_h_init(void); static int ktlink_init(void); static int redbee_init(void); +static int lisa_l_init(void); +static int flossjtag_init(void); +static int xds100v2_init(void); /* reset procedures for supported layouts */ static void ftx23_reset(int trst, int srst); @@ -202,6 +206,7 @@ static void icebear_jtag_reset(int trst, int srst); static void signalyzer_h_reset(int trst, int srst); static void ktlink_reset(int trst, int srst); static void redbee_reset(int trst, int srst); +static void xds100v2_reset(int trst, int srst); /* blink procedures for layouts that support a blinking led */ static void olimex_jtag_blink(void); @@ -209,6 +214,12 @@ static void flyswatter_jtag_blink(void); static void turtle_jtag_blink(void); static void signalyzer_h_blink(void); static void ktlink_blink(void); +static void lisa_l_blink(void); +static void flossjtag_blink(void); + +/* common transport support options */ + +//static const char *jtag_and_swd[] = { "jtag", "swd", NULL }; static const struct ft2232_layout ft2232_layouts[] = { @@ -298,6 +309,21 @@ static const struct ft2232_layout ft2232_layouts[] = .reset = redbee_reset, .channel = INTERFACE_B, }, + { .name = "lisa-l", + .init = lisa_l_init, + .reset = ftx23_reset, + .blink = lisa_l_blink, + .channel = INTERFACE_B, + }, + { .name = "flossjtag", + .init = flossjtag_init, + .reset = ftx23_reset, + .blink = flossjtag_blink, + }, + { .name = "xds100v2", + .init = xds100v2_init, + .reset = xds100v2_reset, + }, { .name = NULL, /* END OF TABLE */ }, }; @@ -311,8 +337,11 @@ static uint8_t nSRSTnOE; /** the layout being used with this debug session */ static const struct ft2232_layout *layout; -/** default bitmask values ddriven on DBUS: TCK/TDI/TDO/TMS and GPIOL(0..4) */ +/** default bitmask values driven on DBUS: TCK/TDI/TDO/TMS and GPIOL(0..4) */ static uint8_t low_output = 0x0; + +/* note that direction bit == 1 means that signal is an output */ + /** default direction bitmask for DBUS: TCK/TDI/TDO/TMS and GPIOL(0..4) */ static uint8_t low_direction = 0x0; /** default value bitmask for CBUS GPIOH(0..4) */ @@ -344,6 +373,12 @@ static int require_send; a comment would have been nice. */ +#if BUILD_FT2232_FTD2XX == 1 +#define FT2232_BUFFER_READ_QUEUE_SIZE (64*64) +#else +#define FT2232_BUFFER_READ_QUEUE_SIZE (64*4) +#endif + #define FT2232_BUFFER_SIZE 131072 static uint8_t* ft2232_buffer = NULL; @@ -470,7 +505,7 @@ static int ft2232_write(uint8_t* buf, int size, uint32_t* bytes_written) { #if BUILD_FT2232_FTD2XX == 1 FT_STATUS status; - DWORD dw_bytes_written; + DWORD dw_bytes_written = 0; if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK) { *bytes_written = dw_bytes_written; @@ -480,7 +515,6 @@ static int ft2232_write(uint8_t* buf, int size, uint32_t* bytes_written) else { *bytes_written = dw_bytes_written; - return ERROR_OK; } #elif BUILD_FT2232_LIBFTDI == 1 int retval; @@ -493,9 +527,15 @@ static int ft2232_write(uint8_t* buf, int size, uint32_t* bytes_written) else { *bytes_written = retval; - return ERROR_OK; } #endif + + if (*bytes_written != (uint32_t)size) + { + return ERROR_JTAG_DEVICE_ERROR; + } + + return ERROR_OK; } static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read) @@ -569,8 +609,9 @@ static int ft2232h_ft4232h_adaptive_clocking(bool enable) LOG_DEBUG("%2.2x", buf); uint32_t bytes_written; - int retval = ft2232_write(&buf, 1, &bytes_written); - if ((ERROR_OK != retval) || (bytes_written != 1)) + int retval; + + if ((retval = ft2232_write(&buf, sizeof(buf), &bytes_written)) != ERROR_OK) { LOG_ERROR("couldn't write command to %s adaptive clocking" , enable ? "enable" : "disable"); @@ -589,8 +630,8 @@ static int ft2232h_ft4232h_clk_divide_by_5(bool enable) { uint32_t bytes_written; uint8_t buf = enable ? 0x8b : 0x8a; - int retval = ft2232_write(&buf, 1, &bytes_written); - if ((ERROR_OK != retval) || (bytes_written != 1)) + + if (ft2232_write(&buf, sizeof(buf), &bytes_written) != ERROR_OK) { LOG_ERROR("couldn't write command to %s clk divide by 5" , enable ? "enable" : "disable"); @@ -627,7 +668,7 @@ static int ft2232_speed(int speed) buf[2] = (speed >> 8) & 0xff; /* valueH */ LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - if (((retval = ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if ((retval = ft2232_write(buf, sizeof(buf), &bytes_written)) != ERROR_OK) { LOG_ERROR("couldn't set FT2232 TCK speed"); return retval; @@ -737,7 +778,7 @@ static void ft2232_debug_dump_buffer(void) for (i = 0; i < ft2232_buffer_size; i++) { - line_p += snprintf(line_p, 256 - (line_p - line), "%2.2x ", ft2232_buffer[i]); + line_p += snprintf(line_p, sizeof(line) - (line_p - line), "%2.2x ", ft2232_buffer[i]); if (i % 16 == 15) { LOG_DEBUG("%s", line); @@ -1654,6 +1695,36 @@ static void redbee_reset(int trst, int srst) high_direction); } +static void xds100v2_reset(int trst, int srst) +{ + if (trst == 1) + { + tap_set_state(TAP_RESET); + high_output &= ~nTRST; + } + else if (trst == 0) + { + high_output |= nTRST; + } + + if (srst == 1) + { + high_output |= nSRST; + } + else if (srst == 0) + { + high_output &= ~nSRST; + } + + /* command "set data bits low byte" */ + buffer_write(0x82); + buffer_write(high_output); + buffer_write(high_direction); + LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, " + "high_direction: 0x%2.2x", trst, srst, high_output, + high_direction); +} + static int ft2232_execute_runtest(struct jtag_command *cmd) { int retval; @@ -1978,7 +2049,7 @@ static int ft2232_execute_command(struct jtag_command *cmd) { case JTAG_RESET: retval = ft2232_execute_reset(cmd); break; case JTAG_RUNTEST: retval = ft2232_execute_runtest(cmd); break; - case JTAG_STATEMOVE: retval = ft2232_execute_statemove(cmd); break; + case JTAG_TLR_RESET: retval = ft2232_execute_statemove(cmd); break; case JTAG_PATHMOVE: retval = ft2232_execute_pathmove(cmd); break; case JTAG_SCAN: retval = ft2232_execute_scan(cmd); break; case JTAG_SLEEP: retval = ft2232_execute_sleep(cmd); break; @@ -2016,12 +2087,20 @@ static int ft2232_execute_queue(void) while (cmd) { + /* fill the write buffer with the desired command */ if (ft2232_execute_command(cmd) != ERROR_OK) retval = ERROR_JTAG_QUEUE_FAILED; - /* Start reading input before FT2232 TX buffer fills up */ + /* Start reading input before FT2232 TX buffer fills up. + * Sometimes this happens because we don't know the + * length of the last command before we execute it. So + * we simple inform the user. + */ cmd = cmd->next; - if (ft2232_expect_read > 256) + + if (ft2232_expect_read >= FT2232_BUFFER_READ_QUEUE_SIZE ) { + if (ft2232_expect_read > (FT2232_BUFFER_READ_QUEUE_SIZE+1) ) + LOG_DEBUG("read buffer size looks too high %d/%d",ft2232_expect_read,(FT2232_BUFFER_READ_QUEUE_SIZE+1)); if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK) retval = ERROR_JTAG_QUEUE_FAILED; first_unsent = cmd; @@ -2099,7 +2178,7 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor } else { /* drat, give the user a meaningfull message. * telling the use we tried *BOTH* methods. */ - LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'\n", + LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'", ft2232_device_desc, ft2232_device_desc_A); } @@ -2132,7 +2211,7 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor if (status == FT_OK) { - LOG_ERROR("ListDevices: %lu\n", num_devices); + LOG_ERROR("ListDevices: %lu", num_devices); for (i = 0; i < num_devices; i++) LOG_ERROR("%" PRIu32 ": \"%s\"", i, desc_array[i]); } @@ -2144,7 +2223,7 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor } else { - LOG_ERROR("ListDevices: NONE\n"); + LOG_ERROR("ListDevices: NONE"); } return ERROR_JTAG_INIT_FAILED; } @@ -2299,6 +2378,46 @@ static int ft2232_purge_libftdi(void) #endif /* BUILD_FT2232_LIBFTDI == 1 */ +static int ft2232_set_data_bits_low_byte( uint8_t value, uint8_t direction ) +{ + uint8_t buf[3]; + uint32_t bytes_written; + + buf[0] = 0x80; /* command "set data bits low byte" */ + buf[1] = value; /* value */ + buf[2] = direction; /* direction */ + + LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + + if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) + { + LOG_ERROR("couldn't initialize data bits low byte"); + return ERROR_JTAG_INIT_FAILED; + } + + return ERROR_OK; +} + +static int ft2232_set_data_bits_high_byte( uint8_t value, uint8_t direction ) +{ + uint8_t buf[3]; + uint32_t bytes_written; + + buf[0] = 0x82; /* command "set data bits high byte" */ + buf[1] = value; /* value */ + buf[2] = direction; /* direction */ + + LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + + if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) + { + LOG_ERROR("couldn't initialize data bits high byte"); + return ERROR_JTAG_INIT_FAILED; + } + + return ERROR_OK; +} + static int ft2232_init(void) { uint8_t buf[1]; @@ -2366,10 +2485,8 @@ static int ft2232_init(void) return ERROR_JTAG_INIT_FAILED; } - ft2232_speed(jtag_get_speed()); - buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */ - if (((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK) || (bytes_written != 1)) + if ((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK) { LOG_ERROR("couldn't write to FT2232 to disable loopback"); return ERROR_JTAG_INIT_FAILED; @@ -2387,7 +2504,7 @@ static int ft2232_init(void) /** Updates defaults for DBUS signals: the four JTAG signals * (TCK, TDI, TDO, TMS) and * the four GPIOL signals. */ -static inline void ftx232_init_head(void) +static inline void ftx232_dbus_init(void) { low_output = 0x08; low_direction = 0x0b; @@ -2397,11 +2514,8 @@ static inline void ftx232_init_head(void) * the four GPIOL signals. Initialization covers value and direction, * as customized for each layout. */ -static int ftx232_init_tail(void) +static int ftx232_dbus_write(void) { - uint8_t buf[3]; - uint32_t bytes_written; - enum reset_types jtag_reset_config = jtag_get_reset_config(); if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) { @@ -2426,14 +2540,9 @@ static int ftx232_init_tail(void) } /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, xRST high) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { - LOG_ERROR("couldn't initialize FT2232 with 'USBJTAG' layout"); + LOG_ERROR("couldn't initialize FT2232 DBUS"); return ERROR_JTAG_INIT_FAILED; } @@ -2446,19 +2555,19 @@ static int usbjtag_init(void) * NOTE: This is now _specific_ to the "usbjtag" layout. * Don't try cram any more layouts into this. */ - ftx232_init_head(); + ftx232_dbus_init(); nTRST = 0x10; nTRSTnOE = 0x10; nSRST = 0x40; nSRSTnOE = 0x40; - return ftx232_init_tail(); + return ftx232_dbus_write(); } static int lm3s811_jtag_init(void) { - ftx232_init_head(); + ftx232_dbus_init(); /* There are multiple revisions of LM3S811 eval boards: * - Rev B (and older?) boards have no SWO trace support. @@ -2472,52 +2581,70 @@ static int lm3s811_jtag_init(void) low_output = 0x88; low_direction = 0x8b; - return ftx232_init_tail(); + return ftx232_dbus_write(); } static int icdi_jtag_init(void) { - ftx232_init_head(); + ftx232_dbus_init(); /* Most Luminary eval boards support SWO trace output, * and should use this "luminary_icdi" layout. + * + * ADBUS 0..3 are used for JTAG as usual. GPIOs are used + * to switch between JTAG and SWD, or switch the ft2232 UART + * on the second MPSSE channel/interface (BDBUS) + * between (i) the stellaris UART (on Luminary boards) + * or (ii) SWO trace data (generic). + * + * We come up in JTAG mode and may switch to SWD later (with + * SWO/trace option if SWD is active). + * + * DBUS == GPIO-Lx + * CBUS == GPIO-Hx */ + + +#define ICDI_JTAG_EN (1 << 7) /* ADBUS 7 (a.k.a. DBGMOD) */ +#define ICDI_DBG_ENn (1 << 6) /* ADBUS 6 */ +#define ICDI_SRST (1 << 5) /* ADBUS 5 */ + + + /* GPIOs on second channel/interface (UART) ... */ +#define ICDI_SWO_EN (1 << 4) /* BDBUS 4 */ +#define ICDI_TX_SWO (1 << 1) /* BDBUS 1 */ +#define ICDI_VCP_RX (1 << 0) /* BDBUS 0 (to stellaris UART) */ + nTRST = 0x0; nTRSTnOE = 0x00; - nSRST = 0x20; - nSRSTnOE = 0x20; - low_output = 0x88; - low_direction = 0xcb; + nSRST = ICDI_SRST; + nSRSTnOE = ICDI_SRST; - return ftx232_init_tail(); + low_direction |= ICDI_JTAG_EN | ICDI_DBG_ENn; + low_output |= ICDI_JTAG_EN; + low_output &= ~ICDI_DBG_ENn; + + return ftx232_dbus_write(); } static int signalyzer_init(void) { - ftx232_init_head(); + ftx232_dbus_init(); nTRST = 0x10; nTRSTnOE = 0x10; nSRST = 0x20; nSRSTnOE = 0x20; - return ftx232_init_tail(); + return ftx232_dbus_write(); } static int axm0432_jtag_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x08; low_direction = 0x2b; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2558,13 +2685,8 @@ static int axm0432_jtag_init(void) high_output |= nSRST; } - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; /* value */ - buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'Dicarlo' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2575,23 +2697,11 @@ static int axm0432_jtag_init(void) static int redbee_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x08; low_direction = 0x2b; /* initialize low byte for jtag */ - /* command "set data bits low byte" */ - buf[0] = 0x80; - /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; - /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */ - buf[1] = low_output; - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) - || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'redbee' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2624,14 +2734,8 @@ static int redbee_init(void) high_output |= nSRST; } - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; /* value */ - buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) - || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'redbee' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2642,19 +2746,11 @@ static int redbee_init(void) static int jtagkey_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x08; low_direction = 0x1b; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2707,13 +2803,8 @@ static int jtagkey_init(void) high_output &= ~nSRST; } - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; /* value */ - buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2724,19 +2815,11 @@ static int jtagkey_init(void) static int olimex_jtag_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x08; low_direction = 0x1b; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2774,13 +2857,8 @@ static int olimex_jtag_init(void) /* turn red LED on */ high_output |= 0x08; - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; /* value */ - buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK) || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'Olimex' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2791,19 +2869,11 @@ static int olimex_jtag_init(void) static int flyswatter_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x18; low_direction = 0xfb; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE[12]=out, n[ST]srst = out */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2820,13 +2890,8 @@ static int flyswatter_init(void) /* turn red LED3 on, LED2 off */ high_output |= 0x08; - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; /* value */ - buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2837,19 +2902,11 @@ static int flyswatter_init(void) static int turtle_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x08; low_direction = 0x5b; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2860,13 +2917,8 @@ static int turtle_init(void) high_output = 0x00; high_direction = 0x0C; - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; - buf[2] = high_direction; - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2877,19 +2929,11 @@ static int turtle_init(void) static int comstick_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x08; low_direction = 0x0b; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2903,13 +2947,8 @@ static int comstick_init(void) high_output = 0x03; high_direction = 0x03; - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; - buf[2] = high_direction; - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2920,19 +2959,11 @@ static int comstick_init(void) static int stm32stick_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x88; low_direction = 0x8b; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2946,13 +2977,8 @@ static int stm32stick_init(void) high_output = 0x01; high_direction = 0x03; - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; - buf[2] = high_direction; - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2963,19 +2989,11 @@ static int stm32stick_init(void) static int sheevaplug_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x08; low_direction = 0x1b; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2997,13 +3015,8 @@ static int sheevaplug_init(void) high_output |= nSRSTnOE; high_output &= ~nSRST; - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; /* value */ - buf[2] = high_direction; /* all outputs - xRST */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'sheevaplug' layout"); return ERROR_JTAG_INIT_FAILED; @@ -3014,19 +3027,11 @@ static int sheevaplug_init(void) static int cortino_jtag_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x08; low_direction = 0x1b; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; /* value (TMS = 1,TCK = 0, TDI = 0, nOE = 0) */ - buf[2] = low_direction; /* dir (output = 1), TCK/TDI/TMS = out, TDO = in, nOE = out */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout"); return ERROR_JTAG_INIT_FAILED; @@ -3040,15 +3045,94 @@ static int cortino_jtag_init(void) high_output = 0x03; high_direction = 0x03; - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; - buf[2] = high_direction; - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) + { + LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + return ERROR_OK; +} - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) +static int lisa_l_init(void) +{ + ftx232_dbus_init(); + + nTRST = 0x10; + nTRSTnOE = 0x10; + nSRST = 0x40; + nSRSTnOE = 0x40; + + high_output = 0x00; + high_direction = 0x18; + + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { - LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'lisa_l' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + return ftx232_dbus_write(); +} + +static int flossjtag_init(void) +{ + ftx232_dbus_init(); + + nTRST = 0x10; + nTRSTnOE = 0x10; + nSRST = 0x40; + nSRSTnOE = 0x40; + + high_output = 0x00; + high_direction = 0x18; + + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) + { + LOG_ERROR("couldn't initialize FT2232 with 'Floss-JTAG' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + return ftx232_dbus_write(); +} + +static int xds100v2_init(void) +{ + low_output = 0x3A; + low_direction = 0x7B; + + /* initialize low byte for jtag */ + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) + { + LOG_ERROR("couldn't initialize FT2232 with 'xds100v2' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + nTRST = 0x10; + nTRSTnOE = 0x0; /* not output enable for nTRST */ + nSRST = 0x00; /* TODO: SRST is not supported yet */ + nSRSTnOE = 0x00; /* no output enable for nSRST */ + + high_output = 0x00; + high_direction = 0x59; + + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) + { + LOG_ERROR("couldn't initialize FT2232 with 'xds100v2' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + high_output = 0x86; + high_direction = 0x59; + + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) + { + LOG_ERROR("couldn't initialize FT2232 with 'xds100v2' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -3060,16 +3144,7 @@ static void olimex_jtag_blink(void) /* Olimex ARM-USB-OCD has a LED connected to ACBUS3 * ACBUS3 is bit 3 of the GPIOH port */ - if (high_output & 0x08) - { - /* set port pin high */ - high_output &= 0x07; - } - else - { - /* set port pin low */ - high_output |= 0x08; - } + high_output ^= 0x08; buffer_write(0x82); buffer_write(high_output); @@ -3107,6 +3182,44 @@ static void turtle_jtag_blink(void) buffer_write(high_direction); } +static void lisa_l_blink(void) +{ + /* + * Lisa/L has two LEDs connected to BCBUS3 and BCBUS4 + */ + if (high_output & 0x10) + { + high_output = 0x08; + } + else + { + high_output = 0x10; + } + + buffer_write(0x82); + buffer_write(high_output); + buffer_write(high_direction); +} + +static void flossjtag_blink(void) +{ + /* + * Floss-JTAG has two LEDs connected to ACBUS3 and ACBUS4 + */ + if (high_output & 0x10) + { + high_output = 0x08; + } + else + { + high_output = 0x10; + } + + buffer_write(0x82); + buffer_write(high_output); + buffer_write(high_direction); +} + static int ft2232_quit(void) { #if BUILD_FT2232_FTD2XX == 1 @@ -3315,9 +3428,6 @@ static int ft2232_stableclocks(int num_cycles, struct jtag_command* cmd) * ADBUS7 - GND */ static int icebear_jtag_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - low_direction = 0x0b; /* output: TCK TDI TMS; input: TDO */ low_output = 0x08; /* high: TMS; low: TCK TDI */ nTRST = 0x10; @@ -3336,12 +3446,7 @@ static int icebear_jtag_init(void) { low_output |= nSRST; /* initialize low byte for jtag */ - buf[0] = 0x80; /* command "set data bits low byte" */ - buf[1] = low_output; - buf[2] = low_direction; - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) { + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (low)"); return ERROR_JTAG_INIT_FAILED; } @@ -3349,14 +3454,8 @@ static int icebear_jtag_init(void) { high_output = 0x0; high_direction = 0x00; - - /* initialize high port */ - buf[0] = 0x82; /* command "set data bits high byte" */ - buf[1] = high_output; /* value */ - buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */ - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) { + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'IceBear' layout (high)"); return ERROR_JTAG_INIT_FAILED; } @@ -3553,8 +3652,6 @@ static int signalyzer_h_init(void) char *end_of_desc; uint16_t read_buf[12] = { 0 }; - uint8_t buf[3]; - uint32_t bytes_written; /* turn on center green led */ signalyzer_h_led_set(SIGNALYZER_CHAN_C, SIGNALYZER_LED_GREEN, @@ -3999,12 +4096,7 @@ static int signalyzer_h_init(void) } /* initialize low byte of controller for jtag operation */ - buf[0] = 0x80; - buf[1] = low_output; - buf[2] = low_direction; - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) - || (bytes_written != 3)) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize Signalyzer-H layout"); return ERROR_JTAG_INIT_FAILED; @@ -4014,12 +4106,7 @@ static int signalyzer_h_init(void) if (ftdi_device == FT_DEVICE_2232H) { /* initialize high byte of controller for jtag operation */ - buf[0] = 0x82; - buf[1] = high_output; - buf[2] = high_direction; - - if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK) - || (bytes_written != 3)) + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize Signalyzer-H layout"); return ERROR_JTAG_INIT_FAILED; @@ -4029,12 +4116,7 @@ static int signalyzer_h_init(void) if (ftdi_device == TYPE_2232H) { /* initialize high byte of controller for jtag operation */ - buf[0] = 0x82; - buf[1] = high_output; - buf[2] = high_direction; - - if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK) - || (bytes_written != 3)) + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize Signalyzer-H layout"); return ERROR_JTAG_INIT_FAILED; @@ -4205,20 +4287,13 @@ static void signalyzer_h_blink(void) *******************************************************************/ static int ktlink_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; uint8_t swd_en = 0x20; //0x20 SWD disable, 0x00 SWD enable (ADBUS5) low_output = 0x08 | swd_en; // value; TMS=1,TCK=0,TDI=0,SWD=swd_en low_direction = 0x3B; // out=1; TCK/TDI/TMS=out,TDO=in,SWD=out,RTCK=in,SRSTIN=in - // initialize low port - buf[0] = 0x80; // command "set data bits low byte" - buf[1] = low_output; - buf[2] = low_direction; - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + /* initialize low byte for jtag */ + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'ktlink' layout"); return ERROR_JTAG_INIT_FAILED; @@ -4250,13 +4325,8 @@ static int ktlink_init(void) high_output &= ~nSRST; } - // initialize high port - buf[0] = 0x82; // command "set data bits high byte" - buf[1] = high_output; // value - buf[2] = high_direction; - LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); - - if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3)) + /* initialize high byte for jtag */ + if (ft2232_set_data_bits_high_byte(high_output,high_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 with 'ktlink' layout"); return ERROR_JTAG_INIT_FAILED; @@ -4302,10 +4372,7 @@ static void ktlink_reset(int trst, int srst) static void ktlink_blink(void) { /* LED connected to ACBUS7 */ - if (high_output & 0x80) - high_output &= 0x7F; - else - high_output |= 0x80; + high_output ^= 0x80; buffer_write(0x82); // command "set data bits high byte" buffer_write(high_output); @@ -4356,6 +4423,7 @@ struct jtag_interface ft2232_interface = { .name = "ft2232", .supported = DEBUG_CAP_TMS_SEQ, .commands = ft2232_command_handlers, + .transports = jtag_only, .init = ft2232_init, .quit = ft2232_quit,