X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fjlink.c;h=96e4efd343d2290afa46bbc171599caae4759274;hb=04eecaac4aa6e8c39bf19bc46de5049f97c1bad5;hp=190ada4603ebf921c075fcd81bbf636a888e0ec0;hpb=b7dc652f11cbe0eea6e86f3b9d99cb16260ab3fb;p=openocd.git diff --git a/src/jtag/jlink.c b/src/jtag/jlink.c index 190ada4603..96e4efd343 100644 --- a/src/jtag/jlink.c +++ b/src/jtag/jlink.c @@ -51,8 +51,8 @@ #define JLINK_USB_TIMEOUT 100 -#define JLINK_IN_BUFFER_SIZE 2064 -#define JLINK_OUT_BUFFER_SIZE 2064 +#define JLINK_IN_BUFFER_SIZE 8192 +#define JLINK_OUT_BUFFER_SIZE 8192 #define JLINK_EMU_RESULT_BUFFER_SIZE 64 @@ -65,7 +65,7 @@ static u8 usb_emu_result_buffer[JLINK_EMU_RESULT_BUFFER_SIZE]; #define EMU_CMD_VERSION 0x01 #define EMU_CMD_SET_SPEED 0x05 #define EMU_CMD_GET_STATE 0x07 -#define EMU_CMD_HW_JTAG 0xcf +#define EMU_CMD_HW_JTAG3 0xcf #define EMU_CMD_HW_RESET0 0xdc #define EMU_CMD_HW_RESET1 0xdd #define EMU_CMD_HW_TRST0 0xde @@ -170,8 +170,7 @@ int jlink_execute_queue(void) break; case JTAG_STATEMOVE: - DEBUG_JTAG_IO("statemove end in %i", - cmd->cmd.statemove->end_state); + DEBUG_JTAG_IO("statemove end in %i", cmd->cmd.statemove->end_state); if (cmd->cmd.statemove->end_state != -1) { @@ -181,9 +180,9 @@ int jlink_execute_queue(void) break; case JTAG_PATHMOVE: - DEBUG_JTAG_IO("pathmove: %i states, end in %i", - cmd->cmd.pathmove->num_states, - cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); + DEBUG_JTAG_IO("pathmove: %i states, end in %i", \ + cmd->cmd.pathmove->num_states, \ + cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); jlink_path_move(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path); break; @@ -207,9 +206,7 @@ int jlink_execute_queue(void) break; case JTAG_RESET: - DEBUG_JTAG_IO("reset trst: %i srst %i", - cmd->cmd.reset->trst, - cmd->cmd.reset->srst); + DEBUG_JTAG_IO("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst); jlink_tap_execute(); @@ -447,22 +444,22 @@ void jlink_reset(int trst, int srst) LOG_DEBUG("trst: %i, srst: %i", trst, srst); /* Signals are active low */ - if (trst == 0) + if (srst == 0) { - jlink_simple_command(EMU_CMD_HW_TRST1); + jlink_simple_command(EMU_CMD_HW_RESET1); } - else if (trst == 1) + else if (srst == 1) { - jlink_simple_command(EMU_CMD_HW_TRST0); + jlink_simple_command(EMU_CMD_HW_RESET0); } - if (srst == 0) + if (trst == 0) { - jlink_simple_command(EMU_CMD_HW_RESET1); + jlink_simple_command(EMU_CMD_HW_TRST1); } - else if (srst == 1) + else if (trst == 1) { - jlink_simple_command(EMU_CMD_HW_RESET0); + jlink_simple_command(EMU_CMD_HW_TRST0); } } @@ -549,8 +546,8 @@ int jlink_handle_jlink_info_command(struct command_context_s *cmd_ctx, char *cmd /***************************************************************************/ /* J-Link tap functions */ -/* We use the maximal value observed */ -#define JLINK_TAP_BUFFER_SIZE 390 +/* 2048 is the max value we can use here */ +#define JLINK_TAP_BUFFER_SIZE 2048 static int tap_length; static u8 tms_buffer[JLINK_TAP_BUFFER_SIZE]; @@ -565,7 +562,7 @@ typedef struct u8 *buffer; } pending_scan_result_t; -#define MAX_PENDING_SCAN_RESULTS 16 +#define MAX_PENDING_SCAN_RESULTS 256 static int pending_scan_results_length; static pending_scan_result_t pending_scan_results_buffer[MAX_PENDING_SCAN_RESULTS]; @@ -664,7 +661,7 @@ int jlink_tap_execute() byte_length = tap_length / 8; - usb_out_buffer[0] = EMU_CMD_HW_JTAG; + usb_out_buffer[0] = EMU_CMD_HW_JTAG3; usb_out_buffer[1] = 0; usb_out_buffer[2] = (tap_length >> 0) & 0xff; usb_out_buffer[3] = (tap_length >> 8) & 0xff; @@ -763,7 +760,14 @@ jlink_jtag_t* jlink_usb_open() /* usb_set_configuration required under win32 */ usb_set_configuration(result->usb_handle, dev->config[0].bConfigurationValue); usb_claim_interface(result->usb_handle, 0); + +#if 0 + /* + * This makes problems under Mac OS X. And is not needed + * under Windows. Hopefully this will not break a linux build + */ usb_set_altinterface(result->usb_handle, 0); +#endif return result; } } @@ -789,27 +793,43 @@ int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length) if (result == out_length) { result = jlink_usb_read(jlink_jtag); - if (result == in_length) + if (result == in_length || result == in_length+1) { - /* Must read the result from the EMU too */ - result2 = jlink_usb_read_emu_result(jlink_jtag); - if (1 == result2) + if (result == in_length) { - /* Check the result itself */ - if (0 == usb_emu_result_buffer[0]) + /* Must read the result from the EMU too */ + result2 = jlink_usb_read_emu_result(jlink_jtag); + if (1 == result2) { - return result; + /* Check the result itself */ + if (0 == usb_emu_result_buffer[0]) + { + return result; + } + else + { + LOG_ERROR("jlink_usb_read_emu_result (requested=0, result=%d)", usb_emu_result_buffer[0]); + return -1; + } } else { - LOG_ERROR("jlink_usb_read_emu_result (requested=0, result=%d)", usb_emu_result_buffer[0]); - return -1; + LOG_ERROR("jlink_usb_read_emu_result len (requested=1, result=%d)", result2); + return -1; } } else { - LOG_ERROR("jlink_usb_read_emu_result len (requested=1, result=%d)", result2); - return -1; + /* Check the result itself */ + if (0 == usb_in_buffer[result-1]) + { + return result-1; + } + else + { + LOG_ERROR("jlink_usb_read_emu_result (requested=0, result=%d)", usb_in_buffer[result]); + return -1; + } } } else @@ -875,7 +895,6 @@ int jlink_usb_read_emu_result(jlink_jtag_t *jlink_jtag) return result; } - #ifdef _DEBUG_USB_COMMS_ #define BYTES_PER_LINE 16