X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fjlink.c;h=b182b6149caa3c2240177e4ac19d16651853b286;hb=99cd373019c51af9f623b71fa17b3f3aa29e1b73;hp=21dfab2277ec24be3a543774e31236acd111c109;hpb=6030a5cb2af17fc4bb47788265c9b1400318da6b;p=openocd.git diff --git a/src/jtag/drivers/jlink.c b/src/jtag/drivers/jlink.c index 21dfab2277..b182b6149c 100644 --- a/src/jtag/drivers/jlink.c +++ b/src/jtag/drivers/jlink.c @@ -32,10 +32,19 @@ /* See Segger's public documentation: * Reference manual for J-Link USB Protocol * Document RM08001-R6 Date: June 16, 2009 + * (Or newer, with some SWD information). + +http://www.segger.com/cms/admin/uploads/productDocs/RM08001_JLinkUSBProtocol.pdf */ -#define VID 0x1366 -#define PID 0x0101 +/* + * The default pid of the segger is 0x0101 + * But when you change the USB Address it will also + * + * pid = ( usb_address > 0x4) ? 0x0101 : (0x101 + usb_address) + */ +#define VID 0x1366, 0x1366, 0x1366, 0x1366 +#define PID 0x0101, 0x0102, 0x0103, 0x0104 #define JLINK_WRITE_ENDPOINT 0x02 #define JLINK_READ_ENDPOINT 0x81 @@ -202,7 +211,7 @@ static void jlink_execute_command(struct jtag_command *cmd) switch (cmd->type) { case JTAG_RUNTEST: jlink_execute_runtest(cmd); break; - case JTAG_STATEMOVE: jlink_execute_statemove(cmd); break; + case JTAG_TLR_RESET: jlink_execute_statemove(cmd); break; case JTAG_PATHMOVE: jlink_execute_pathmove(cmd); break; case JTAG_SCAN: jlink_execute_scan(cmd); break; case JTAG_RESET: jlink_execute_reset(cmd); break; @@ -233,9 +242,9 @@ static int jlink_speed(int speed) if (speed > JLINK_MAX_SPEED) { - LOG_INFO("Ignoring speed request: %dkHz exceeds %dkHz maximum", + LOG_INFO("reduce speed request: %dkHz to %dkHz maximum", speed, JLINK_MAX_SPEED); - return ERROR_OK; + speed = JLINK_MAX_SPEED; } /* check for RTCK setting */ @@ -318,7 +327,11 @@ static int jlink_init(void) jlink_reset(0, 0); jtag_sleep(3000); jlink_tap_init(); - jlink_speed(jtag_get_speed()); + int jtag_speed_var; + int retval = jtag_get_speed(&jtag_speed_var); + if (retval != ERROR_OK) + return retval; + jlink_speed(jtag_speed_var); /* v5/6 jlink seems to have an issue if the first tap move * is not divisible by 8, so we send a TLR on first power up */ @@ -507,7 +520,7 @@ static int jlink_get_status(void) result = jlink_usb_read(jlink_handle, 8); if (result != 8) { - LOG_ERROR("J-Link command EMU_CMD_GET_STATE failed (%d)\n", result); + LOG_ERROR("J-Link command EMU_CMD_GET_STATE failed (%d)", result); return ERROR_JTAG_DEVICE_ERROR; } @@ -567,7 +580,7 @@ static int jlink_get_version_info(void) } jlink_caps = buf_get_u32(usb_in_buffer, 0, 32); - LOG_INFO("JLink caps 0x%x", (unsigned)jlink_caps); + LOG_INFO("J-Link caps 0x%x", (unsigned)jlink_caps); if (jlink_caps & (1 << EMU_CAP_GET_HW_VERSION)) { @@ -586,7 +599,7 @@ static int jlink_get_version_info(void) if (major_revision >= 5) jlink_hw_jtag_version = 3; - LOG_INFO("JLink hw version %i", (int)jlink_hw_version); + LOG_INFO("J-Link hw version %i", (int)jlink_hw_version); } if (jlink_caps & (1 << EMU_CAP_GET_MAX_BLOCK_SIZE)) @@ -602,7 +615,7 @@ static int jlink_get_version_info(void) } jlink_max_size = buf_get_u32(usb_in_buffer, 0, 32); - LOG_INFO("JLink max mem block %i", (int)jlink_max_size); + LOG_INFO("J-Link max mem block %i", (int)jlink_max_size); } return ERROR_OK; @@ -623,7 +636,7 @@ COMMAND_HANDLER(jlink_handle_jlink_hw_jtag_command) { switch (CMD_ARGC) { case 0: - command_print(CMD_CTX, "jlink hw jtag %i", jlink_hw_jtag_version); + command_print(CMD_CTX, "J-Link hw jtag %i", jlink_hw_jtag_version); break; case 1: { int request_version = atoi(CMD_ARGV[0]); @@ -712,9 +725,9 @@ static void jlink_tap_ensure_space(int scans, int bits) static void jlink_tap_append_step(int tms, int tdi) { - int index = tap_length / 8; + int index_var = tap_length / 8; - if (index >= JLINK_TAP_BUFFER_SIZE) + if (index_var >= JLINK_TAP_BUFFER_SIZE) { LOG_ERROR("jlink_tap_append_step: overflow"); *(uint32_t *)0xFFFFFFFF = 0; @@ -727,18 +740,18 @@ static void jlink_tap_append_step(int tms, int tdi) // we do not pad TMS, so be sure to initialize all bits if (0 == bit_index) { - tms_buffer[index] = tdi_buffer[index] = 0; + tms_buffer[index_var] = tdi_buffer[index_var] = 0; } if (tms) - tms_buffer[index] |= bit; + tms_buffer[index_var] |= bit; else - tms_buffer[index] &= ~bit; + tms_buffer[index_var] &= ~bit; if (tdi) - tdi_buffer[index] |= bit; + tdi_buffer[index_var] |= bit; else - tdi_buffer[index] &= ~bit; + tdi_buffer[index_var] &= ~bit; tap_length++; }