#define JLINK_HW_TYPE_FLASHER 2
#define JLINK_HW_TYPE_JLINK_PRO 3
#define JLINK_HW_TYPE_JLINK_LITE_ADI 5
-#define JLINK_HW_TYPE_MAX 6
-
-static const char * const jlink_hw_type_str[] = {
- "J-Link",
- "J-Trace",
- "Flasher",
- "J-Link Pro",
- "Unknown",
- "J-Link Lite-ADI",
-};
+#define JLINK_HW_TYPE_LPCLINK2 18
+/* Interface selection */
#define JLINK_TIF_JTAG 0
#define JLINK_TIF_SWD 1
#define JLINK_SWD_DIR_IN 0
static uint16_t vids[] = { 0x1366, 0x1366, 0x1366, 0x1366, 0x1366, 0 };
static uint16_t pids[] = { 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0 };
+static char *jlink_serial;
+
static uint32_t jlink_caps;
static uint32_t jlink_hw_type;
jlink_tap_execute();
}
- if (swd_mode)
- jlink_swd_switch_seq(NULL, JTAG_TO_SWD);
- else
- jlink_swd_switch_seq(NULL, SWD_TO_JTAG);
- jlink_swd_run_queue(NULL);
-
return ERROR_OK;
}
LOG_INFO("J-Link hw version %i", (int)jlink_hw_version);
- if (jlink_hw_type >= JLINK_HW_TYPE_MAX)
- LOG_INFO("J-Link hw type unknown 0x%" PRIx32, jlink_hw_type);
- else
- LOG_INFO("J-Link hw type %s", jlink_hw_type_str[jlink_hw_type]);
+ switch (jlink_hw_type) {
+ case JLINK_HW_TYPE_JLINK:
+ LOG_INFO("J-Link hw type J-Link");
+ break;
+ case JLINK_HW_TYPE_JTRACE:
+ LOG_INFO("J-Link hw type J-Trace");
+ break;
+ case JLINK_HW_TYPE_FLASHER:
+ LOG_INFO("J-Link hw type Flasher");
+ break;
+ case JLINK_HW_TYPE_JLINK_PRO:
+ LOG_INFO("J-Link hw type J-Link Pro");
+ break;
+ case JLINK_HW_TYPE_JLINK_LITE_ADI:
+ LOG_INFO("J-Link hw type J-Link Lite-ADI");
+ break;
+ case JLINK_HW_TYPE_LPCLINK2:
+ LOG_INFO("J-Link hw type J-Link on LPC-Link2");
+ break;
+ default:
+ LOG_INFO("J-Link hw type unknown 0x%" PRIx32, jlink_hw_type);
+ break;
+ }
}
if (jlink_caps & (1 << EMU_CAP_GET_MAX_BLOCK_SIZE)) {
return ERROR_OK;
}
+COMMAND_HANDLER(jlink_serial_command)
+{
+ if (CMD_ARGC != 1) {
+ LOG_ERROR("Need exactly one argument to jlink_serial");
+ return ERROR_FAIL;
+ }
+ if (jlink_serial)
+ free(jlink_serial);
+ jlink_serial = strdup(CMD_ARGV[0]);
+
+ return ERROR_OK;
+}
+
COMMAND_HANDLER(jlink_handle_jlink_info_command)
{
if (jlink_get_version_info() == ERROR_OK) {
.mode = COMMAND_CONFIG,
.help = "set the pid of the interface we want to use",
},
+ {
+ .name = "serial",
+ .handler = &jlink_serial_command,
+ .mode = COMMAND_CONFIG,
+ .help = "set the serial number of the J-Link adapter we want to use"
+ },
COMMAND_REGISTRATION_DONE
};
int ack = buf_get_u32(usb_in_buffer, pending_scan_results_buffer[i].first, 3);
if (ack != SWD_ACK_OK) {
- LOG_ERROR("SWD ack not OK: %d %s", ack,
+ LOG_DEBUG("SWD ack not OK: %d %s", ack,
ack == SWD_ACK_WAIT ? "WAIT" : ack == SWD_ACK_FAULT ? "FAULT" : "JUNK");
- queued_retval = ack;
+ queued_retval = ack == SWD_ACK_WAIT ? ERROR_WAIT : ERROR_FAIL;
goto skip;
} else if (pending_scan_results_buffer[i].length) {
uint32_t data = buf_get_u32(usb_in_buffer, 3 + pending_scan_results_buffer[i].first, 32);
static struct jlink *jlink_usb_open()
{
struct jtag_libusb_device_handle *devh;
- if (jtag_libusb_open(vids, pids, NULL, &devh) != ERROR_OK)
+ if (jtag_libusb_open(vids, pids, jlink_serial, &devh) != ERROR_OK)
return NULL;
/* BE ***VERY CAREFUL*** ABOUT MAKING CHANGES IN THIS
/* reopen jlink after usb_reset
* on win32 this may take a second or two to re-enumerate */
int retval;
- while ((retval = jtag_libusb_open(vids, pids, NULL, &devh)) != ERROR_OK) {
+ while ((retval = jtag_libusb_open(vids, pids, jlink_serial, &devh)) != ERROR_OK) {
usleep(1000);
timeout--;
if (!timeout)