summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jtag/jlink.c76
1 files changed, 15 insertions, 61 deletions
diff --git a/src/jtag/jlink.c b/src/jtag/jlink.c
index 8f1d112d..f173ed78 100644
--- a/src/jtag/jlink.c
+++ b/src/jtag/jlink.c
@@ -27,8 +27,7 @@
#include "interface.h"
#include "commands.h"
-
-#include <usb.h>
+#include "usb_common.h"
#define VID 0x1366
@@ -818,53 +817,17 @@ static int jlink_tap_execute(void)
return ERROR_OK;
}
-static struct usb_device* find_jlink_device(void)
-{
- struct usb_bus *busses;
- struct usb_bus *bus;
- struct usb_device *dev;
-
- usb_find_busses();
- usb_find_devices();
-
- busses = usb_get_busses();
-
- /* find jlink device in usb bus */
-
- for (bus = busses; bus; bus = bus->next)
- {
- for (dev = bus->devices; dev; dev = dev->next)
- {
- if ((dev->descriptor.idVendor == VID) && (dev->descriptor.idProduct == PID)) {
- return dev;
- }
- }
- }
-
- return NULL;
-}
-
/*****************************************************************************/
/* JLink USB low-level functions */
static struct jlink* jlink_usb_open()
{
- struct usb_device *dev;
-
- struct jlink *result;
-
- result = (struct jlink*) malloc(sizeof(struct jlink));
-
usb_init();
- if ((dev = find_jlink_device()) == NULL) {
- free(result);
- return NULL;
- }
-
- result->usb_handle = usb_open(dev);
-
- if (NULL == result->usb_handle)
+ const uint16_t vids[] = { VID, 0 };
+ const uint16_t pids[] = { PID, 0 };
+ struct usb_dev_handle *dev;
+ if (jtag_usb_open(vids, pids, &dev) != ERROR_OK)
return NULL;
/* BE ***VERY CAREFUL*** ABOUT MAKING CHANGES IN THIS
@@ -880,15 +843,15 @@ static struct jlink* jlink_usb_open()
#if IS_WIN32 == 0
- usb_reset(result->usb_handle);
+ usb_reset(dev);
#if IS_DARWIN == 0
int timeout = 5;
-
/* reopen jlink after usb_reset
* on win32 this may take a second or two to re-enumerate */
- while ((dev = find_jlink_device()) == NULL)
+ int retval;
+ while ((retval = jtag_usb_open(vids, pids, &dev)) != ERROR_OK)
{
usleep(1000);
timeout--;
@@ -896,27 +859,16 @@ static struct jlink* jlink_usb_open()
break;
}
}
-
- if (dev == NULL)
- {
- free(result);
+ if (ERROR_OK != retval)
return NULL;
- }
-
- result->usb_handle = usb_open(dev);
#endif
#endif
- if (NULL == result->usb_handle)
- {
- free(result);
- return NULL;
- }
-
/* usb_set_configuration required under win32 */
- usb_set_configuration(result->usb_handle, dev->config[0].bConfigurationValue);
- usb_claim_interface(result->usb_handle, 0);
+ struct usb_device *udev = usb_device(dev);
+ usb_set_configuration(dev, udev->config[0].bConfigurationValue);
+ usb_claim_interface(dev, 0);
#if 0
/*
@@ -925,7 +877,7 @@ static struct jlink* jlink_usb_open()
*/
usb_set_altinterface(result->usb_handle, 0);
#endif
- struct usb_interface *iface = dev->config->interface;
+ struct usb_interface *iface = udev->config->interface;
struct usb_interface_descriptor *desc = iface->altsetting;
for (int i = 0; i < desc->bNumEndpoints; i++)
{
@@ -938,6 +890,8 @@ static struct jlink* jlink_usb_open()
jlink_write_ep = epnum;
}
+ struct jlink *result = malloc(sizeof(struct jlink));
+ result->usb_handle = dev;
return result;
}