X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fft2232.c;h=4b9bdef7dd5ae789faa4796f38fda6412f19f3ce;hp=f8b29273ac6a30ed4c6cdcac478590d876b19c5b;hb=16b6b5e7a86353dbc0c4823fe3d772c0faca7c1c;hpb=9629adcbde2bfac67296ad954c2233f725e1570e diff --git a/src/jtag/drivers/ft2232.c b/src/jtag/drivers/ft2232.c index f8b29273ac..4b9bdef7dd 100644 --- a/src/jtag/drivers/ft2232.c +++ b/src/jtag/drivers/ft2232.c @@ -81,7 +81,7 @@ /* project specific includes */ #include -#include +#include #include #if IS_CYGWIN == 1 @@ -99,6 +99,7 @@ /* FT2232 access library includes */ #if BUILD_FT2232_FTD2XX == 1 #include +#include "ftd2xx_common.h" enum ftdi_interface { @@ -176,7 +177,9 @@ static int jtagkey_init(void); static int lm3s811_jtag_init(void); static int icdi_jtag_init(void); static int olimex_jtag_init(void); -static int flyswatter_init(void); +static int flyswatter1_init(void); +static int flyswatter2_init(void); +static int minimodule_init(void); static int turtle_init(void); static int comstick_init(void); static int stm32stick_init(void); @@ -196,7 +199,9 @@ static int xds100v2_init(void); static void ftx23_reset(int trst, int srst); static void jtagkey_reset(int trst, int srst); static void olimex_jtag_reset(int trst, int srst); -static void flyswatter_reset(int trst, int srst); +static void flyswatter1_reset(int trst, int srst); +static void flyswatter2_reset(int trst, int srst); +static void minimodule_reset(int trst, int srst); static void turtle_reset(int trst, int srst); static void comstick_reset(int trst, int srst); static void stm32stick_reset(int trst, int srst); @@ -210,7 +215,8 @@ static void xds100v2_reset(int trst, int srst); /* blink procedures for layouts that support a blinking led */ static void olimex_jtag_blink(void); -static void flyswatter_jtag_blink(void); +static void flyswatter1_jtag_blink(void); +static void flyswatter2_jtag_blink(void); static void turtle_jtag_blink(void); static void signalyzer_h_blink(void); static void ktlink_blink(void); @@ -257,9 +263,18 @@ static const struct ft2232_layout ft2232_layouts[] = .blink = olimex_jtag_blink }, { .name = "flyswatter", - .init = flyswatter_init, - .reset = flyswatter_reset, - .blink = flyswatter_jtag_blink + .init = flyswatter1_init, + .reset = flyswatter1_reset, + .blink = flyswatter1_jtag_blink + }, + { .name = "flyswatter2", + .init = flyswatter2_init, + .reset = flyswatter2_reset, + .blink = flyswatter2_jtag_blink + }, + { .name = "minimodule", + .init = minimodule_init, + .reset = minimodule_reset, }, { .name = "turtelizer2", .init = turtle_init, @@ -373,6 +388,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; @@ -499,11 +520,11 @@ 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; - LOG_ERROR("FT_Write returned: %lu", status); + LOG_ERROR("FT_Write returned: %s", ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } else @@ -546,7 +567,7 @@ static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read) *bytes_read, &dw_bytes_read)) != FT_OK) { *bytes_read = 0; - LOG_ERROR("FT_Read returned: %lu", status); + LOG_ERROR("FT_Read returned: %s", ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } *bytes_read += dw_bytes_read; @@ -1332,7 +1353,6 @@ static int ft2232_large_scan(struct scan_command* cmd, enum scan_type type, uint LOG_DEBUG("thisrun_read: %i, bytes_read: %i", thisrun_read, (int)bytes_read); - receive_pointer += bytes_read; } return ERROR_OK; @@ -1559,6 +1579,34 @@ static void flyswatter_reset(int trst, int srst) LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction); } +static void flyswatter1_reset(int trst, int srst) +{ + flyswatter_reset(trst, srst); +} + +static void flyswatter2_reset(int trst, int srst) +{ + flyswatter_reset(trst, !srst); +} + +static void minimodule_reset(int trst, int srst) +{ + if (srst == 1) + { + low_output &= ~nSRST; + } + else if (srst == 0) + { + low_output |= nSRST; + } + + /* command "set data bits low byte" */ + buffer_write(0x80); + buffer_write(low_output); + buffer_write(low_direction); + LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction); +} + static void turtle_reset(int trst, int srst) { trst = trst; @@ -2081,12 +2129,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; @@ -2177,11 +2233,13 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor if (more) { - LOG_WARNING("unable to open ftdi device (trying more): %lu", status); + LOG_WARNING("unable to open ftdi device (trying more): %s", + ftd2xx_status_string(status)); *try_more = 1; return ERROR_JTAG_INIT_FAILED; } - LOG_ERROR("unable to open ftdi device: %lu", status); + LOG_ERROR("unable to open ftdi device: %s", + ftd2xx_status_string(status)); status = FT_ListDevices(&num_devices, NULL, FT_LIST_NUMBER_ONLY); if (status == FT_OK) { @@ -2197,7 +2255,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", num_devices); + LOG_ERROR("ListDevices: %" PRIu32, (uint32_t)num_devices); for (i = 0; i < num_devices; i++) LOG_ERROR("%" PRIu32 ": \"%s\"", i, desc_array[i]); } @@ -2216,14 +2274,28 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor if ((status = FT_SetLatencyTimer(ftdih, ft2232_latency)) != FT_OK) { - LOG_ERROR("unable to set latency timer: %lu", status); + LOG_ERROR("unable to set latency timer: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_INIT_FAILED; } if ((status = FT_GetLatencyTimer(ftdih, &latency_timer)) != FT_OK) { - LOG_ERROR("unable to get latency timer: %lu", status); - return ERROR_JTAG_INIT_FAILED; + /* ftd2xx 1.04 (linux) has a bug when calling FT_GetLatencyTimer + * so ignore errors if using this driver version */ + DWORD dw_version; + + status = FT_GetDriverVersion(ftdih, &dw_version); + LOG_ERROR("unable to get latency timer: %s", + ftd2xx_status_string(status)); + + if ((status == FT_OK) && (dw_version == 0x10004)) { + LOG_ERROR("ftd2xx 1.04 detected - this has known issues " \ + "with FT_GetLatencyTimer, upgrade to a newer version"); + } + else { + return ERROR_JTAG_INIT_FAILED; + } } else { @@ -2232,19 +2304,22 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor if ((status = FT_SetTimeouts(ftdih, 5000, 5000)) != FT_OK) { - LOG_ERROR("unable to set timeouts: %lu", status); + LOG_ERROR("unable to set timeouts: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_INIT_FAILED; } if ((status = FT_SetBitMode(ftdih, 0x0b, 2)) != FT_OK) { - LOG_ERROR("unable to enable bit i/o mode: %lu", status); + LOG_ERROR("unable to enable bit i/o mode: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_INIT_FAILED; } if ((status = FT_GetDeviceInfo(ftdih, &ftdi_device, &deviceID, SerialNumber, Description, NULL)) != FT_OK) { - LOG_ERROR("unable to get FT_GetDeviceInfo: %lu", status); + LOG_ERROR("unable to get FT_GetDeviceInfo: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_INIT_FAILED; } else @@ -2254,8 +2329,8 @@ static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_mor unsigned no_of_known_types = ARRAY_SIZE(type_str) - 1; unsigned type_index = ((unsigned)ftdi_device <= no_of_known_types) ? ftdi_device : FT_DEVICE_UNKNOWN; - LOG_INFO("device: %lu \"%s\"", ftdi_device, type_str[type_index]); - LOG_INFO("deviceID: %lu", deviceID); + LOG_INFO("device: %" PRIu32 " \"%s\"", (uint32_t)ftdi_device, type_str[type_index]); + LOG_INFO("deviceID: %" PRIu32, (uint32_t)deviceID); LOG_INFO("SerialNumber: %s", SerialNumber); LOG_INFO("Description: %s", Description); } @@ -2269,7 +2344,8 @@ static int ft2232_purge_ftd2xx(void) if ((status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX)) != FT_OK) { - LOG_ERROR("error purging ftd2xx device: %lu", status); + LOG_ERROR("error purging ftd2xx device: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_INIT_FAILED; } @@ -2364,6 +2440,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]; @@ -2431,12 +2547,6 @@ static int ft2232_init(void) return ERROR_JTAG_INIT_FAILED; } - int jtag_speed_var; - retval = jtag_get_speed(&jtag_speed_var); - if (retval != ERROR_OK) - return retval; - ft2232_speed(jtag_speed_var); - buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */ if ((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK) { @@ -2468,9 +2578,6 @@ static inline void ftx232_dbus_init(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) { @@ -2495,12 +2602,7 @@ static int ftx232_dbus_write(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, sizeof(buf), &bytes_written) != ERROR_OK) + if (ft2232_set_data_bits_low_byte(low_output,low_direction) != ERROR_OK) { LOG_ERROR("couldn't initialize FT2232 DBUS"); return ERROR_JTAG_INIT_FAILED; @@ -2600,19 +2702,11 @@ static int signalyzer_init(void) 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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -2653,13 +2747,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -2670,22 +2759,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -2718,13 +2796,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -2735,19 +2808,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -2800,13 +2865,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -2817,19 +2877,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -2867,13 +2919,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -2882,21 +2929,21 @@ static int olimex_jtag_init(void) return ERROR_OK; } -static int flyswatter_init(void) +static int flyswatter_init(int rev) { - uint8_t buf[3]; - uint32_t bytes_written; - low_output = 0x18; - low_direction = 0xfb; + low_direction = 0x7b; - /* 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 ((rev < 0) || (rev > 3)) { + LOG_ERROR("bogus 'flyswatter' revision supplied (%i)", rev); + return ERROR_JTAG_INIT_FAILED; + } - if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) + if (rev == 1) + low_direction |= 1 << 7; + + /* 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 'flyswatter' layout"); return ERROR_JTAG_INIT_FAILED; @@ -2908,18 +2955,17 @@ static int flyswatter_init(void) nSRSTnOE = 0x00; /* no output enable for nSRST */ high_output = 0x00; - high_direction = 0x0c; + + if (rev == 1) + high_direction = 0x0c; + else + high_direction = 0x01; /* 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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -2928,21 +2974,54 @@ static int flyswatter_init(void) return ERROR_OK; } -static int turtle_init(void) +static int flyswatter1_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; + return flyswatter_init(1); +} + +static int flyswatter2_init(void) +{ + return flyswatter_init(2); +} + +static int minimodule_init(void) +{ + low_output = 0x18;//check if srst should be 1 or 0 initially. (0x08) (flyswatter was 0x18) + low_direction = 0xfb;//0xfb; + + /* 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 'minimodule' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + + nSRST = 0x20; + high_output = 0x00; + high_direction = 0x05; + + /* turn red LED3 on, LED2 off */ + //high_output |= 0x08; + + /* 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 'minimodule' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + return ERROR_OK; +} + +static int turtle_init(void) +{ 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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -2953,13 +3032,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -2970,19 +3044,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -2996,13 +3062,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -3013,19 +3074,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -3039,13 +3092,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -3056,19 +3104,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -3090,13 +3130,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -3107,19 +3142,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -3133,15 +3160,10 @@ 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]); - - if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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 'cortino' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -3150,9 +3172,6 @@ static int cortino_jtag_init(void) static int lisa_l_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - ftx232_dbus_init(); nTRST = 0x10; @@ -3163,13 +3182,8 @@ static int lisa_l_init(void) high_output = 0x00; high_direction = 0x18; - /* 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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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 'lisa_l' layout"); return ERROR_JTAG_INIT_FAILED; @@ -3180,9 +3194,6 @@ static int lisa_l_init(void) static int flossjtag_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; - ftx232_dbus_init(); nTRST = 0x10; @@ -3193,13 +3204,8 @@ static int flossjtag_init(void) high_output = 0x00; high_direction = 0x18; - /* 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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -3208,58 +3214,65 @@ static int flossjtag_init(void) return ftx232_dbus_write(); } +/* + * The reference schematic from TI for the XDS100v2 has a CPLD on which opens + * the door for a number of different configurations + * + * Known Implementations: + * http://processors.wiki.ti.com/images/9/93/TMS570LS20216_USB_STICK_Schematic.pdf + * + * http://processors.wiki.ti.com/index.php/XDS100 (rev2) + * * CLPD logic: Rising edge to enable outputs (XDS100_PWR_RST) + * * ACBUS3 to transition 0->1 (OE rising edge) + * * CPLD logic: Put the EMU0/1 pins in Hi-Z: + * * ADBUS5/GPIOL1 = EMU_EN = 1 + * * ADBUS6/GPIOL2 = EMU0 = 0 + * * ACBUS4/SPARE0 = EMU1 = 0 + * * CPLD logic: Disable loopback + * * ACBUS6/SPARE2 = LOOPBACK = 0 + */ +#define XDS100_nEMU_EN (1<<5) +#define XDS100_nEMU0 (1<<6) + +#define XDS100_PWR_RST (1<<3) +#define XDS100_nEMU1 (1<<4) +#define XDS100_LOOPBACK (1<<6) static int xds100v2_init(void) { - uint8_t buf[3]; - uint32_t bytes_written; + /* These are in the lower byte */ + nTRST = 0x10; + nTRSTnOE = 0x10; - low_output = 0x3A; - low_direction = 0x7B; + /* These aren't actually used on 14 pin connectors */ + /* These are in the upper byte */ + nSRST = 0x01; + nSRSTnOE = 0x01; - /* 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]); + low_output = 0x08 | nTRST | XDS100_nEMU_EN; + low_direction = 0x0b | nTRSTnOE | XDS100_nEMU_EN | XDS100_nEMU0; - if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) + 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; + high_output = 0; + high_direction = nSRSTnOE | XDS100_LOOPBACK | XDS100_PWR_RST | XDS100_nEMU1; - /* 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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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"); + LOG_ERROR("couldn't put CPLD in to reset with 'xds100v2' layout"); return ERROR_JTAG_INIT_FAILED; } - high_output = 0x86; - high_direction = 0x59; - - /* 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]); + high_output |= XDS100_PWR_RST; - if (ft2232_write(buf, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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"); + LOG_ERROR("couldn't bring CPLD out of reset with 'xds100v2' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -3271,32 +3284,34 @@ 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); buffer_write(high_direction); } -static void flyswatter_jtag_blink(void) +static void flyswatter_jtag_blink(unsigned char led) +{ + buffer_write(0x82); + buffer_write(high_output ^ led); + buffer_write(high_direction); +} + +static void flyswatter1_jtag_blink(void) { /* * Flyswatter has two LEDs connected to ACBUS2 and ACBUS3 */ - high_output ^= 0x0c; + flyswatter_jtag_blink(0xc); +} - buffer_write(0x82); - buffer_write(high_output); - buffer_write(high_direction); +static void flyswatter2_jtag_blink(void) +{ + /* + * Flyswatter2 only has one LED connected to ACBUS2 + */ + flyswatter_jtag_blink(0x4); } static void turtle_jtag_blink(void) @@ -3416,7 +3431,7 @@ COMMAND_HANDLER(ft2232_handle_serial_command) } else { - LOG_ERROR("expected exactly one argument to ft2232_serial "); + return ERROR_COMMAND_SYNTAX_ERROR; } return ERROR_OK; @@ -3425,8 +3440,7 @@ COMMAND_HANDLER(ft2232_handle_serial_command) COMMAND_HANDLER(ft2232_handle_layout_command) { if (CMD_ARGC != 1) { - LOG_ERROR("Need exactly one argument to ft2232_layout"); - return ERROR_FAIL; + return ERROR_COMMAND_SYNTAX_ERROR; } if (layout) { @@ -3489,7 +3503,7 @@ COMMAND_HANDLER(ft2232_handle_latency_command) } else { - LOG_ERROR("expected exactly one argument to ft2232_latency "); + return ERROR_COMMAND_SYNTAX_ERROR; } return ERROR_OK; @@ -3564,9 +3578,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; @@ -3585,12 +3596,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, sizeof(buf), &bytes_written) != ERROR_OK) { + 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; } @@ -3598,14 +3604,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, sizeof(buf), &bytes_written) != ERROR_OK) { + /* 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; } @@ -3723,7 +3723,8 @@ static int signalyzer_h_led_set(unsigned char channel, unsigned char led, if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR, ((uint32_t)(channel << 8) | led))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -3731,7 +3732,8 @@ static int signalyzer_h_led_set(unsigned char channel, unsigned char led, (SIGNALYZER_DATA_BUFFER_ADDR + 1), ((uint32_t)(on_time << 8) | off_time))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -3739,14 +3741,16 @@ static int signalyzer_h_led_set(unsigned char channel, unsigned char led, (SIGNALYZER_DATA_BUFFER_ADDR + 2), ((uint32_t)cycles))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_LED_SET)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -3802,8 +3806,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, @@ -3837,7 +3839,8 @@ static int signalyzer_h_init(void) if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_VERSION)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -3847,8 +3850,8 @@ static int signalyzer_h_init(void) (SIGNALYZER_DATA_BUFFER_ADDR + i), &read_buf[i])) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_read returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_read returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } } @@ -3861,21 +3864,24 @@ static int signalyzer_h_init(void) if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0404)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -3883,28 +3889,32 @@ static int signalyzer_h_init(void) if ((status = signalyzer_h_ctrl_write(SIGNALYZER_DATA_BUFFER_ADDR, ((uint32_t)(signalyzer_h_side << 8) | 0x01))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } if ((status = signalyzer_h_ctrl_write( (SIGNALYZER_DATA_BUFFER_ADDR + 1), 0xA000)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } if ((status = signalyzer_h_ctrl_write( (SIGNALYZER_DATA_BUFFER_ADDR + 2), 0x0008)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_I2C)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -3913,7 +3923,8 @@ static int signalyzer_h_init(void) if ((status = signalyzer_h_ctrl_read(SIGNALYZER_COMMAND_ADDR, &read_buf[0])) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_read returned: %lu", status); + LOG_ERROR("signalyzer_h_ctrl_read returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -3927,8 +3938,8 @@ static int signalyzer_h_init(void) (SIGNALYZER_DATA_BUFFER_ADDR + i), &read_buf[i])) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_read returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_read returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } } @@ -3992,16 +4003,16 @@ static int signalyzer_h_init(void) ((uint32_t)(signalyzer_h_side << 8) | 0x01))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_POWERCONTROL_SET)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4010,8 +4021,8 @@ static int signalyzer_h_init(void) SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4019,16 +4030,16 @@ static int signalyzer_h_init(void) SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_MODE)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4037,8 +4048,8 @@ static int signalyzer_h_init(void) SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4046,8 +4057,8 @@ static int signalyzer_h_init(void) SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x4040)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4055,8 +4066,8 @@ static int signalyzer_h_init(void) SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } #endif @@ -4127,8 +4138,8 @@ static int signalyzer_h_init(void) ((uint32_t)(signalyzer_h_side << 8) | 0x01))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4136,8 +4147,8 @@ static int signalyzer_h_init(void) SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_POWERCONTROL_SET)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4148,8 +4159,8 @@ static int signalyzer_h_init(void) SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4157,8 +4168,8 @@ static int signalyzer_h_init(void) SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0060)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4166,8 +4177,8 @@ static int signalyzer_h_init(void) SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_MODE)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4178,8 +4189,8 @@ static int signalyzer_h_init(void) SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4187,8 +4198,8 @@ static int signalyzer_h_init(void) SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } @@ -4196,8 +4207,8 @@ static int signalyzer_h_init(void) SIGNALYZER_COMMAND_ADDR, SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK) { - LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", - status); + LOG_ERROR("signalyzer_h_ctrl_write returned: %s", + ftd2xx_status_string(status)); return ERROR_JTAG_DEVICE_ERROR; } #endif @@ -4248,11 +4259,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -4262,11 +4269,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -4276,11 +4279,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, sizeof(buf), &bytes_written) != ERROR_OK) + 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; @@ -4451,20 +4450,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -4496,13 +4488,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, sizeof(buf), &bytes_written) != ERROR_OK) + /* 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; @@ -4548,10 +4535,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);