jlink libusb-1.0 driver.
jlink modified to use the new usb abstaction layer. During the configuration process we can select if use libusb0 or libusb-1.0 library for this driver. Change-Id: I70bc9ee2f89b7597e0f64ea80cad7f1b9070f01b Signed-off-by: Mauro Gamba <maurillo71@gmail.com> Reviewed-on: http://openocd.zylin.com/236 Tested-by: jenkins Reviewed-by: Xiaofan <xiaofanc@gmail.com> Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
parent
ac4340e391
commit
e8d1da15c2
|
@ -1056,7 +1056,7 @@ fi
|
||||||
|
|
||||||
# check for usb.h when a driver will require it
|
# check for usb.h when a driver will require it
|
||||||
build_usb=no
|
build_usb=no
|
||||||
if test $build_jlink = yes -o $build_vsllink = yes -o $build_usbprog = yes -o \
|
if test $build_vsllink = yes -o $build_usbprog = yes -o \
|
||||||
$build_rlink = yes -o $build_ulink = yes -o $build_armjtagew = yes
|
$build_rlink = yes -o $build_ulink = yes -o $build_armjtagew = yes
|
||||||
then
|
then
|
||||||
build_usb=yes
|
build_usb=yes
|
||||||
|
@ -1064,6 +1064,9 @@ fi
|
||||||
|
|
||||||
# Check for libusb1 ported drivers.
|
# Check for libusb1 ported drivers.
|
||||||
build_usb_ng=no
|
build_usb_ng=no
|
||||||
|
if test $build_jlink = yes; then
|
||||||
|
build_usb_ng=yes
|
||||||
|
fi
|
||||||
|
|
||||||
# check for libusb library if necessary
|
# check for libusb library if necessary
|
||||||
use_libusb0=no
|
use_libusb0=no
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
#include <jtag/interface.h>
|
#include <jtag/interface.h>
|
||||||
#include <jtag/commands.h>
|
#include <jtag/commands.h>
|
||||||
#include "usb_common.h"
|
#include "libusb_common.h"
|
||||||
|
|
||||||
/* See Segger's public documentation:
|
/* See Segger's public documentation:
|
||||||
* Reference manual for J-Link USB Protocol
|
* Reference manual for J-Link USB Protocol
|
||||||
|
@ -199,7 +199,7 @@ static void jlink_tap_append_scan(int length, uint8_t *buffer,
|
||||||
|
|
||||||
/* Jlink lowlevel functions */
|
/* Jlink lowlevel functions */
|
||||||
struct jlink {
|
struct jlink {
|
||||||
struct usb_dev_handle* usb_handle;
|
struct jtag_libusb_device_handle *usb_handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct jlink *jlink_usb_open(void);
|
static struct jlink *jlink_usb_open(void);
|
||||||
|
@ -1407,10 +1407,8 @@ static int jlink_tap_execute(void)
|
||||||
|
|
||||||
static struct jlink* jlink_usb_open()
|
static struct jlink* jlink_usb_open()
|
||||||
{
|
{
|
||||||
usb_init();
|
struct jtag_libusb_device_handle *devh;
|
||||||
|
if (jtag_libusb_open(vids, pids, &devh) != ERROR_OK)
|
||||||
struct usb_dev_handle *dev;
|
|
||||||
if (jtag_usb_open(vids, pids, &dev) != ERROR_OK)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* BE ***VERY CAREFUL*** ABOUT MAKING CHANGES IN THIS
|
/* BE ***VERY CAREFUL*** ABOUT MAKING CHANGES IN THIS
|
||||||
|
@ -1426,7 +1424,7 @@ static struct jlink* jlink_usb_open()
|
||||||
|
|
||||||
#if IS_WIN32 == 0
|
#if IS_WIN32 == 0
|
||||||
|
|
||||||
usb_reset(dev);
|
jtag_libusb_reset_device(devh);
|
||||||
|
|
||||||
#if IS_DARWIN == 0
|
#if IS_DARWIN == 0
|
||||||
|
|
||||||
|
@ -1434,7 +1432,7 @@ static struct jlink* jlink_usb_open()
|
||||||
/* reopen jlink after usb_reset
|
/* reopen jlink after usb_reset
|
||||||
* on win32 this may take a second or two to re-enumerate */
|
* on win32 this may take a second or two to re-enumerate */
|
||||||
int retval;
|
int retval;
|
||||||
while ((retval = jtag_usb_open(vids, pids, &dev)) != ERROR_OK)
|
while ((retval = jtag_libusb_open(vids, pids, &devh)) != ERROR_OK)
|
||||||
{
|
{
|
||||||
usleep(1000);
|
usleep(1000);
|
||||||
timeout--;
|
timeout--;
|
||||||
|
@ -1449,9 +1447,9 @@ static struct jlink* jlink_usb_open()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* usb_set_configuration required under win32 */
|
/* usb_set_configuration required under win32 */
|
||||||
struct usb_device *udev = usb_device(dev);
|
struct jtag_libusb_device *udev = jtag_libusb_get_device(devh);
|
||||||
usb_set_configuration(dev, udev->config[0].bConfigurationValue);
|
jtag_libusb_set_configuration(devh, 0);
|
||||||
usb_claim_interface(dev, 0);
|
jtag_libusb_claim_interface(devh, 0);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/*
|
/*
|
||||||
|
@ -1460,27 +1458,17 @@ static struct jlink* jlink_usb_open()
|
||||||
*/
|
*/
|
||||||
usb_set_altinterface(result->usb_handle, 0);
|
usb_set_altinterface(result->usb_handle, 0);
|
||||||
#endif
|
#endif
|
||||||
struct usb_interface *iface = udev->config->interface;
|
|
||||||
struct usb_interface_descriptor *desc = iface->altsetting;
|
jtag_libusb_get_endpoints(udev, &jlink_read_ep, &jlink_write_ep);
|
||||||
for (int i = 0; i < desc->bNumEndpoints; i++)
|
|
||||||
{
|
|
||||||
uint8_t epnum = desc->endpoint[i].bEndpointAddress;
|
|
||||||
bool is_input = epnum & 0x80;
|
|
||||||
LOG_DEBUG("usb ep %s %02x", is_input ? "in" : "out", epnum);
|
|
||||||
if (is_input)
|
|
||||||
jlink_read_ep = epnum;
|
|
||||||
else
|
|
||||||
jlink_write_ep = epnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct jlink *result = malloc(sizeof(struct jlink));
|
struct jlink *result = malloc(sizeof(struct jlink));
|
||||||
result->usb_handle = dev;
|
result->usb_handle = devh;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void jlink_usb_close(struct jlink *jlink)
|
static void jlink_usb_close(struct jlink *jlink)
|
||||||
{
|
{
|
||||||
usb_close(jlink->usb_handle);
|
jtag_libusb_close(jlink->usb_handle);
|
||||||
free(jlink);
|
free(jlink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1548,8 +1536,8 @@ static int jlink_usb_message(struct jlink *jlink, int out_length, int in_length)
|
||||||
/* calls the given usb_bulk_* function, allowing for the data to
|
/* calls the given usb_bulk_* function, allowing for the data to
|
||||||
* trickle in with some timeouts */
|
* trickle in with some timeouts */
|
||||||
static int usb_bulk_with_retries(
|
static int usb_bulk_with_retries(
|
||||||
int (*f)(usb_dev_handle *, int, char *, int, int),
|
int (*f)(jtag_libusb_device_handle *, int, char *, int, int),
|
||||||
usb_dev_handle *dev, int ep,
|
jtag_libusb_device_handle *dev, int ep,
|
||||||
char *bytes, int size, int timeout)
|
char *bytes, int size, int timeout)
|
||||||
{
|
{
|
||||||
int tries = 3, count = 0;
|
int tries = 3, count = 0;
|
||||||
|
@ -1565,24 +1553,24 @@ static int usb_bulk_with_retries(
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wrap_usb_bulk_write(usb_dev_handle *dev, int ep,
|
static int wrap_usb_bulk_write(jtag_libusb_device_handle *dev, int ep,
|
||||||
char *buff, int size, int timeout)
|
char *buff, int size, int timeout)
|
||||||
{
|
{
|
||||||
/* usb_bulk_write() takes const char *buff */
|
/* usb_bulk_write() takes const char *buff */
|
||||||
return usb_bulk_write(dev, ep, buff, size, timeout);
|
return jtag_libusb_bulk_write(dev, ep, buff, size, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int usb_bulk_write_ex(usb_dev_handle *dev, int ep,
|
static inline int usb_bulk_write_ex(jtag_libusb_device_handle *dev, int ep,
|
||||||
char *bytes, int size, int timeout)
|
char *bytes, int size, int timeout)
|
||||||
{
|
{
|
||||||
return usb_bulk_with_retries(&wrap_usb_bulk_write,
|
return usb_bulk_with_retries(&wrap_usb_bulk_write,
|
||||||
dev, ep, bytes, size, timeout);
|
dev, ep, bytes, size, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int usb_bulk_read_ex(usb_dev_handle *dev, int ep,
|
static inline int usb_bulk_read_ex(jtag_libusb_device_handle *dev, int ep,
|
||||||
char *bytes, int size, int timeout)
|
char *bytes, int size, int timeout)
|
||||||
{
|
{
|
||||||
return usb_bulk_with_retries(&usb_bulk_read,
|
return usb_bulk_with_retries(&jtag_libusb_bulk_read,
|
||||||
dev, ep, bytes, size, timeout);
|
dev, ep, bytes, size, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue