diff --git a/configure.ac b/configure.ac
index ef847ec..a4e2712 100644
--- a/configure.ac
+++ b/configure.ac
@@ -994,7 +994,7 @@ fi
 if test $build_ft2232_libftdi = yes ; then
   # We assume: the package is preinstalled in the proper place
   # these present as 2 libraries..
-  LIBS="$LIBS -lftdi -lusb"
+  LIBS="$LIBS -lftdi -lusb-1.0"
   #
   # Try to build a small program.
   AC_MSG_CHECKING([Build & Link with libftdi...])
@@ -1055,8 +1055,8 @@ build_usb=no
 if test $build_jlink = yes -o $build_vsllink = yes -o $build_usbprog = yes -o \
   $build_rlink = yes -o $build_ulink = yes -o $build_armjtagew = yes
 then
-  AC_CHECK_HEADERS([usb.h],[],
-  [AC_MSG_ERROR([usb.h is required to build some OpenOCD driver(s)])])
+  AC_CHECK_HEADERS([libusb-1.0/libusb.h],[],
+  [AC_MSG_ERROR([libusb.h is required to build some OpenOCD driver(s)])])
   build_usb=yes
 fi
 
diff --git a/src/Makefile.am b/src/Makefile.am
index 8375683..9f97504 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -82,13 +82,13 @@ endif
 endif
 
 if USBPROG
-LIBUSB = -lusb
+LIBUSB = -lusb-1.0
 else
 if JLINK
-LIBUSB = -lusb
+LIBUSB = -lusb-1.0
 else
 if RLINK
-LIBUSB = -lusb
+LIBUSB = -lusb-1.0
 else
 if ULINK
 LIBUSB = -lusb
diff --git a/src/jtag/drivers/jlink.c b/src/jtag/drivers/jlink.c
index adaa640..946deb6 100644
--- a/src/jtag/drivers/jlink.c
+++ b/src/jtag/drivers/jlink.c
@@ -199,7 +199,7 @@ static void jlink_tap_append_scan(int length, uint8_t *buffer,
 
 /* Jlink lowlevel functions */
 struct jlink {
-	struct usb_dev_handle* usb_handle;
+	struct libusb_device_handle* usb_handle;
 };
 
 static struct jlink *jlink_usb_open(void);
@@ -1407,10 +1407,9 @@ static int jlink_tap_execute(void)
 
 static struct jlink* jlink_usb_open()
 {
-	usb_init();
-
-	struct usb_dev_handle *dev;
-	if (jtag_usb_open(vids, pids, &dev) != ERROR_OK)
+	libusb_device_handle *devh;
+	libusb_device *dev;
+	if (jtag_usb_open(vids, pids, &devh) != ERROR_OK)
 		return NULL;
 
 	/* BE ***VERY CAREFUL*** ABOUT MAKING CHANGES IN THIS
@@ -1426,7 +1425,7 @@ static struct jlink* jlink_usb_open()
 
 #if IS_WIN32 == 0
 
-	usb_reset(dev);
+	libusb_reset_device(devh);
 
 #if IS_DARWIN == 0
 
@@ -1434,7 +1433,7 @@ static struct jlink* jlink_usb_open()
 	/* reopen jlink after usb_reset
 	 * on win32 this may take a second or two to re-enumerate */
 	int retval;
-	while ((retval = jtag_usb_open(vids, pids, &dev)) != ERROR_OK)
+	while ((retval = jtag_usb_open(vids, pids, &devh)) != ERROR_OK)
 	{
 		usleep(1000);
 		timeout--;
@@ -1448,10 +1447,10 @@ static struct jlink* jlink_usb_open()
 
 #endif
 
-	/* usb_set_configuration required under win32 */
-	struct usb_device *udev = usb_device(dev);
-	usb_set_configuration(dev, udev->config[0].bConfigurationValue);
-	usb_claim_interface(dev, 0);
+//	/* usb_set_configuration required under win32 */
+//	struct usb_device *udev = usb_device(dev);
+//	usb_set_configuration(dev, udev->config[0].bConfigurationValue);
+//	usb_claim_interface(dev, 0);
 
 #if 0
 	/*
@@ -1460,27 +1459,46 @@ static struct jlink* jlink_usb_open()
 	 */
 	usb_set_altinterface(result->usb_handle, 0);
 #endif
-	struct usb_interface *iface = udev->config->interface;
-	struct usb_interface_descriptor *desc = iface->altsetting;
-	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;
+	dev = libusb_get_device(devh);
+	struct libusb_config_descriptor *config;
+	libusb_get_config_descriptor(dev, 0, &config);
+	
+	const struct libusb_interface *inter;
+	const struct libusb_interface_descriptor *interdesc;
+	const struct libusb_endpoint_descriptor *epdesc;
+		
+	for(int i=0; i<(int)config->bNumInterfaces; i++) 
+	{
+		inter = &config->interface[i];
+
+		for(int j=0; j<inter->num_altsetting; j++) 
+		{
+			interdesc = &inter->altsetting[j];
+			for(int k=0; k<(int)interdesc->bNumEndpoints; k++) 
+			{
+			    epdesc = &interdesc->endpoint[k];
+			    
+			    uint8_t epnum = epdesc->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));
-	result->usb_handle = dev;
+	result->usb_handle = devh;
 	return result;
 }
 
 static void jlink_usb_close(struct jlink *jlink)
 {
-	usb_close(jlink->usb_handle);
+	jtag_usb_close();
 	free(jlink);
 }
 
@@ -1548,8 +1566,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
  * trickle in with some timeouts  */
 static int usb_bulk_with_retries(
-		int (*f)(usb_dev_handle *, int, char *, int, int),
-		usb_dev_handle *dev, int ep,
+		int (*f)(libusb_device_handle *, int, char *, int, int),
+		libusb_device_handle *dev, int ep,
 		char *bytes, int size, int timeout)
 {
 	int tries = 3, count = 0;
@@ -1565,24 +1583,26 @@ static int usb_bulk_with_retries(
 	return count;
 }
 
-static int wrap_usb_bulk_write(usb_dev_handle *dev, int ep,
+static int wrap_usb_bulk_write(libusb_device_handle *dev, int ep,
 			       char *buff, int size, int timeout)
 {
+	int transferred;
 	/* usb_bulk_write() takes const char *buff */
-	return usb_bulk_write(dev, ep, buff, size, timeout);
+	libusb_bulk_transfer(dev, ep, (unsigned char *)buff, size, &transferred, timeout);
+	return transferred;
 }
 
-static inline int usb_bulk_write_ex(usb_dev_handle *dev, int ep,
+static inline int usb_bulk_write_ex(libusb_device_handle *dev, int ep,
 		char *bytes, int size, int timeout)
 {
 	return usb_bulk_with_retries(&wrap_usb_bulk_write,
 			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(libusb_device_handle *dev, int ep,
 		char *bytes, int size, int timeout)
 {
-	return usb_bulk_with_retries(&usb_bulk_read,
+	return usb_bulk_with_retries(&wrap_usb_bulk_write,
 			dev, ep, bytes, size, timeout);
 }
 
diff --git a/src/jtag/drivers/rlink.c b/src/jtag/drivers/rlink.c
index f524b5c..7fb4780 100644
--- a/src/jtag/drivers/rlink.c
+++ b/src/jtag/drivers/rlink.c
@@ -99,7 +99,7 @@
 #define ST7_PC_TDO	ST7_PC_IO9
 #define ST7_PA_DBGACK	ST7_PA_IO10
 
-static usb_dev_handle *pHDev;
+static libusb_device_handle *pHDev;
 
 
 /*
@@ -110,13 +110,14 @@ static usb_dev_handle *pHDev;
 static
 int
 ep1_generic_commandl(
-		usb_dev_handle	*pHDev_param,
-		size_t		length,
+		libusb_device_handle	*pHDev_param,
+		size_t			length,
 		...
 ) {
 	uint8_t		usb_buffer[USB_EP1OUT_SIZE];
 	uint8_t		*usb_buffer_p;
 	va_list		ap;
+	int 		transferred;
 	int		usb_ret;
 
 	if (length > sizeof(usb_buffer)) {
@@ -137,13 +138,15 @@ ep1_generic_commandl(
 			sizeof(usb_buffer) - (usb_buffer_p - usb_buffer)
 	);
 
-	usb_ret = usb_bulk_write(
+	usb_ret = libusb_bulk_transfer(
 			pHDev_param,
 			USB_EP1OUT_ADDR,
-			(char *)usb_buffer, sizeof(usb_buffer),
+			(unsigned char *)usb_buffer, sizeof(usb_buffer), &transferred,
 			USB_TIMEOUT_MS
 	);
 
+	/* If command succesfull, return the nr of byte transferred */
+	if (usb_ret == LIBUSB_SUCCESS) usb_ret = transferred;
 	return(usb_ret);
 }
 
@@ -184,9 +187,9 @@ ep1_memory_read(
 		usb_buffer[2] = addr;
 		usb_buffer[3] = length;
 
-		usb_ret = usb_bulk_write(
+		libusb_bulk_transfer(
 				pHDev, USB_EP1OUT_ADDR,
-				usb_buffer, sizeof(usb_buffer),
+				(unsigned char *)usb_buffer, sizeof(usb_buffer), &usb_ret,
 				USB_TIMEOUT_MS
 		);
 
@@ -194,9 +197,9 @@ ep1_memory_read(
 			break;
 		}
 
-		usb_ret = usb_bulk_read(
+		libusb_bulk_transfer(
 				pHDev, USB_EP1IN_ADDR,
-				buffer, length,
+				(unsigned char *)buffer, length, &usb_ret,
 				USB_TIMEOUT_MS
 		);
 
@@ -219,7 +222,7 @@ ep1_memory_read(
 static
 ssize_t
 ep1_memory_write(
-		usb_dev_handle	*pHDev_param,
+		libusb_device_handle	*pHDev_param,
 		uint16_t	addr,
 		size_t		length,
 		uint8_t	const	*buffer
@@ -255,9 +258,9 @@ ep1_memory_write(
 				sizeof(usb_buffer) - 4 - length
 		);
 
-		usb_ret = usb_bulk_write(
+		libusb_bulk_transfer(
 				pHDev_param, USB_EP1OUT_ADDR,
-				(char *)usb_buffer, sizeof(usb_buffer),
+				(unsigned char *)usb_buffer, sizeof(usb_buffer), &usb_ret,
 				USB_TIMEOUT_MS
 		);
 
@@ -324,7 +327,7 @@ static uint8_t dtc_entry_download;
 static
 int
 dtc_load_from_buffer(
-		usb_dev_handle	*pHDev_param,
+		libusb_device_handle	*pHDev_param,
 		const uint8_t		*buffer,
 		size_t			length
 ) {
@@ -438,6 +441,7 @@ int
 dtc_start_download(void) {
 	int	usb_err;
 	uint8_t	ep2txr;
+	int transferred;
 
 	/* set up for download mode and make sure EP2 is set up to transmit */
 	usb_err = ep1_generic_commandl(
@@ -454,9 +458,9 @@ dtc_start_download(void) {
 	if (usb_err < 0) return(usb_err);
 
 	/* read back ep2txr */
-	usb_err = usb_bulk_read(
+	usb_err = libusb_bulk_transfer(
 			pHDev, USB_EP1IN_ADDR,
-			(char *)&ep2txr, 1,
+			(unsigned char *)&ep2txr, 1, &transferred,
 			USB_TIMEOUT_MS
 	);
 	if (usb_err < 0) return(usb_err);
@@ -481,12 +485,13 @@ dtc_start_download(void) {
 	if (usb_err < 0) return(usb_err);
 
 	/* wait for completion */
-	usb_err = usb_bulk_read(
+	usb_err = libusb_bulk_transfer(
 			pHDev, USB_EP1IN_ADDR,
-			(char *)&ep2txr, 1,
+			(unsigned char *)&ep2txr, 1, &transferred,
 			USB_TIMEOUT_MS
 	);
 
+	if (usb_err == LIBUSB_SUCCESS) usb_err = transferred;
 	return(usb_err);
 }
 
@@ -494,7 +499,7 @@ dtc_start_download(void) {
 static
 int
 dtc_run_download(
-		usb_dev_handle	*pHDev_param,
+		libusb_device_handle	*pHDev_param,
 		uint8_t	*command_buffer,
 		int	command_buffer_size,
 		uint8_t	*reply_buffer,
@@ -503,15 +508,18 @@ dtc_run_download(
 	char dtc_status;
 	int	usb_err;
 	int	i;
+	int 	transferred;
 
 	LOG_DEBUG("%d/%d", command_buffer_size, reply_buffer_size);
 
-	usb_err = usb_bulk_write(
+	usb_err = libusb_bulk_transfer(
 			pHDev_param,
 			USB_EP2OUT_ADDR,
-			(char *)command_buffer, USB_EP2BANK_SIZE,
+			(unsigned char *)command_buffer, USB_EP2BANK_SIZE, &transferred,
 			USB_TIMEOUT_MS
 	);
+	LOG_DEBUG("Transferred %d",transferred);
+		
 	if (usb_err < 0) return(usb_err);
 
 
@@ -525,12 +533,13 @@ dtc_run_download(
 				DTC_STATUS_POLL_BYTE,
 				1
 		);
+		LOG_DEBUG("ep1_generic_commandl %d",usb_err);
 		if (usb_err < 0) return(usb_err);
 
-		usb_err = usb_bulk_read(
+		usb_err = libusb_bulk_transfer(
 				pHDev_param,
 				USB_EP1IN_ADDR,
-				&dtc_status, 1,
+				(unsigned char *)&dtc_status, 1, &transferred,
 				USB_TIMEOUT_MS
 		);
 		if (usb_err < 0) return(usb_err);
@@ -545,16 +554,18 @@ dtc_run_download(
 
 
 	if (reply_buffer && reply_buffer_size) {
-		usb_err = usb_bulk_read(
+		usb_err = libusb_bulk_transfer(
 				pHDev_param,
 				USB_EP2IN_ADDR,
-				(char *)reply_buffer, reply_buffer_size,
+				(unsigned char *)reply_buffer, reply_buffer_size, &transferred,
 				USB_TIMEOUT_MS
 		);
+		
+		LOG_DEBUG("Read enpoint 2 %d %02X",transferred,USB_EP2IN_ADDR);
 
-		if (usb_err < reply_buffer_size) {
-			LOG_ERROR("Read of endpoint 2 returned %d, expected %d",
-					usb_err, reply_buffer_size
+		if (transferred < reply_buffer_size) {
+			LOG_ERROR("Read of endpoint 2 returned %d, expected %d transferred %d",
+					usb_err, reply_buffer_size, transferred
 			);
 			return(usb_err);
 		}
@@ -687,7 +698,7 @@ dtc_queue_run(void) {
 			reply_buffer, dtc_queue.reply_index
 	);
 	if (usb_err < 0) {
-		LOG_ERROR("dtc_run_download: %s", usb_strerror());
+		LOG_ERROR("dtc_run_download: %d", usb_err);
 		exit(1);
 	}
 
@@ -992,6 +1003,7 @@ void rlink_reset(int trst, int srst)
 {
 	uint8_t			bitmap;
 	int			usb_err;
+	int 			transferred;
 
 	/* Read port A for bit op */
 	usb_err = ep1_generic_commandl(
@@ -1002,17 +1014,17 @@ void rlink_reset(int trst, int srst)
 			1
 	);
 	if (usb_err < 0) {
-		LOG_ERROR("%s", usb_strerror());
+		LOG_ERROR("Usb Error:%d", usb_err);
 		exit(1);
 	}
 
-	usb_err = usb_bulk_read(
+	usb_err = libusb_bulk_transfer(
 			pHDev, USB_EP1IN_ADDR,
-			(char *)&bitmap, 1,
+			(unsigned char *)&bitmap, 1, &transferred,
 			USB_TIMEOUT_MS
 	);
-	if (usb_err < 1) {
-		LOG_ERROR("%s", usb_strerror());
+	if (transferred < 1) {
+		LOG_ERROR("Usb Error:%d", usb_err);
 		exit(1);
 	}
 
@@ -1037,17 +1049,17 @@ void rlink_reset(int trst, int srst)
 			1
 	);
 	if (usb_err < 0) {
-		LOG_ERROR("%s", usb_strerror());
+		LOG_ERROR("Usb Error:%d", usb_err);
 		exit(1);
 	}
 
-	usb_err = usb_bulk_read(
+	usb_err = libusb_bulk_transfer(
 			pHDev, USB_EP1IN_ADDR,
-			(char *)&bitmap, 1,
+			(unsigned char *)&bitmap, 1, &transferred,
 			USB_TIMEOUT_MS
 	);
-	if (usb_err < 1) {
-		LOG_ERROR("%s", usb_strerror());
+	if (transferred < 1) {
+		LOG_ERROR("Usb Error:%d", usb_err);
 		exit(1);
 	}
 
@@ -1068,17 +1080,17 @@ void rlink_reset(int trst, int srst)
 			EP1_CMD_DTC_GET_CACHED_STATUS
 	);
 	if (usb_err < 0) {
-		LOG_ERROR("%s", usb_strerror());
+		LOG_ERROR("Usb Error:%d", usb_err);
 		exit(1);
 	}
 
-	usb_err = usb_bulk_read(
+	usb_err = libusb_bulk_transfer(
 			pHDev, USB_EP1IN_ADDR,
-			(char *)&bitmap, 1,
+			(unsigned char *)&bitmap, 1, &transferred,
 			USB_TIMEOUT_MS
 	);
-	if (usb_err < 1) {
-		LOG_ERROR("%s", usb_strerror());
+	if (transferred < 1) {
+		LOG_ERROR("Usb Error:%d", usb_err);
 		exit(1);
 	}
 }
@@ -1467,6 +1479,7 @@ static
 int rlink_speed(int speed)
 {
 	int		i;
+	int		usb_err;
 
 	if (speed == 0) {
 		/* fastest speed */
@@ -1480,8 +1493,9 @@ int rlink_speed(int speed)
 				exit(1);
 			}
 
-			if (dtc_start_download() < 0) {
-				LOG_ERROR("starting DTC: %s", usb_strerror());
+			usb_err = dtc_start_download();
+			if (usb_err < 0) {
+				LOG_ERROR("starting DTC: %d", usb_err);
 				exit(1);
 			}
 
@@ -1541,22 +1555,28 @@ int rlink_khz(
 static
 int rlink_init(void)
 {
-	int i, j, retries;
+	int i, j, retries, transferred;
 	uint8_t reply_buffer[USB_EP1IN_SIZE];
 
-	usb_init();
+	LOG_ERROR("rlink init");
+	//usb_init();
 	const uint16_t vids[] = { USB_IDVENDOR, 0 };
 	const uint16_t pids[] = { USB_IDPRODUCT, 0 };
 	if (jtag_usb_open(vids, pids, &pHDev) != ERROR_OK)
 		return ERROR_FAIL;
 
-	struct usb_device *dev = usb_device(pHDev);
-	if (dev->descriptor.bNumConfigurations > 1)
+	libusb_device *dev = libusb_get_device(pHDev);
+	struct libusb_device_descriptor dev_descriptor;
+	struct libusb_config_descriptor *config;
+	libusb_get_device_descriptor(dev, &dev_descriptor);
+	libusb_get_config_descriptor(dev, 0, &config);
+
+	if (dev_descriptor.bNumConfigurations > 1)
 	{
 		LOG_ERROR("Whoops! NumConfigurations is not 1, don't know what to do...");
 		return ERROR_FAIL;
 	}
-	if (dev->config->bNumInterfaces > 1)
+	if (config->bNumInterfaces > 1)
 	{
 		LOG_ERROR("Whoops! NumInterfaces is not 1, don't know what to do...");
 		return ERROR_FAIL;
@@ -1565,19 +1585,20 @@ int rlink_init(void)
 	LOG_DEBUG("Opened device, pHDev = %p", pHDev);
 
 	/* usb_set_configuration required under win32 */
-	usb_set_configuration(pHDev, dev->config[0].bConfigurationValue);
+	i = libusb_set_configuration(pHDev, config->bConfigurationValue);
+	LOG_DEBUG("Set Configuration %d",i);
 
 	retries = 3;
 	do
 	{
-		i = usb_claim_interface(pHDev,0);
+		i = libusb_claim_interface(pHDev,0);
 		if (i)
 		{
-			LOG_ERROR("usb_claim_interface: %s", usb_strerror());
+			LOG_ERROR("usb_claim_interface: %d", i);
 #ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
-			j = usb_detach_kernel_driver_np(pHDev, 0);
+			j = libusb_detach_kernel_driver(pHDev, 0);
 			if (j)
-				LOG_ERROR("detach kernel driver: %s", usb_strerror());
+				LOG_ERROR("detach kernel driver: %d", j);
 #endif
 		}
 		else
@@ -1592,7 +1613,7 @@ int rlink_init(void)
 		LOG_ERROR("Initialisation failed.");
 		return ERROR_FAIL;
 	}
-	if (usb_set_altinterface(pHDev,0) != 0)
+	if (libusb_set_interface_alt_setting(pHDev,0,0) != 0)
 	{
 		LOG_ERROR("Failed to set interface.");
 		return ERROR_FAIL;
@@ -1613,19 +1634,19 @@ int rlink_init(void)
 				EP1_CMD_GET_FWREV
 		);
 		if (j < USB_EP1OUT_SIZE) {
-			LOG_ERROR("USB write error: %s", usb_strerror());
+			LOG_ERROR("USB write error: %d", j);
 			return(ERROR_FAIL);
 		}
-		j = usb_bulk_read(
+		j = libusb_bulk_transfer(
 				pHDev, USB_EP1IN_ADDR,
-				(char *)reply_buffer, sizeof(reply_buffer),
+				(unsigned char *)reply_buffer, sizeof(reply_buffer), &transferred,
 				200
 		);
-		if (j != -ETIMEDOUT) break;
+		if (j != LIBUSB_ERROR_TIMEOUT) break;
 	}
 
-	if (j < (int)sizeof(reply_buffer)) {
-		LOG_ERROR("USB read error: %s", usb_strerror());
+	if (transferred < (int)sizeof(reply_buffer)) {
+		LOG_ERROR("USB read error: %d", j);
 		return(ERROR_FAIL);
 	}
 	LOG_DEBUG(INTERFACE_NAME" firmware version: %d.%d.%d", reply_buffer[0], reply_buffer[1], reply_buffer[2]);
@@ -1655,9 +1676,9 @@ int rlink_init(void)
 			ST7_PE_ADAPTER_SENSE_OUT
 	);
 
-	usb_bulk_read(
+	libusb_bulk_transfer(
 			pHDev, USB_EP1IN_ADDR,
-			(char *)reply_buffer, 1,
+			(unsigned char *)reply_buffer, 1, &transferred,
 			USB_TIMEOUT_MS
 	);
 
@@ -1680,9 +1701,9 @@ int rlink_init(void)
 			0x00	/* OR */
 	);
 
-	usb_bulk_read(
+	libusb_bulk_transfer(
 			pHDev, USB_EP1IN_ADDR,
-			(char *)reply_buffer, 1,
+			(unsigned char *)reply_buffer, 1, &transferred,
 			USB_TIMEOUT_MS
 	);
 
@@ -1761,8 +1782,8 @@ int rlink_quit(void)
 			~0
 	);
 
-	usb_release_interface(pHDev,0);
-	usb_close(pHDev);
+	libusb_release_interface(pHDev,0);
+	libusb_close(pHDev);
 
 
 	return ERROR_OK;
diff --git a/src/jtag/drivers/usb_common.c b/src/jtag/drivers/usb_common.c
index 463f1af..8c54c87 100644
--- a/src/jtag/drivers/usb_common.c
+++ b/src/jtag/drivers/usb_common.c
@@ -22,40 +22,58 @@
 #endif
 #include "usb_common.h"
 
+static struct libusb_context *jtag_libusb_context; /**< Libusb context **/
+static libusb_device **devs; /**< The usb device list **/
 
-static bool jtag_usb_match(struct usb_device *dev,
+static bool jtag_usb_match(struct libusb_device *dev,
 		const uint16_t vids[], const uint16_t pids[])
 {
+	struct libusb_device_descriptor dev_desc;
+	
 	for (unsigned i = 0; vids[i] && pids[i]; i++)
 	{
-		if (dev->descriptor.idVendor == vids[i] &&
-			dev->descriptor.idProduct == pids[i])
+		if (libusb_get_device_descriptor(dev, &dev_desc) == 0)
 		{
-			return true;
+		    if (dev_desc.idVendor == vids[i] &&
+			dev_desc.idProduct == pids[i])
+		    {
+			    return true;
+		    }
 		}
 	}
 	return false;
 }
 
 int jtag_usb_open(const uint16_t vids[], const uint16_t pids[],
-		struct usb_dev_handle **out)
+		libusb_device_handle **out)
 {
-	usb_find_busses();
-	usb_find_devices();
+	int cnt,idx,errCode;
+	
+	if (libusb_init(&jtag_libusb_context) < 0)
+		return -ENODEV;
+	
+	libusb_set_debug(jtag_libusb_context,3);
 
-	struct usb_bus *busses = usb_get_busses();
-	for (struct usb_bus *bus = busses; bus; bus = bus->next)
+	cnt = libusb_get_device_list(jtag_libusb_context, &devs);
+	
+	for (idx = 0; idx < cnt; idx++)
 	{
-		for (struct usb_device *dev = bus->devices; dev; dev = dev->next)
-		{
-			if (!jtag_usb_match(dev, vids, pids))
-				continue;
+		if (!jtag_usb_match(devs[idx], vids, pids))
+			continue;
 
-			*out = usb_open(dev);
-			if (NULL == *out)
-				return -errno;
-			return 0;
-		}
+		errCode = libusb_open(devs[idx],out);
+		if (errCode < 0)
+			return errCode;
+		return 0;
 	}
 	return -ENODEV;
 }
+
+void jtag_usb_close(void)
+{
+	/** Free the device list **/
+	libusb_free_device_list(devs, 1);
+
+	libusb_exit(jtag_libusb_context);
+}
+  
\ No newline at end of file
diff --git a/src/jtag/drivers/usb_common.h b/src/jtag/drivers/usb_common.h
index 32d3548..9f11d53 100644
--- a/src/jtag/drivers/usb_common.h
+++ b/src/jtag/drivers/usb_common.h
@@ -22,9 +22,10 @@
 
 #include <helper/types.h>
 
-#include <usb.h>
+#include <libusb-1.0/libusb.h>
 
 int jtag_usb_open(const uint16_t vids[], const uint16_t pids[],
-		struct usb_dev_handle **out);
+		libusb_device_handle **out);
+void jtag_usb_close(void);
 
 #endif // JTAG_USB_COMMON_H
diff --git a/src/jtag/drivers/usbprog.c b/src/jtag/drivers/usbprog.c
index 3b8a613..03db48f 100644
--- a/src/jtag/drivers/usbprog.c
+++ b/src/jtag/drivers/usbprog.c
@@ -68,7 +68,7 @@ static void usbprog_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int
 
 struct usbprog_jtag
 {
-	struct usb_dev_handle* usb_handle;
+	libusb_device_handle* usb_handle;
 };
 
 static struct usbprog_jtag * usbprog_jtag_handle;
@@ -376,21 +376,21 @@ struct usb_bus *busses;
 
 struct usbprog_jtag* usbprog_jtag_open(void)
 {
-	usb_set_debug(10);
-	usb_init();
+//	usb_set_debug(10);
+//	usb_init();
 
 	const uint16_t vids[] = { VID, 0 };
 	const uint16_t pids[] = { PID, 0 };
-	struct usb_dev_handle *dev;
+	libusb_device_handle *dev;
 	if (jtag_usb_open(vids, pids, &dev) != ERROR_OK)
 		return NULL;
 
 	struct usbprog_jtag *tmp = malloc(sizeof(struct usbprog_jtag));
 	tmp->usb_handle = dev;
 
-	usb_set_configuration(dev, 1);
-	usb_claim_interface(dev, 0);
-	usb_set_altinterface(dev, 0);
+	libusb_set_configuration(dev, 1);
+	libusb_claim_interface(dev, 0);
+	libusb_set_interface_alt_setting(dev, 0, 0);
 
 	return tmp;
 }
@@ -405,14 +405,15 @@ static void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag)
 
 static unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg, int msglen)
 {
-	int res = usb_bulk_write(usbprog_jtag->usb_handle, 3, msg,msglen, 100);
+	int res;
+	libusb_bulk_transfer(usbprog_jtag->usb_handle, 3, (unsigned char *)msg, msglen, &res, 100);
 	if ((msg[0] == 2) || (msg[0] == 1) || (msg[0] == 4) || (msg[0] == 0) || \
 			(msg[0] == 6) || (msg[0] == 0x0A) || (msg[0] == 9))
 		return 1;
 	if (res == msglen)
 	{
 		/* LOG_INFO("HALLLLOOO %i",(int)msg[0]); */
-		res =  usb_bulk_read(usbprog_jtag->usb_handle, 0x82, msg, 2, 100);
+		libusb_bulk_transfer(usbprog_jtag->usb_handle, 0x82, (unsigned char *)msg, 2, &res, 100);
 		if (res > 0)
 			return (unsigned char)msg[1];
 		else
@@ -432,6 +433,7 @@ static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char
 {
 	char tmp[64];	/* fastes packet size for usb controller */
 	int send_bits, bufindex = 0, fillindex = 0, i, loops;
+	int transfered;
 
 	char swap;
 	/* 61 byte can be transfered (488 bit) */
@@ -461,14 +463,17 @@ static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char
 			tmp[3 + i] = buffer[bufindex];
 			bufindex++;
 		}
-
-		if (usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, 64, 1000) == 64)
+      
+		libusb_bulk_transfer(usbprog_jtag->usb_handle, 3, (unsigned char *)tmp, 64,&transfered,1000);
+		if (transfered == 64)
 		{
 			/* LOG_INFO("HALLLLOOO2 %i",(int)tmp[0]); */
 			usleep(1);
 			int timeout = 0;
-			while (usb_bulk_read(usbprog_jtag->usb_handle, 0x82, tmp, 64, 1000) < 1)
+			transfered = 0;
+			while (transfered < 1)			  
 			{
+				libusb_bulk_transfer(usbprog_jtag->usb_handle, 0x82, (unsigned char *)tmp, 64, &transfered, 1000);
 				timeout++;
 				if (timeout > 10)
 					break;
@@ -487,6 +492,7 @@ static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buff
 {
 	char tmp[64];	/* fastes packet size for usb controller */
 	int send_bits, fillindex = 0, i, loops;
+	int transfered;
 
 	char swap;
 	/* 61 byte can be transfered (488 bit) */
@@ -510,13 +516,15 @@ static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buff
 		tmp[1] = (char)(send_bits >> 8);	/* high */
 		tmp[2] = (char)(send_bits);			/* low */
 
-		usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, 3, 1000);
+		libusb_bulk_transfer(usbprog_jtag->usb_handle, (unsigned char)3, (unsigned char *)tmp, 3, &transfered, 1000);
 
 		/* LOG_INFO("HALLLLOOO3 %i",(int)tmp[0]); */
 		int timeout = 0;
 		usleep(1);
-		while (usb_bulk_read(usbprog_jtag->usb_handle, 0x82, tmp, 64, 10) < 1)
+		transfered = 0;
+		while (transfered < 1)
 		{
+			libusb_bulk_transfer(usbprog_jtag->usb_handle, (unsigned char)0x82, (unsigned char *)tmp, 64, &transfered, 10);
 			timeout++;
 			if (timeout > 10)
 				break;
@@ -533,7 +541,7 @@ static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buff
 static void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
 {
 	char tmp[64];	/* fastes packet size for usb controller */
-	int send_bits, bufindex = 0, i, loops;
+	int send_bits, bufindex = 0, i, loops, transfered;
 
 	/* 61 byte can be transfered (488 bit) */
 	while (size > 0)
@@ -562,7 +570,7 @@ static void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buf
 			tmp[3 + i] = buffer[bufindex];
 			bufindex++;
 		}
-		usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, 64, 1000);
+		libusb_bulk_transfer(usbprog_jtag->usb_handle, 3, (unsigned char *)tmp, 64, &transfered, 1000);
 	}
 }
 
@@ -631,7 +639,7 @@ static void usbprog_jtag_tms_collect(char tms_scan)
 
 static void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag)
 {
-	int i;
+	int i,transfered;
 	/* LOG_INFO("TMS SEND"); */
 	if (tms_chain_index > 0)
 	{
@@ -640,7 +648,7 @@ static void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag)
 		tmp[1] = (char)(tms_chain_index);
 		for (i = 0; i < tms_chain_index + 1; i++)
 			tmp[2 + i] = tms_chain[i];
-		usb_bulk_write(usbprog_jtag->usb_handle, 3, tmp, tms_chain_index + 2, 1000);
+		libusb_bulk_transfer(usbprog_jtag->usb_handle, 3, (unsigned char *)tmp, tms_chain_index + 2, &transfered, 1000);
 		tms_chain_index = 0;
 	}
 }
