aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrey Yurovsky <yurovsky@gmail.com>2014-03-07 17:16:52 -0800
committerPaul Fertser <fercerpav@gmail.com>2014-03-29 07:12:42 +0000
commitfb897cc805fe193a1ee2f295f284e421660793d5 (patch)
tree4d592e75336940a424097818a11629b14de5d697 /src
parenta5ef7b83e2a729d9442801f34314b911e3ed1e9f (diff)
downloadriscv-openocd-fb897cc805fe193a1ee2f295f284e421660793d5.zip
riscv-openocd-fb897cc805fe193a1ee2f295f284e421660793d5.tar.gz
riscv-openocd-fb897cc805fe193a1ee2f295f284e421660793d5.tar.bz2
jlink: add support for Jlink-OB (0x0105) devices
The JLink-OB (onboard) devices work the same way as the normal JLink except that their PID is 0x0105 (and that's the only one we know of so far) and their endpoint addresses are different due to there being a CDC-ACM interface as well. These JLink-OB devices show up on a lot of vendors' development kits as an integrated debugger. This change simply checks whether the adapter we opened has a JLink-OB PID and, if it does, uses the JLink-OB endpoints rather than the default. To do this, we add a new routine, jtag_libusb_get_pid() to the libusb adapter layer, it in turn just calls libusb_get_device_descriptor(), which previously had no wrapper. Also, checkpatch.pl doesn't like the VID/PID macros as defined so I moved them to the array itself. This should have no effect on the code. This change adds the 0102 through 0104 PIDs to openocd.rules as well as this new 0105 PID. Tested on an Atmel SAM4S Xplained board which has a JLink-OB, also regression tested by using a 0x0101 PID normal JLink adapter. Signed-off-by: Andrey Yurovsky <yurovsky@gmail.com> Change-Id: I121d30e57729cda3adb66e2a5dc72e1fcb7ef8b1 Reviewed-on: http://openocd.zylin.com/2031 Tested-by: jenkins Reviewed-by: Xiaofan <xiaofanc@gmail.com> Reviewed-by: Paul Fertser <fercerpav@gmail.com>
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 */