aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jtag/drivers/jlink.c19
-rw-r--r--src/jtag/drivers/libusb0_common.c13
-rw-r--r--src/jtag/drivers/libusb0_common.h1
-rw-r--r--src/jtag/drivers/libusb1_common.c13
-rw-r--r--src/jtag/drivers/libusb1_common.h1
5 files changed, 43 insertions, 4 deletions
diff --git a/src/jtag/drivers/jlink.c b/src/jtag/drivers/jlink.c
index 728a05b..029db38 100644
--- a/src/jtag/drivers/jlink.c
+++ b/src/jtag/drivers/jlink.c
@@ -46,12 +46,14 @@
* 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;
@@ -246,8 +248,8 @@ static enum tap_state jlink_last_state = TAP_RESET;
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;
@@ -1517,6 +1519,15 @@ static struct jlink *jlink_usb_open()
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));
diff --git a/src/jtag/drivers/libusb0_common.c b/src/jtag/drivers/libusb0_common.c
index 3211119..4b3bde1 100644
--- a/src/jtag/drivers/libusb0_common.c
+++ b/src/jtag/drivers/libusb0_common.c
@@ -122,3 +122,16 @@ int jtag_libusb_get_endpoints(struct jtag_libusb_device *udev,
return 0;
}
+
+int jtag_libusb_get_pid(struct jtag_libusb_device *dev, uint16_t *pid)
+{
+ struct libusb_device_descriptor dev_desc;
+
+ if (libusb_get_device_descriptor(dev, &dev_desc) == 0) {
+ *pid = dev_desc.idProduct;
+
+ return 0;
+ }
+
+ return -ENODEV;
+}
diff --git a/src/jtag/drivers/libusb0_common.h b/src/jtag/drivers/libusb0_common.h
index bea743d..db247ad 100644
--- a/src/jtag/drivers/libusb0_common.h
+++ b/src/jtag/drivers/libusb0_common.h
@@ -68,5 +68,6 @@ int jtag_libusb_set_configuration(jtag_libusb_device_handle *devh,
int jtag_libusb_get_endpoints(struct jtag_libusb_device *udev,
unsigned int *usb_read_ep,
unsigned int *usb_write_ep);
+int jtag_libusb_get_pid(struct jtag_libusb_device *dev, uint16_t *pid);
#endif /* JTAG_USB_COMMON_H */
diff --git a/src/jtag/drivers/libusb1_common.c b/src/jtag/drivers/libusb1_common.c
index c4478cb..81e8ca8 100644
--- a/src/jtag/drivers/libusb1_common.c
+++ b/src/jtag/drivers/libusb1_common.c
@@ -166,3 +166,16 @@ int jtag_libusb_get_endpoints(struct jtag_libusb_device *udev,
return 0;
}
+
+int jtag_libusb_get_pid(struct jtag_libusb_device *dev, uint16_t *pid)
+{
+ struct libusb_device_descriptor dev_desc;
+
+ if (libusb_get_device_descriptor(dev, &dev_desc) == 0) {
+ *pid = dev_desc.idProduct;
+
+ return 0;
+ }
+
+ return -ENODEV;
+}
diff --git a/src/jtag/drivers/libusb1_common.h b/src/jtag/drivers/libusb1_common.h
index 0e653d8..e33b83a 100644
--- a/src/jtag/drivers/libusb1_common.h
+++ b/src/jtag/drivers/libusb1_common.h
@@ -62,5 +62,6 @@ int jtag_libusb_set_configuration(jtag_libusb_device_handle *devh,
int jtag_libusb_get_endpoints(struct jtag_libusb_device *udev,
unsigned int *usb_read_ep,
unsigned int *usb_write_ep);
+int jtag_libusb_get_pid(struct jtag_libusb_device *dev, uint16_t *pid);
#endif /* JTAG_USB_COMMON_H */