X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fft2232.c;h=5a8a44e387cee3c9eeb40988ee491e4cf33410af;hb=8dab0ecf2334330cd470f3fa483aadf78ee2a543;hp=43c6f1692b1a3738cd08fe15097aab516217c049;hpb=ce55905fb789e80a2b6fa94150dd447d0c6fd175;p=openocd.git diff --git a/src/jtag/ft2232.c b/src/jtag/ft2232.c index 43c6f1692b..5a8a44e387 100644 --- a/src/jtag/ft2232.c +++ b/src/jtag/ft2232.c @@ -40,6 +40,7 @@ #endif /* project specific includes */ +#define INCLUDE_JTAG_INTERFACE_H #include "jtag.h" #include "time_support.h" @@ -124,6 +125,7 @@ static int stm32stick_init(void); static int axm0432_jtag_init(void); static int sheevaplug_init(void); static int icebear_jtag_init(void); +static int cortino_jtag_init(void); /* reset procedures for supported layouts */ static void usbjtag_reset(int trst, int srst); @@ -156,8 +158,9 @@ ft2232_layout_t ft2232_layouts[] = { "comstick", comstick_init, comstick_reset, NULL }, { "stm32stick", stm32stick_init, stm32stick_reset, NULL }, { "axm0432_jtag", axm0432_jtag_init, axm0432_jtag_reset, NULL }, - {"sheevaplug", sheevaplug_init, sheevaplug_reset, NULL }, + { "sheevaplug", sheevaplug_init, sheevaplug_reset, NULL }, { "icebear", icebear_jtag_init, icebear_jtag_reset, NULL }, + { "cortino", cortino_jtag_init, comstick_reset, NULL }, { NULL, NULL, NULL, NULL }, }; @@ -446,7 +449,7 @@ static int ft2232_khz(int khz, int* jtag_speed) { if (khz==0) { - LOG_ERROR("RCLK not supported"); + LOG_DEBUG("RTCK not supported"); return ERROR_FAIL; } @@ -510,7 +513,6 @@ void ft2232_end_state(tap_state_t state) } } - static void ft2232_read_scan(enum scan_type type, u8* buffer, int scan_size) { int num_bytes = (scan_size + 7) / 8; @@ -1410,20 +1412,6 @@ static void sheevaplug_reset(int trst, int srst) LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction); } -static int ft2232_execute_end_state(jtag_command_t *cmd) -{ - int retval; - retval = ERROR_OK; - - DEBUG_JTAG_IO("execute_end_state: %s", tap_state_name(cmd->cmd.end_state->end_state) ); - - if (cmd->cmd.end_state->end_state != TAP_INVALID) - ft2232_end_state(cmd->cmd.end_state->end_state); - - return retval; -} - - static int ft2232_execute_runtest(jtag_command_t *cmd) { int retval; @@ -1440,9 +1428,9 @@ static int ft2232_execute_runtest(jtag_command_t *cmd) if (tap_get_state() != TAP_IDLE) predicted_size += 3; predicted_size += 3 * CEIL(cmd->cmd.runtest->num_cycles, 7); - if ( (cmd->cmd.runtest->end_state != TAP_INVALID) && (cmd->cmd.runtest->end_state != TAP_IDLE) ) + if ( cmd->cmd.runtest->end_state != TAP_IDLE) predicted_size += 3; - if ( (cmd->cmd.runtest->end_state == TAP_INVALID) && (tap_get_end_state() != TAP_IDLE) ) + if ( tap_get_end_state() != TAP_IDLE) predicted_size += 3; if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE) { @@ -1475,8 +1463,7 @@ static int ft2232_execute_runtest(jtag_command_t *cmd) /* LOG_DEBUG("added TMS scan (no read)"); */ } - if (cmd->cmd.runtest->end_state != TAP_INVALID) - ft2232_end_state(cmd->cmd.runtest->end_state); + ft2232_end_state(cmd->cmd.runtest->end_state); if ( tap_get_state() != tap_get_end_state() ) { @@ -1508,8 +1495,7 @@ static int ft2232_execute_statemove(jtag_command_t *cmd) require_send = 0; first_unsent = cmd; } - if (cmd->cmd.statemove->end_state != TAP_INVALID) - ft2232_end_state(cmd->cmd.statemove->end_state); + ft2232_end_state(cmd->cmd.statemove->end_state); /* move to end state */ if ( tap_get_state() != tap_get_end_state() ) @@ -1575,8 +1561,7 @@ static int ft2232_execute_scan(jtag_command_t *cmd) retval = ERROR_JTAG_QUEUE_FAILED; /* current command */ - if (cmd->cmd.scan->end_state != TAP_INVALID) - ft2232_end_state(cmd->cmd.scan->end_state); + ft2232_end_state(cmd->cmd.scan->end_state); ft2232_large_scan(cmd->cmd.scan, type, buffer, scan_size); require_send = 0; first_unsent = cmd->next; @@ -1596,8 +1581,7 @@ static int ft2232_execute_scan(jtag_command_t *cmd) } ft2232_expect_read += ft2232_predict_scan_in(scan_size, type); /* LOG_DEBUG("new read size: %i", ft2232_expect_read); */ - if (cmd->cmd.scan->end_state != TAP_INVALID) - ft2232_end_state(cmd->cmd.scan->end_state); + ft2232_end_state(cmd->cmd.scan->end_state); ft2232_add_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size); require_send = 1; if (buffer) @@ -1680,7 +1664,6 @@ static int ft2232_execute_command(jtag_command_t *cmd) switch (cmd->type) { - case JTAG_END_STATE: retval = ft2232_execute_end_state(cmd); break; case JTAG_RESET: retval = ft2232_execute_reset(cmd); break; case JTAG_RUNTEST: retval = ft2232_execute_runtest(cmd); break; case JTAG_STATEMOVE: retval = ft2232_execute_statemove(cmd); break; @@ -2576,6 +2559,49 @@ static int sheevaplug_init(void) return ERROR_OK; } +static int cortino_jtag_init(void) +{ + u8 buf[3]; + u32 bytes_written; + + low_output = 0x08; + low_direction = 0x1b; + + /* initialize low byte for jtag */ + buf[0] = 0x80; /* command "set data bits low byte" */ + buf[1] = low_output; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */ + buf[2] = low_direction; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */ + LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + + if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) ) + { + LOG_ERROR("couldn't initialize FT2232 with 'cortino' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + nTRST = 0x01; + nTRSTnOE = 0x00; /* no output enable for nTRST */ + nSRST = 0x02; + nSRSTnOE = 0x00; /* no output enable for nSRST */ + + high_output = 0x03; + high_direction = 0x03; + + /* initialize high port */ + buf[0] = 0x82; /* command "set data bits high byte" */ + buf[1] = high_output; + buf[2] = high_direction; + LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]); + + if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) ) + { + LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout"); + return ERROR_JTAG_INIT_FAILED; + } + + return ERROR_OK; +} + static void olimex_jtag_blink(void) { /* Olimex ARM-USB-OCD has a LED connected to ACBUS3