X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fft2232.c;h=b0c1c35c72af84f310981147acf896061c651f0a;hb=d6ed10a0023b8885c1ead022393eb5afe0208374;hp=44b0e6a8dca6d216304cc16920f36a5a32fcb586;hpb=290e01c62afdfd5f6eb76a4caef266344510f2c0;p=openocd.git diff --git a/src/jtag/ft2232.c b/src/jtag/ft2232.c index 44b0e6a8dc..b0c1c35c72 100644 --- a/src/jtag/ft2232.c +++ b/src/jtag/ft2232.c @@ -2,6 +2,9 @@ * Copyright (C) 2004, 2006 by Dominic Rath * * Dominic.Rath@gmx.de * * * + * Copyright (C) 2008 by Spencer Oliver * + * spen@spen-soft.co.uk * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -23,7 +26,6 @@ #if IS_CYGWIN == 1 #include "windows.h" -#undef ERROR #endif #include "replacements.h" @@ -47,9 +49,6 @@ #include #endif -#include -#include - /* enable this to debug io latency */ #if 0 @@ -65,6 +64,8 @@ int ft2232_execute_queue(void); int ft2232_speed(int speed); +int ft2232_speed_div(int speed, int *khz); +int ft2232_khz(int khz, int *jtag_speed); int ft2232_register_commands(struct command_context_s *cmd_ctx); int ft2232_init(void); int ft2232_quit(void); @@ -73,10 +74,12 @@ int ft2232_handle_device_desc_command(struct command_context_s *cmd_ctx, char *c int ft2232_handle_serial_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int ft2232_handle_layout_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int ft2232_handle_vid_pid_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +int ft2232_handle_latency_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); char *ft2232_device_desc = NULL; char *ft2232_serial = NULL; char *ft2232_layout = NULL; +unsigned char ft2232_latency = 2; #define MAX_USB_IDS 8 /* vid = pid = 0 marks the end of the list */ @@ -95,17 +98,21 @@ typedef struct ft2232_layout_s int usbjtag_init(void); int jtagkey_init(void); int olimex_jtag_init(void); -int m5960_init(void); +int flyswatter_init(void); int turtle_init(void); int comstick_init(void); +int stm32stick_init(void); +int axm0432_jtag_init(void); /* reset procedures for supported layouts */ void usbjtag_reset(int trst, int srst); void jtagkey_reset(int trst, int srst); void olimex_jtag_reset(int trst, int srst); -void m5960_reset(int trst, int srst); +void flyswatter_reset(int trst, int srst); void turtle_reset(int trst, int srst); void comstick_reset(int trst, int srst); +void stm32stick_reset(int trst, int srst); +void axm0432_jtag_reset(int trst, int srst); /* blink procedures for layouts that support a blinking led */ void olimex_jtag_blink(void); @@ -120,9 +127,11 @@ ft2232_layout_t ft2232_layouts[] = {"signalyzer", usbjtag_init, usbjtag_reset, NULL}, {"evb_lm3s811", usbjtag_init, usbjtag_reset, NULL}, {"olimex-jtag", olimex_jtag_init, olimex_jtag_reset, olimex_jtag_blink}, - {"m5960", m5960_init, m5960_reset, NULL}, + {"flyswatter", flyswatter_init, flyswatter_reset, NULL}, {"turtelizer2", turtle_init, turtle_reset, turtle_jtag_blink}, {"comstick", comstick_init, comstick_reset, NULL}, + {"stm32stick", stm32stick_init, stm32stick_reset, NULL}, + {"axm0432_jtag", axm0432_jtag_init, axm0432_jtag_reset, NULL}, {NULL, NULL, NULL}, }; @@ -150,14 +159,11 @@ static int ft2232_expect_read = 0; jtag_interface_t ft2232_interface = { - .name = "ft2232", - .execute_queue = ft2232_execute_queue, - - .support_pathmove = 1, - .speed = ft2232_speed, + .speed_div = ft2232_speed_div, + .khz = ft2232_khz, .register_commands = ft2232_register_commands, .init = ft2232_init, .quit = ft2232_quit, @@ -171,7 +177,7 @@ int ft2232_write(u8 *buf, int size, u32* bytes_written) if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK) { *bytes_written = dw_bytes_written; - ERROR("FT_Write returned: %lu", status); + LOG_ERROR("FT_Write returned: %lu", status); return ERROR_JTAG_DEVICE_ERROR; } else @@ -184,7 +190,7 @@ int ft2232_write(u8 *buf, int size, u32* bytes_written) if ((retval = ftdi_write_data(&ftdic, buf, size)) < 0) { *bytes_written = 0; - ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic)); + LOG_ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic)); return ERROR_JTAG_DEVICE_ERROR; } else @@ -209,7 +215,7 @@ int ft2232_read(u8* buf, int size, u32* bytes_read) *bytes_read, &dw_bytes_read)) != FT_OK) { *bytes_read = 0; - ERROR("FT_Read returned: %lu", status); + LOG_ERROR("FT_Read returned: %lu", status); return ERROR_JTAG_DEVICE_ERROR; } *bytes_read += dw_bytes_read; @@ -224,7 +230,7 @@ int ft2232_read(u8* buf, int size, u32* bytes_read) if ((retval = ftdi_read_data(&ftdic, buf + *bytes_read, size - *bytes_read)) < 0) { *bytes_read = 0; - ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic)); + LOG_ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic)); return ERROR_JTAG_DEVICE_ERROR; } *bytes_read += retval; @@ -233,7 +239,7 @@ int ft2232_read(u8* buf, int size, u32* bytes_read) if (*bytes_read < size) { - ERROR("couldn't read the requested number of bytes from FT2232 device (%i < %i)", *bytes_read, size); + LOG_ERROR("couldn't read the requested number of bytes from FT2232 device (%i < %i)", *bytes_read, size); return ERROR_JTAG_DEVICE_ERROR; } @@ -247,15 +253,65 @@ int ft2232_speed(int speed) u32 bytes_written; buf[0] = 0x86; /* command "set divisor" */ - buf[1] = speed & 0xff; /* valueL (0=6MHz, 1=3MHz, 2=1.5MHz, ...*/ + buf[1] = speed & 0xff; /* valueL (0=6MHz, 1=3MHz, 2=2.0MHz, ...*/ buf[2] = (speed >> 8) & 0xff; /* valueH */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't set FT2232 TCK speed"); + LOG_ERROR("couldn't set FT2232 TCK speed"); return retval; } + + return ERROR_OK; +} + +int ft2232_speed_div(int speed, int *khz) +{ + /* Take a look in the FT2232 manual, + * AN2232C-01 Command Processor for + * MPSSE and MCU Host Bus. Chapter 3.8 */ + + *khz = 6000 / (1+speed); + + return ERROR_OK; +} + +int ft2232_khz(int khz, int *jtag_speed) +{ + if (khz==0) + { + LOG_ERROR("RCLK not supported"); + return ERROR_FAIL; + } + /* Take a look in the FT2232 manual, + * AN2232C-01 Command Processor for + * MPSSE and MCU Host Bus. Chapter 3.8 + * + * We will calc here with a multiplier + * of 10 for better rounding later. */ + + /* Calc speed, (6000 / khz) - 1 */ + /* Use 65000 for better rounding */ + *jtag_speed = (60000 / khz) - 10; + + /* Add 0.9 for rounding */ + *jtag_speed += 9; + + /* Calc real speed */ + *jtag_speed = *jtag_speed / 10; + + /* Check if speed is greater than 0 */ + if (*jtag_speed < 0) + { + *jtag_speed = 0; + } + + /* Check max value */ + if (*jtag_speed > 0xFFFF) + { + *jtag_speed = 0xFFFF; + } return ERROR_OK; } @@ -263,13 +319,15 @@ int ft2232_speed(int speed) int ft2232_register_commands(struct command_context_s *cmd_ctx) { register_command(cmd_ctx, NULL, "ft2232_device_desc", ft2232_handle_device_desc_command, - COMMAND_CONFIG, NULL); + COMMAND_CONFIG, "the USB device description of the FTDI FT2232 device"); register_command(cmd_ctx, NULL, "ft2232_serial", ft2232_handle_serial_command, - COMMAND_CONFIG, NULL); + COMMAND_CONFIG, "the serial number of the FTDI FT2232 device"); register_command(cmd_ctx, NULL, "ft2232_layout", ft2232_handle_layout_command, - COMMAND_CONFIG, NULL); + COMMAND_CONFIG, "the layout of the FT2232 GPIO signals used to control output-enables and reset signals"); register_command(cmd_ctx, NULL, "ft2232_vid_pid", ft2232_handle_vid_pid_command, - COMMAND_CONFIG, NULL); + COMMAND_CONFIG, "the vendor ID and product ID of the FTDI FT2232 device"); + register_command(cmd_ctx, NULL, "ft2232_latency", ft2232_handle_latency_command, + COMMAND_CONFIG, "set the FT2232 latency timer to a new value"); return ERROR_OK; } @@ -279,7 +337,7 @@ void ft2232_end_state(enum tap_state state) end_state = state; else { - ERROR("BUG: %i is not a valid end state", state); + LOG_ERROR("BUG: %i is not a valid end state", state); exit(-1); } } @@ -319,13 +377,13 @@ void ft2232_debug_dump_buffer(void) line_p += snprintf(line_p, 256 - (line_p - line), "%2.2x ", ft2232_buffer[i]); if (i % 16 == 15) { - DEBUG("%s", line); + LOG_DEBUG("%s", line); line_p = line; } } if (line_p != line) - DEBUG("%s", line); + LOG_DEBUG("%s", line); } int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last) @@ -344,7 +402,7 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last) #endif #ifdef _DEBUG_USB_COMMS_ - DEBUG("write buffer (size %i):", ft2232_buffer_size); + LOG_DEBUG("write buffer (size %i):", ft2232_buffer_size); ft2232_debug_dump_buffer(); #endif @@ -354,8 +412,8 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last) if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK) { - ERROR("couldn't write MPSSE commands to FT2232"); - exit(-1); + LOG_ERROR("couldn't write MPSSE commands to FT2232"); + return retval; } #ifdef _DEBUG_USB_IO_ @@ -373,8 +431,8 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last) if ((retval = ft2232_read(ft2232_buffer, ft2232_expect_read, &bytes_read)) != ERROR_OK) { - ERROR("couldn't read from FT2232"); - exit(-1); + LOG_ERROR("couldn't read from FT2232"); + return retval; } #ifdef _DEBUG_USB_IO_ @@ -384,7 +442,7 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last) timeval_subtract(&d_inter2, &inter2, &start); timeval_subtract(&d_end, &end, &start); - INFO("inter: %i.%i, inter2: %i.%i end: %i.%i", d_inter.tv_sec, d_inter.tv_usec, d_inter2.tv_sec, d_inter2.tv_usec, d_end.tv_sec, d_end.tv_usec); + LOG_INFO("inter: %i.%i, inter2: %i.%i end: %i.%i", d_inter.tv_sec, d_inter.tv_usec, d_inter2.tv_sec, d_inter2.tv_usec, d_end.tv_sec, d_end.tv_usec); #endif @@ -392,14 +450,14 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last) if (ft2232_expect_read != ft2232_buffer_size) { - ERROR("ft2232_expect_read (%i) != ft2232_buffer_size (%i) (%i retries)", ft2232_expect_read, ft2232_buffer_size, 100 - timeout); + LOG_ERROR("ft2232_expect_read (%i) != ft2232_buffer_size (%i) (%i retries)", ft2232_expect_read, ft2232_buffer_size, 100 - timeout); ft2232_debug_dump_buffer(); exit(-1); } #ifdef _DEBUG_USB_COMMS_ - DEBUG("read buffer (%i retries): %i bytes", 100 - timeout, ft2232_buffer_size); + LOG_DEBUG("read buffer (%i retries): %i bytes", 100 - timeout, ft2232_buffer_size); ft2232_debug_dump_buffer(); #endif } @@ -449,15 +507,17 @@ void ft2232_add_pathmove(pathmove_command_t *cmd) state_count = 0; while (num_states) { - tms_byte = 0x0; int bit_count = 0; + int num_states_batch = num_states > 7 ? 7 : num_states; + + tms_byte = 0x0; /* command "Clock Data to TMS/CS Pin (no Read)" */ BUFFER_ADD = 0x4b; /* number of states remaining */ - BUFFER_ADD = (num_states % 7) - 1; + BUFFER_ADD = num_states_batch - 1; - while (num_states % 7) + while (num_states_batch--) { if (tap_transitions[cur_state].low == cmd->path[state_count]) buf_set_u32(&tms_byte, bit_count++, 1, 0x0); @@ -465,7 +525,7 @@ void ft2232_add_pathmove(pathmove_command_t *cmd) buf_set_u32(&tms_byte, bit_count++, 1, 0x1); else { - ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[cmd->path[state_count]]); + LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[cmd->path[state_count]]); exit(-1); } @@ -504,7 +564,7 @@ void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size BUFFER_ADD = TAP_MOVE(cur_state, TAP_SD); cur_state = TAP_SD; } - //DEBUG("added TMS scan (no read)"); + /* LOG_DEBUG("added TMS scan (no read)"); */ } /* add command for complete bytes */ @@ -515,19 +575,19 @@ void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size { /* Clock Data Bytes In and Out LSB First */ BUFFER_ADD = 0x39; - //DEBUG("added TDI bytes (io %i)", num_bytes); + /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */ } else if (type == SCAN_OUT) { /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */ BUFFER_ADD = 0x19; - //DEBUG("added TDI bytes (o)"); + /* LOG_DEBUG("added TDI bytes (o)"); */ } else if (type == SCAN_IN) { /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */ BUFFER_ADD = 0x28; - //DEBUG("added TDI bytes (i %i)", num_bytes); + /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */ } thisrun_bytes = (num_bytes > 65537) ? 65536 : (num_bytes - 1); num_bytes -= thisrun_bytes; @@ -562,19 +622,19 @@ void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size { /* Clock Data Bits In and Out LSB First */ BUFFER_ADD = 0x3b; - //DEBUG("added TDI bits (io) %i", bits_left - 1); + /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */ } else if (type == SCAN_OUT) { /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */ BUFFER_ADD = 0x1b; - //DEBUG("added TDI bits (o)"); + /* LOG_DEBUG("added TDI bits (o)"); */ } else if (type == SCAN_IN) { /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */ BUFFER_ADD = 0x2a; - //DEBUG("added TDI bits (i %i)", bits_left - 1); + /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */ } BUFFER_ADD = bits_left - 2; if (type != SCAN_IN) @@ -588,19 +648,19 @@ void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size { /* Clock Data Bits In and Out LSB First */ BUFFER_ADD = 0x3b; - //DEBUG("added TDI bits (io) %i", bits_left - 1); + /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */ } else if (type == SCAN_OUT) { /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */ BUFFER_ADD = 0x1b; - //DEBUG("added TDI bits (o)"); + /* LOG_DEBUG("added TDI bits (o)"); */ } else if (type == SCAN_IN) { /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */ BUFFER_ADD = 0x2a; - //DEBUG("added TDI bits (i %i)", bits_left - 1); + /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */ } BUFFER_ADD = 0x0; BUFFER_ADD = last_bit; @@ -612,13 +672,13 @@ void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size { /* Clock Data to TMS/CS Pin with Read */ BUFFER_ADD = 0x6b; - //DEBUG("added TMS scan (read)"); + /* LOG_DEBUG("added TMS scan (read)"); */ } else { /* Clock Data to TMS/CS Pin (no Read) */ BUFFER_ADD = 0x4b; - //DEBUG("added TMS scan (no read)"); + /* LOG_DEBUG("added TMS scan (no read)"); */ } BUFFER_ADD = 0x6; BUFFER_ADD = TAP_MOVE(cur_state, end_state) | (last_bit << 7); @@ -641,7 +701,7 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int if (cmd->ir_scan) { - ERROR("BUG: large IR scans are not supported"); + LOG_ERROR("BUG: large IR scans are not supported"); exit(-1); } @@ -658,10 +718,10 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK) { - ERROR("couldn't write MPSSE commands to FT2232"); + LOG_ERROR("couldn't write MPSSE commands to FT2232"); exit(-1); } - DEBUG("ft2232_buffer_size: %i, bytes_written: %i", ft2232_buffer_size, bytes_written); + LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i", ft2232_buffer_size, bytes_written); ft2232_buffer_size = 0; /* add command for complete bytes */ @@ -673,19 +733,19 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int { /* Clock Data Bytes In and Out LSB First */ BUFFER_ADD = 0x39; - //DEBUG("added TDI bytes (io %i)", num_bytes); + /* LOG_DEBUG("added TDI bytes (io %i)", num_bytes); */ } else if (type == SCAN_OUT) { /* Clock Data Bytes Out on -ve Clock Edge LSB First (no Read) */ BUFFER_ADD = 0x19; - //DEBUG("added TDI bytes (o)"); + /* LOG_DEBUG("added TDI bytes (o)"); */ } else if (type == SCAN_IN) { /* Clock Data Bytes In on +ve Clock Edge LSB First (no Write) */ BUFFER_ADD = 0x28; - //DEBUG("added TDI bytes (i %i)", num_bytes); + /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */ } thisrun_bytes = (num_bytes > 65537) ? 65536 : (num_bytes - 1); thisrun_read = thisrun_bytes; @@ -709,20 +769,20 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK) { - ERROR("couldn't write MPSSE commands to FT2232"); + LOG_ERROR("couldn't write MPSSE commands to FT2232"); exit(-1); } - DEBUG("ft2232_buffer_size: %i, bytes_written: %i", ft2232_buffer_size, bytes_written); + LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i", ft2232_buffer_size, bytes_written); ft2232_buffer_size = 0; if (type != SCAN_OUT) { if ((retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read)) != ERROR_OK) { - ERROR("couldn't read from FT2232"); + LOG_ERROR("couldn't read from FT2232"); exit(-1); } - DEBUG("thisrun_read: %i, bytes_read: %i", thisrun_read, bytes_read); + LOG_DEBUG("thisrun_read: %i, bytes_read: %i", thisrun_read, bytes_read); receive_pointer += bytes_read; } } @@ -742,19 +802,19 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int { /* Clock Data Bits In and Out LSB First */ BUFFER_ADD = 0x3b; - //DEBUG("added TDI bits (io) %i", bits_left - 1); + /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */ } else if (type == SCAN_OUT) { /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */ BUFFER_ADD = 0x1b; - //DEBUG("added TDI bits (o)"); + /* LOG_DEBUG("added TDI bits (o)"); */ } else if (type == SCAN_IN) { /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */ BUFFER_ADD = 0x2a; - //DEBUG("added TDI bits (i %i)", bits_left - 1); + /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */ } BUFFER_ADD = bits_left - 2; if (type != SCAN_IN) @@ -770,19 +830,19 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int { /* Clock Data Bits In and Out LSB First */ BUFFER_ADD = 0x3b; - //DEBUG("added TDI bits (io) %i", bits_left - 1); + /* LOG_DEBUG("added TDI bits (io) %i", bits_left - 1); */ } else if (type == SCAN_OUT) { /* Clock Data Bits Out on -ve Clock Edge LSB First (no Read) */ BUFFER_ADD = 0x1b; - //DEBUG("added TDI bits (o)"); + /* LOG_DEBUG("added TDI bits (o)"); */ } else if (type == SCAN_IN) { /* Clock Data Bits In on +ve Clock Edge LSB First (no Write) */ BUFFER_ADD = 0x2a; - //DEBUG("added TDI bits (i %i)", bits_left - 1); + /* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */ } BUFFER_ADD = 0x0; BUFFER_ADD = last_bit; @@ -794,13 +854,13 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int { /* Clock Data to TMS/CS Pin with Read */ BUFFER_ADD = 0x6b; - //DEBUG("added TMS scan (read)"); + /* LOG_DEBUG("added TMS scan (read)"); */ } else { /* Clock Data to TMS/CS Pin (no Read) */ BUFFER_ADD = 0x4b; - //DEBUG("added TMS scan (no read)"); + /* LOG_DEBUG("added TMS scan (no read)"); */ } BUFFER_ADD = 0x6; BUFFER_ADD = TAP_MOVE(cur_state, end_state) | (last_bit << 7); @@ -812,20 +872,20 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK) { - ERROR("couldn't write MPSSE commands to FT2232"); + LOG_ERROR("couldn't write MPSSE commands to FT2232"); exit(-1); } - DEBUG("ft2232_buffer_size: %i, bytes_written: %i", ft2232_buffer_size, bytes_written); + LOG_DEBUG("ft2232_buffer_size: %i, bytes_written: %i", ft2232_buffer_size, bytes_written); ft2232_buffer_size = 0; if (type != SCAN_OUT) { if ((retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read)) != ERROR_OK) { - ERROR("couldn't read from FT2232"); + LOG_ERROR("couldn't read from FT2232"); exit(-1); } - DEBUG("thisrun_read: %i, bytes_read: %i", thisrun_read, bytes_read); + LOG_DEBUG("thisrun_read: %i, bytes_read: %i", thisrun_read, bytes_read); receive_pointer += bytes_read; } @@ -872,7 +932,7 @@ int ft2232_predict_scan_in(int scan_size, enum scan_type type) predicted_size += 1; } - //DEBUG("scan_size: %i, predicted_size: %i", scan_size, predicted_size); + /* LOG_DEBUG("scan_size: %i, predicted_size: %i", scan_size, predicted_size); */ return predicted_size; } @@ -881,7 +941,6 @@ void usbjtag_reset(int trst, int srst) { if (trst == 1) { - cur_state = TAP_TLR; if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) low_direction |= nTRSTnOE; /* switch to output pin (output is low) */ else @@ -921,7 +980,6 @@ void jtagkey_reset(int trst, int srst) { if (trst == 1) { - cur_state = TAP_TLR; if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) high_output &= ~nTRSTnOE; else @@ -954,14 +1012,13 @@ void jtagkey_reset(int trst, int srst) BUFFER_ADD = 0x82; BUFFER_ADD = high_output; BUFFER_ADD = high_direction; - DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction); + LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction); } void olimex_jtag_reset(int trst, int srst) { if (trst == 1) { - cur_state = TAP_TLR; if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) high_output &= ~nTRSTnOE; else @@ -975,27 +1032,54 @@ void olimex_jtag_reset(int trst, int srst) high_output |= nTRST; } - if (srst == 1) - { - high_output |= nSRST; - } - else if (srst == 0) - { - high_output &= ~nSRST; - } - - /* command "set data bits high byte" */ - BUFFER_ADD = 0x82; - BUFFER_ADD = high_output; - BUFFER_ADD = high_direction; - DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction); + if (srst == 1) + { + high_output |= nSRST; + } + else if (srst == 0) + { + high_output &= ~nSRST; + } + + /* command "set data bits high byte" */ + BUFFER_ADD = 0x82; + BUFFER_ADD = high_output; + BUFFER_ADD = high_direction; + LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction); } -void m5960_reset(int trst, int srst) +void axm0432_jtag_reset(int trst, int srst) { if (trst == 1) { cur_state = TAP_TLR; + 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_ADD = 0x82; + BUFFER_ADD = high_output; + BUFFER_ADD = high_direction; + LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction); +} + +void flyswatter_reset(int trst, int srst) +{ + if (trst == 1) + { low_output &= ~nTRST; } else if (trst == 0) @@ -1003,20 +1087,20 @@ void m5960_reset(int trst, int srst) low_output |= nTRST; } - if (srst == 1) - { - low_output |= nSRST; - } - else if (srst == 0) - { - low_output &= ~nSRST; - } - - /* command "set data bits low byte" */ - BUFFER_ADD = 0x80; - BUFFER_ADD = low_output; - BUFFER_ADD = low_direction; - DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction); + if (srst == 1) + { + low_output |= nSRST; + } + else if (srst == 0) + { + low_output &= ~nSRST; + } + + /* command "set data bits low byte" */ + BUFFER_ADD = 0x80; + BUFFER_ADD = low_output; + BUFFER_ADD = low_direction; + LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction); } void turtle_reset(int trst, int srst) @@ -1036,14 +1120,13 @@ void turtle_reset(int trst, int srst) BUFFER_ADD = 0x80; BUFFER_ADD = low_output; BUFFER_ADD = low_direction; - DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", srst, low_output, low_direction); + LOG_DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", srst, low_output, low_direction); } void comstick_reset(int trst, int srst) { if (trst == 1) { - cur_state = TAP_TLR; high_output &= ~nTRST; } else if (trst == 0) @@ -1051,20 +1134,52 @@ void comstick_reset(int trst, int srst) high_output |= nTRST; } - if (srst == 1) - { - high_output &= ~nSRST; - } - else if (srst == 0) - { - high_output |= nSRST; - } + if (srst == 1) + { + high_output &= ~nSRST; + } + else if (srst == 0) + { + high_output |= nSRST; + } /* command "set data bits high byte" */ BUFFER_ADD = 0x82; BUFFER_ADD = high_output; BUFFER_ADD = high_direction; - DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction); + LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction); +} + +void stm32stick_reset(int trst, int srst) +{ + if (trst == 1) + { + high_output &= ~nTRST; + } + else if (trst == 0) + { + high_output |= nTRST; + } + + if (srst == 1) + { + low_output &= ~nSRST; + } + else if (srst == 0) + { + low_output |= nSRST; + } + + /* command "set data bits low byte" */ + BUFFER_ADD = 0x80; + BUFFER_ADD = low_output; + BUFFER_ADD = low_direction; + + /* command "set data bits high byte" */ + BUFFER_ADD = 0x82; + BUFFER_ADD = high_output; + BUFFER_ADD = high_direction; + LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction); } int ft2232_execute_queue() @@ -1110,11 +1225,15 @@ int ft2232_execute_queue() first_unsent = cmd; } + if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST))) + { + cur_state = TAP_TLR; + } layout->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst); require_send = 1; #ifdef _DEBUG_JTAG_IO_ - DEBUG("trst: %i, srst: %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst); + LOG_DEBUG("trst: %i, srst: %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst); #endif break; case JTAG_RUNTEST: @@ -1156,7 +1275,7 @@ int ft2232_execute_queue() BUFFER_ADD = 0x0; cur_state = TAP_RTI; i -= (i > 7) ? 7 : i; - //DEBUG("added TMS scan (no read)"); + /* LOG_DEBUG("added TMS scan (no read)"); */ } if (cmd->cmd.runtest->end_state != -1) ft2232_end_state(cmd->cmd.runtest->end_state); @@ -1169,11 +1288,11 @@ int ft2232_execute_queue() /* TMS data bits */ BUFFER_ADD = TAP_MOVE(cur_state, end_state); cur_state = end_state; - //DEBUG("added TMS scan (no read)"); + /* LOG_DEBUG("added TMS scan (no read)"); */ } require_send = 1; #ifdef _DEBUG_JTAG_IO_ - DEBUG("runtest: %i, end in %i", cmd->cmd.runtest->num_cycles, end_state); + LOG_DEBUG("runtest: %i, end in %i", cmd->cmd.runtest->num_cycles, end_state); #endif break; case JTAG_STATEMOVE: @@ -1194,11 +1313,11 @@ int ft2232_execute_queue() BUFFER_ADD = 0x6; /* TMS data bits */ BUFFER_ADD = TAP_MOVE(cur_state, end_state); - //DEBUG("added TMS scan (no read)"); + /* LOG_DEBUG("added TMS scan (no read)"); */ cur_state = end_state; require_send = 1; #ifdef _DEBUG_JTAG_IO_ - DEBUG("statemove: %i", end_state); + LOG_DEBUG("statemove: %i", end_state); #endif break; case JTAG_PATHMOVE: @@ -1214,7 +1333,7 @@ int ft2232_execute_queue() ft2232_add_pathmove(cmd->cmd.pathmove); require_send = 1; #ifdef _DEBUG_JTAG_IO_ - DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); + LOG_DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); #endif break; case JTAG_SCAN: @@ -1223,7 +1342,7 @@ int ft2232_execute_queue() predicted_size = ft2232_predict_scan_out(scan_size, type); if ((predicted_size + 1) > FT2232_BUFFER_SIZE) { - DEBUG("oversized ft2232 scan (predicted_size > FT2232_BUFFER_SIZE)"); + LOG_DEBUG("oversized ft2232 scan (predicted_size > FT2232_BUFFER_SIZE)"); /* unsent commands before this */ if (first_unsent != cmd) if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK) @@ -1241,14 +1360,14 @@ int ft2232_execute_queue() } else if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) { - DEBUG("ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)", first_unsent, cmd); + LOG_DEBUG("ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)", first_unsent, cmd); if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK) retval = ERROR_JTAG_QUEUE_FAILED; require_send = 0; first_unsent = cmd; } ft2232_expect_read += ft2232_predict_scan_in(scan_size, type); - //DEBUG("new read size: %i", ft2232_expect_read); + /* LOG_DEBUG("new read size: %i", ft2232_expect_read); */ if (cmd->cmd.scan->end_state != -1) ft2232_end_state(cmd->cmd.scan->end_state); ft2232_add_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size); @@ -1256,7 +1375,7 @@ int ft2232_execute_queue() if (buffer) free(buffer); #ifdef _DEBUG_JTAG_IO_ - DEBUG("%s scan, %i bit, end in %i", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size, end_state); + LOG_DEBUG("%s scan, %i bit, end in %i", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size, end_state); #endif break; case JTAG_SLEEP: @@ -1265,11 +1384,11 @@ int ft2232_execute_queue() first_unsent = cmd->next; jtag_sleep(cmd->cmd.sleep->us); #ifdef _DEBUG_JTAG_IO_ - DEBUG("sleep %i usec", cmd->cmd.sleep->us); + LOG_DEBUG("sleep %i usec", cmd->cmd.sleep->us); #endif break; default: - ERROR("BUG: unknown JTAG command type encountered"); + LOG_ERROR("BUG: unknown JTAG command type encountered"); exit(-1); } cmd = cmd->next; @@ -1290,21 +1409,19 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more) char *openex_string = NULL; u8 latency_timer; - DEBUG("'ft2232' interface using FTD2XX with '%s' layout (%4.4x:%4.4x)", - ft2232_layout, vid, pid); + LOG_DEBUG("'ft2232' interface using FTD2XX with '%s' layout (%4.4x:%4.4x)",ft2232_layout, vid, pid); #if IS_WIN32 == 0 /* Add non-standard Vid/Pid to the linux driver */ if ((status = FT_SetVIDPID(vid, pid)) != FT_OK) { - WARNING("couldn't add %4.4x:%4.4x", - vid, pid); + LOG_WARNING("couldn't add %4.4x:%4.4x", vid, pid); } #endif if (ft2232_device_desc && ft2232_serial) { - WARNING("can't open by device description and serial number, giving precedence to serial"); + LOG_WARNING("can't open by device description and serial number, giving precedence to serial"); ft2232_device_desc = NULL; } @@ -1320,8 +1437,8 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more) } else { - ERROR("neither device description nor serial number specified"); - ERROR("please add \"ft2232_device_desc \" or \"ft2232_serial \" to your .cfg file"); + LOG_ERROR("neither device description nor serial number specified"); + LOG_ERROR("please add \"ft2232_device_desc \" or \"ft2232_serial \" to your .cfg file"); return ERROR_JTAG_INIT_FAILED; } @@ -1331,12 +1448,11 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more) DWORD num_devices; if (more) { - WARNING("unable to open ftdi device (trying more): %lu", - status); + LOG_WARNING("unable to open ftdi device (trying more): %lu", status); *try_more = 1; return ERROR_JTAG_INIT_FAILED; } - ERROR("unable to open ftdi device: %lu", status); + LOG_ERROR("unable to open ftdi device: %lu", status); status = FT_ListDevices(&num_devices, NULL, FT_LIST_NUMBER_ONLY); if (status == FT_OK) { @@ -1351,9 +1467,9 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more) if (status == FT_OK) { - ERROR("ListDevices: %lu\n", num_devices); + LOG_ERROR("ListDevices: %lu\n", num_devices); for (i = 0; i < num_devices; i++) - ERROR("%i: %s", i, desc_array[i]); + LOG_ERROR("%i: %s", i, desc_array[i]); } for (i = 0; i < num_devices; i++) @@ -1362,36 +1478,36 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more) } else { - printf("ListDevices: NONE\n"); + LOG_ERROR("ListDevices: NONE\n"); } return ERROR_JTAG_INIT_FAILED; } - if ((status = FT_SetLatencyTimer(ftdih, 2)) != FT_OK) + if ((status = FT_SetLatencyTimer(ftdih, ft2232_latency)) != FT_OK) { - ERROR("unable to set latency timer: %lu", status); + LOG_ERROR("unable to set latency timer: %lu", status); return ERROR_JTAG_INIT_FAILED; } if ((status = FT_GetLatencyTimer(ftdih, &latency_timer)) != FT_OK) { - ERROR("unable to get latency timer: %lu", status); + LOG_ERROR("unable to get latency timer: %lu", status); return ERROR_JTAG_INIT_FAILED; } else { - DEBUG("current latency timer: %i", latency_timer); + LOG_DEBUG("current latency timer: %i", latency_timer); } if ((status = FT_SetTimeouts(ftdih, 5000, 5000)) != FT_OK) { - ERROR("unable to set timeouts: %lu", status); + LOG_ERROR("unable to set timeouts: %lu", status); return ERROR_JTAG_INIT_FAILED; } if ((status = FT_SetBitMode(ftdih, 0x0b, 2)) != FT_OK) { - ERROR("unable to enable bit i/o mode: %lu", status); + LOG_ERROR("unable to enable bit i/o mode: %lu", status); return ERROR_JTAG_INIT_FAILED; } @@ -1404,7 +1520,7 @@ static int ft2232_purge_ftd2xx(void) if ((status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX)) != FT_OK) { - ERROR("error purging ftd2xx device: %lu", status); + LOG_ERROR("error purging ftd2xx device: %lu", status); return ERROR_JTAG_INIT_FAILED; } @@ -1417,50 +1533,50 @@ static int ft2232_init_libftdi(u16 vid, u16 pid, int more, int *try_more) { u8 latency_timer; - DEBUG("'ft2232' interface using libftdi with '%s' layout (%4.4x:%4.4x)", - ft2232_layout, vid, pid); + LOG_DEBUG("'ft2232' interface using libftdi with '%s' layout (%4.4x:%4.4x)", + ft2232_layout, vid, pid); if (ftdi_init(&ftdic) < 0) return ERROR_JTAG_INIT_FAILED; /* context, vendor id, product id */ if (ftdi_usb_open_desc(&ftdic, vid, pid, ft2232_device_desc, - ft2232_serial) < 0) { + ft2232_serial) < 0) { if (more) - WARNING("unable to open ftdi device (trying more): %s", - ftdic.error_str); + LOG_WARNING("unable to open ftdi device (trying more): %s", + ftdic.error_str); else - ERROR("unable to open ftdi device: %s", ftdic.error_str); + LOG_ERROR("unable to open ftdi device: %s", ftdic.error_str); *try_more = 1; return ERROR_JTAG_INIT_FAILED; } if (ftdi_set_interface(&ftdic, INTERFACE_A) < 0) { - ERROR("unable to select FT2232 channel A: %s", ftdic.error_str); + LOG_ERROR("unable to select FT2232 channel A: %s", ftdic.error_str); return ERROR_JTAG_INIT_FAILED; } if (ftdi_usb_reset(&ftdic) < 0) { - ERROR("unable to reset ftdi device"); + LOG_ERROR("unable to reset ftdi device"); return ERROR_JTAG_INIT_FAILED; } - if (ftdi_set_latency_timer(&ftdic, 2) < 0) + if (ftdi_set_latency_timer(&ftdic, ft2232_latency) < 0) { - ERROR("unable to set latency timer"); + LOG_ERROR("unable to set latency timer"); return ERROR_JTAG_INIT_FAILED; } if (ftdi_get_latency_timer(&ftdic, &latency_timer) < 0) { - ERROR("unable to get latency timer"); + LOG_ERROR("unable to get latency timer"); return ERROR_JTAG_INIT_FAILED; } else { - DEBUG("current latency timer: %i", latency_timer); + LOG_DEBUG("current latency timer: %i", latency_timer); } ftdi_set_bitmode(&ftdic, 0x0b, 2); /* ctx, JTAG I/O mask */ @@ -1472,7 +1588,7 @@ static int ft2232_purge_libftdi(void) { if (ftdi_usb_purge_buffers(&ftdic) < 0) { - ERROR("ftdi_purge_buffers: %s", ftdic.error_str); + LOG_ERROR("ftdi_purge_buffers: %s", ftdic.error_str); return ERROR_JTAG_INIT_FAILED; } @@ -1491,7 +1607,7 @@ int ft2232_init(void) if ((ft2232_layout == NULL) || (ft2232_layout[0] == 0)) { ft2232_layout = "usbjtag"; - WARNING("No ft2232 layout specified, using default 'usbjtag'"); + LOG_WARNING("No ft2232 layout specified, using default 'usbjtag'"); } while (cur_layout->name) @@ -1506,7 +1622,7 @@ int ft2232_init(void) if (!layout) { - ERROR("No matching layout found for %s", ft2232_layout); + LOG_ERROR("No matching layout found for %s", ft2232_layout); return ERROR_JTAG_INIT_FAILED; } @@ -1525,10 +1641,10 @@ int ft2232_init(void) #if BUILD_FT2232_FTD2XX == 1 retval = ft2232_init_ftd2xx(ft2232_vid[i], ft2232_pid[i], - more, &try_more); + more, &try_more); #elif BUILD_FT2232_LIBFTDI == 1 retval = ft2232_init_libftdi(ft2232_vid[i], ft2232_pid[i], - more, &try_more); + more, &try_more); #endif if (retval >= 0) break; @@ -1547,7 +1663,7 @@ int ft2232_init(void) buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */ if (((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK) || (bytes_written != 1)) { - ERROR("couldn't write to FT2232 to disable loopback"); + LOG_ERROR("couldn't write to FT2232 to disable loopback"); return ERROR_JTAG_INIT_FAILED; } @@ -1593,7 +1709,7 @@ int usbjtag_init(void) } else { - ERROR("BUG: usbjtag_init called for unknown layout '%s'", ft2232_layout); + LOG_ERROR("BUG: usbjtag_init called for unknown layout '%s'", ft2232_layout); return ERROR_JTAG_INIT_FAILED; } @@ -1623,14 +1739,83 @@ int usbjtag_init(void) 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 */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) + { + LOG_ERROR("couldn't initialize FT2232 with 'USBJTAG' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + return ERROR_OK; +} + +int axm0432_jtag_init(void) +{ + u8 buf[3]; + u32 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)) { - ERROR("couldn't initialize FT2232 with 'USBJTAG' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); return ERROR_JTAG_INIT_FAILED; } + if (strcmp(layout->name, "axm0432_jtag") == 0) + { + nTRST = 0x08; + nTRSTnOE = 0x0; /* No output enable for TRST*/ + nSRST = 0x04; + nSRSTnOE = 0x0; /* No output enable for SRST*/ + } + else + { + LOG_ERROR("BUG: axm0432_jtag_init called for non axm0432 layout"); + exit(-1); + } + + high_output = 0x0; + high_direction = 0x0c; + + if (jtag_reset_config & RESET_TRST_OPEN_DRAIN) + { + LOG_ERROR("can't set nTRSTOE to push-pull on the Dicarlo jtag"); + } + else + { + high_output |= nTRST; + } + + if (jtag_reset_config & RESET_SRST_PUSH_PULL) + { + LOG_ERROR("can't set nSRST to push-pull on the Dicarlo jtag"); + } + else + { + 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)) + { + LOG_ERROR("couldn't initialize FT2232 with 'Dicarlo' layout"); + return ERROR_JTAG_INIT_FAILED; + } + return ERROR_OK; } @@ -1646,11 +1831,11 @@ int jtagkey_init(void) 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 */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -1671,7 +1856,7 @@ int jtagkey_init(void) } else { - ERROR("BUG: jtagkey_init called for non jtagkey layout"); + LOG_ERROR("BUG: jtagkey_init called for non jtagkey layout"); exit(-1); } @@ -1704,11 +1889,11 @@ int jtagkey_init(void) buf[0] = 0x82; /* command "set data bits high byte" */ buf[1] = high_output; /* value */ buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -1727,11 +1912,11 @@ int olimex_jtag_init(void) 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 */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -1756,7 +1941,7 @@ int olimex_jtag_init(void) if (jtag_reset_config & RESET_SRST_PUSH_PULL) { - ERROR("can't set nSRST to push-pull on the Olimex ARM-USB-OCD"); + LOG_ERROR("can't set nSRST to push-pull on the Olimex ARM-USB-OCD"); } else { @@ -1770,18 +1955,18 @@ int olimex_jtag_init(void) buf[0] = 0x82; /* command "set data bits high byte" */ buf[1] = high_output; /* value */ buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout"); return ERROR_JTAG_INIT_FAILED; } return ERROR_OK; } -int m5960_init(void) +int flyswatter_init(void) { u8 buf[3]; u32 bytes_written; @@ -1793,11 +1978,11 @@ int m5960_init(void) 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 */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't initialize FT2232 with 'm5960' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -1816,11 +2001,11 @@ int m5960_init(void) buf[0] = 0x82; /* command "set data bits high byte" */ buf[1] = high_output; /* value */ buf[2] = high_direction; /* all outputs (xRST and xRSTnOE) */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't initialize FT2232 with 'm5960' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -1839,16 +2024,16 @@ int turtle_init(void) 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 */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't initialize FT2232 with 'turtelizer2' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout"); return ERROR_JTAG_INIT_FAILED; } nSRST = 0x40; - + high_output = 0x00; high_direction = 0x0C; @@ -1856,11 +2041,11 @@ int turtle_init(void) buf[0] = 0x82; /* command "set data bits high byte" */ buf[1] = high_output; buf[2] = high_direction; - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't initialize FT2232 with 'turtelizer2' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -1879,11 +2064,11 @@ int comstick_init(void) 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 */ - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) { - ERROR("couldn't initialize FT2232 with 'comstick' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -1891,7 +2076,7 @@ int comstick_init(void) nTRSTnOE = 0x00; /* no output enable for nTRST */ nSRST = 0x02; nSRSTnOE = 0x00; /* no output enable for nSRST */ - + high_output = 0x03; high_direction = 0x03; @@ -1899,11 +2084,54 @@ int comstick_init(void) buf[0] = 0x82; /* command "set data bits high byte" */ buf[1] = high_output; buf[2] = high_direction; - DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + 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)) + { + LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + return ERROR_OK; +} + +int stm32stick_init(void) +{ + u8 buf[3]; + u32 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)) + { + LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + nTRST = 0x01; + nTRSTnOE = 0x00; /* no output enable for nTRST */ + nSRST = 0x80; + nSRSTnOE = 0x00; /* no output enable for nSRST */ + + 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)) { - ERROR("couldn't initialize FT2232 with 'comstick' layout"); + LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout"); return ERROR_JTAG_INIT_FAILED; } @@ -1950,7 +2178,6 @@ void turtle_jtag_blink(void) BUFFER_ADD = high_direction; } - int ft2232_quit(void) { #if BUILD_FT2232_FTD2XX == 1 @@ -1966,6 +2193,7 @@ int ft2232_quit(void) #endif free(ft2232_buffer); + ft2232_buffer = NULL; return ERROR_OK; } @@ -1978,7 +2206,7 @@ int ft2232_handle_device_desc_command(struct command_context_s *cmd_ctx, char *c } else { - ERROR("expected exactly one argument to ft2232_device_desc "); + LOG_ERROR("expected exactly one argument to ft2232_device_desc "); } return ERROR_OK; @@ -1992,7 +2220,7 @@ int ft2232_handle_serial_command(struct command_context_s *cmd_ctx, char *cmd, c } else { - ERROR("expected exactly one argument to ft2232_serial "); + LOG_ERROR("expected exactly one argument to ft2232_serial "); } return ERROR_OK; @@ -2014,13 +2242,13 @@ int ft2232_handle_vid_pid_command(struct command_context_s *cmd_ctx, char *cmd, int i; if (argc > MAX_USB_IDS*2) { - WARNING("ignoring extra IDs in ft2232_vid_pid " - "(maximum is %d pairs)", MAX_USB_IDS); + LOG_WARNING("ignoring extra IDs in ft2232_vid_pid " + "(maximum is %d pairs)", MAX_USB_IDS); argc = MAX_USB_IDS*2; } if (argc < 2 || (argc & 1)) { - WARNING("incomplete ft2232_vid_pid configuration directive"); + LOG_WARNING("incomplete ft2232_vid_pid configuration directive"); if (argc < 2) return ERROR_OK; } @@ -2037,3 +2265,17 @@ int ft2232_handle_vid_pid_command(struct command_context_s *cmd_ctx, char *cmd, return ERROR_OK; } + +int ft2232_handle_latency_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + if (argc == 1) + { + ft2232_latency = atoi(args[0]); + } + else + { + LOG_ERROR("expected exactly one argument to ft2232_latency "); + } + + return ERROR_OK; +}