* pid = ( usb_address > 0x4) ? 0x0101 : (0x101 + usb_address)
*/
-#define VID 0x1366, 0x1366, 0x1366, 0x1366
-#define PID 0x0101, 0x0102, 0x0103, 0x0104
+#define JLINK_OB_PID 0x0105
#define JLINK_WRITE_ENDPOINT 0x02
#define JLINK_READ_ENDPOINT 0x81
+#define JLINK_OB_WRITE_ENDPOINT 0x06
+#define JLINK_OB_READ_ENDPOINT 0x85
+
static unsigned int jlink_write_ep = JLINK_WRITE_ENDPOINT;
static unsigned int jlink_read_ep = JLINK_READ_ENDPOINT;
static unsigned int jlink_hw_jtag_version = 2;
static struct jlink *jlink_handle;
/* pid could be specified at runtime */
-static uint16_t vids[] = { VID, 0 };
-static uint16_t pids[] = { PID, 0 };
+static uint16_t vids[] = { 0x1366, 0x1366, 0x1366, 0x1366, 0x1366, 0 };
+static uint16_t pids[] = { 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0 };
static uint32_t jlink_caps;
static uint32_t jlink_hw_type;
uint32_t iface_mask = buf_get_u32(usb_in_buffer, 0, 32);
if (!(iface_mask & (1<<iface))) {
- LOG_ERROR("J-Link requesting to select unsupported interface (%x)", iface_mask);
+ LOG_ERROR("J-Link requesting to select unsupported interface (%" PRIx32 ")", iface_mask);
return ERROR_JTAG_DEVICE_ERROR;
}
if (!cfg)
return;
- jlink_dump_printf(ctx, "Kickstart power on JTAG-pin 19: 0x%x",
+ jlink_dump_printf(ctx, "Kickstart power on JTAG-pin 19: 0x%" PRIx32,
cfg->kickstart_power_on_jtag_pin_19);
}
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 uknown 0x%x", jlink_hw_type);
+ LOG_INFO("J-Link hw type uknown 0x%" PRIx32, jlink_hw_type);
else
LOG_INFO("J-Link hw type %s", jlink_hw_type_str[jlink_hw_type]);
}
result = use_jtag3 ? usb_in_buffer[byte_length] : 0;
if (result != 0) {
- LOG_ERROR("jlink_tap_execute failed, result %d", result);
+ LOG_ERROR("jlink_tap_execute failed, result %d (%s)", result,
+ result == 1 ? "adaptive clocking timeout" : "unknown");
jlink_tap_init();
return ERROR_JTAG_QUEUE_FAILED;
}
usb_set_altinterface(result->usb_handle, 0);
#endif
+ /* Use the OB endpoints if the JLink we matched is a Jlink-OB adapter */
+ uint16_t matched_pid;
+ if (jtag_libusb_get_pid(udev, &matched_pid) == ERROR_OK) {
+ if (matched_pid == JLINK_OB_PID) {
+ jlink_read_ep = JLINK_OB_WRITE_ENDPOINT;
+ jlink_write_ep = JLINK_OB_READ_ENDPOINT;
+ }
+ }
+
jtag_libusb_get_endpoints(udev, &jlink_read_ep, &jlink_write_ep);
struct jlink *result = malloc(sizeof(struct jlink));