From: Fatih Aşıcı Date: Tue, 18 Feb 2014 07:55:15 +0000 (+0200) Subject: vsllink: Port to libusb-1.0 API X-Git-Tag: v0.9.0-rc1~335 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=84281d711ea8b8d4d2791ff03915b5607c7b6cd4 vsllink: Port to libusb-1.0 API Change-Id: I8a9a4dace8e7e8152947094b27b86f9a0d90fa61 Signed-off-by: Fatih Aşıcı Reviewed-on: http://openocd.zylin.com/1952 Tested-by: jenkins Reviewed-by: Nemui Trinomius Reviewed-by: Andreas Fritiofson --- diff --git a/configure.ac b/configure.ac index 7745bbfbe2..13d25591f7 100644 --- a/configure.ac +++ b/configure.ac @@ -196,7 +196,8 @@ m4_define([USB1_ADAPTERS], [[stlink], [ST-Link JTAG Programmer], [HLADAPTER_STLINK]], [[ti_icdi], [TI ICDI JTAG Programmer], [HLADAPTER_ICDI]], [[ulink], [Keil ULINK JTAG Programmer], [ULINK]], - [[usb_blaster_2], [Altera USB-Blaster II Compatible], [USB_BLASTER_2]]]) + [[usb_blaster_2], [Altera USB-Blaster II Compatible], [USB_BLASTER_2]], + [[vsllink], [Versaloon-Link JTAG Programmer], [VSLLINK]]]) m4_define([USB_ADAPTERS], [[[jlink], [Segger J-Link JTAG Programmer], [JLINK]], @@ -205,8 +206,7 @@ m4_define([USB_ADAPTERS], [[aice], [Andes JTAG Programmer], [AICE]]]) m4_define([USB0_ADAPTERS], - [[[vsllink], [Versaloon-Link JTAG Programmer], [VSLLINK]], - [[usbprog], [USBProg JTAG Programmer], [USBPROG]], + [[[usbprog], [USBProg JTAG Programmer], [USBPROG]], [[rlink], [Raisonance RLink JTAG Programmer], [RLINK]], [[armjtagew], [Olimex ARM-JTAG-EW Programmer], [ARMJTAGEW]]]) diff --git a/src/jtag/drivers/versaloon/versaloon.c b/src/jtag/drivers/versaloon/versaloon.c index cf14b84701..04d73cf38e 100644 --- a/src/jtag/drivers/versaloon/versaloon.c +++ b/src/jtag/drivers/versaloon/versaloon.c @@ -23,6 +23,7 @@ #include #include +#include #include "versaloon_include.h" #include "versaloon.h" @@ -36,7 +37,7 @@ uint16_t versaloon_buf_size; struct versaloon_pending_t versaloon_pending[VERSALOON_MAX_PENDING_NUMBER]; uint16_t versaloon_pending_idx; -usb_dev_handle *versaloon_usb_device_handle; +libusb_device_handle *versaloon_usb_device_handle; static uint32_t versaloon_usb_to = VERSALOON_TIMEOUT; RESULT versaloon_init(void); @@ -196,6 +197,7 @@ RESULT versaloon_add_pending(uint8_t type, uint8_t cmd, uint16_t actual_szie, RESULT versaloon_send_command(uint16_t out_len, uint16_t *inlen) { int ret; + int transferred; #if PARAM_CHECK if (NULL == versaloon_buf) { @@ -208,25 +210,24 @@ RESULT versaloon_send_command(uint16_t out_len, uint16_t *inlen) } #endif - ret = usb_bulk_write(versaloon_usb_device_handle, - versaloon_interface.usb_setting.ep_out, (char *)versaloon_buf, - out_len, versaloon_usb_to); - if (ret != out_len) { - LOG_ERROR(ERRMSG_FAILURE_OPERATION_ERRSTRING, "send usb data", - usb_strerror()); + ret = libusb_bulk_transfer(versaloon_usb_device_handle, + versaloon_interface.usb_setting.ep_out, + versaloon_buf, out_len, &transferred, versaloon_usb_to); + if (0 != ret || transferred != out_len) { + LOG_ERROR(ERRMSG_FAILURE_OPERATION, "send usb data"); return ERRCODE_FAILURE_OPERATION; } if (inlen != NULL) { - ret = usb_bulk_read(versaloon_usb_device_handle, - versaloon_interface.usb_setting.ep_in, (char *)versaloon_buf, - versaloon_interface.usb_setting.buf_size, versaloon_usb_to); - if (ret > 0) { - *inlen = (uint16_t)ret; + ret = libusb_bulk_transfer(versaloon_usb_device_handle, + versaloon_interface.usb_setting.ep_in, + versaloon_buf, versaloon_interface.usb_setting.buf_size, + &transferred, versaloon_usb_to); + if (0 == ret) { + *inlen = (uint16_t)transferred; return ERROR_OK; } else { - LOG_ERROR(ERRMSG_FAILURE_OPERATION_ERRSTRING, "receive usb data", - usb_strerror()); + LOG_ERROR(ERRMSG_FAILURE_OPERATION, "receive usb data"); return ERROR_FAIL; } } else diff --git a/src/jtag/drivers/versaloon/versaloon.h b/src/jtag/drivers/versaloon/versaloon.h index 580085377e..46f5c3191f 100644 --- a/src/jtag/drivers/versaloon/versaloon.h +++ b/src/jtag/drivers/versaloon/versaloon.h @@ -20,6 +20,8 @@ #ifndef __VERSALOON_H_INCLUDED__ #define __VERSALOON_H_INCLUDED__ +#include + struct usart_status_t { uint32_t tx_buff_avail; uint32_t tx_buff_size; @@ -107,7 +109,7 @@ struct versaloon_interface_t { }; extern struct versaloon_interface_t versaloon_interface; -extern usb_dev_handle *versaloon_usb_device_handle; +extern libusb_device_handle *versaloon_usb_device_handle; #endif /* __VERSALOON_H_INCLUDED__ */ diff --git a/src/jtag/drivers/versaloon/versaloon_include.h b/src/jtag/drivers/versaloon/versaloon_include.h index 177ec83aeb..2eb374a7e6 100644 --- a/src/jtag/drivers/versaloon/versaloon_include.h +++ b/src/jtag/drivers/versaloon/versaloon_include.h @@ -21,7 +21,6 @@ /* according to different platform */ #include #include -#include "usb_common.h" #define PARAM_CHECK 1 @@ -49,7 +48,6 @@ #define ERRMSG_NOT_SUPPORT_BY "%s is not supported by %s." #define ERRMSG_FAILURE_OPERATION "Fail to %s." -#define ERRMSG_FAILURE_OPERATION_ERRSTRING "Fail to %s, error string is %s." #define ERRMSG_FAILURE_OPERATION_MESSAGE "Fail to %s, %s" #define ERRCODE_FAILURE_OPERATION ERROR_FAIL diff --git a/src/jtag/drivers/vsllink.c b/src/jtag/drivers/vsllink.c index 1f861baa97..fcac28820a 100644 --- a/src/jtag/drivers/vsllink.c +++ b/src/jtag/drivers/vsllink.c @@ -29,7 +29,7 @@ #include #include #include -#include "usb_common.h" +#include #include "versaloon/versaloon_include.h" #include "versaloon/versaloon.h" @@ -79,10 +79,11 @@ static int vsllink_swd_switch_seq(struct adiv5_dap *dap, /* VSLLink lowlevel functions */ struct vsllink { - struct usb_dev_handle *usb_handle; + struct libusb_context *libusb_ctx; + struct libusb_device_handle *usb_device_handle; }; -static struct vsllink *vsllink_usb_open(void); +static int vsllink_usb_open(struct vsllink *vsllink); static void vsllink_usb_close(struct vsllink *vsllink); #if defined _DEBUG_JTAG_IO_ @@ -98,7 +99,7 @@ static uint8_t *tdo_buffer; static bool swd_mode; static int queued_retval; -struct vsllink *vsllink_handle; +static struct vsllink *vsllink_handle; static int vsllink_execute_queue(void) { @@ -296,13 +297,22 @@ static int vsllink_quit(void) vsllink_free_buffer(); vsllink_usb_close(vsllink_handle); + free(vsllink_handle); + return ERROR_OK; } static int vsllink_interface_init(void) { - vsllink_handle = vsllink_usb_open(); - if (vsllink_handle == 0) { + vsllink_handle = malloc(sizeof(struct vsllink)); + if (NULL == vsllink_handle) { + LOG_ERROR("unable to allocate memory"); + return ERROR_FAIL; + } + + libusb_init(&vsllink_handle->libusb_ctx); + + if (ERROR_OK != vsllink_usb_open(vsllink_handle)) { LOG_ERROR("Can't find USB JTAG Interface!" \ "Please check connection and permissions."); return ERROR_JTAG_INIT_FAILED; @@ -310,7 +320,7 @@ static int vsllink_interface_init(void) LOG_DEBUG("vsllink found on %04X:%04X", versaloon_interface.usb_setting.vid, versaloon_interface.usb_setting.pid); - versaloon_usb_device_handle = vsllink_handle->usb_handle; + versaloon_usb_device_handle = vsllink_handle->usb_device_handle; if (ERROR_OK != versaloon_interface.init()) return ERROR_FAIL; @@ -845,132 +855,94 @@ static int vsllink_swd_run_queue(struct adiv5_dap *dap) /**************************************************************************** * VSLLink USB low-level functions */ -static uint8_t usb_check_string(usb_dev_handle *usb, uint8_t stringidx, - char *string, char *buff, uint16_t buf_size) +static int vsllink_check_usb_strings( + struct libusb_device_handle *usb_device_handle, + struct libusb_device_descriptor *usb_desc) { - int len; - uint8_t alloced = 0; - uint8_t ret = 1; - - if (NULL == buff) { - buf_size = 256; - buff = malloc(buf_size); - if (NULL == buff) { - ret = 0; - goto free_and_return; - } - alloced = 1; - } + char desc_string[256]; + int retval; - strcpy(buff, ""); - len = usb_get_string_simple(usb, stringidx, buff, buf_size); - if ((len < 0) || ((size_t)len != strlen(buff))) { - ret = 0; - goto free_and_return; - } + if (NULL != versaloon_interface.usb_setting.serialstring) { + retval = libusb_get_string_descriptor_ascii(usb_device_handle, + usb_desc->iSerialNumber, (unsigned char *)desc_string, + sizeof(desc_string)); + if (retval < 0) + return ERROR_FAIL; - buff[len] = '\0'; - if ((string != NULL) && strcmp(buff, string)) { - ret = 0; - goto free_and_return; + if (strncmp(desc_string, versaloon_interface.usb_setting.serialstring, + sizeof(desc_string))) + return ERROR_FAIL; } -free_and_return: - if (alloced && (buff != NULL)) { - free(buff); - buff = NULL; - } - return ret; + retval = libusb_get_string_descriptor_ascii(usb_device_handle, + usb_desc->iProduct, (unsigned char *)desc_string, + sizeof(desc_string)); + if (retval < 0) + return ERROR_FAIL; + + if (strstr(desc_string, "Versaloon") == NULL) + return ERROR_FAIL; + + return ERROR_OK; } -static usb_dev_handle *find_usb_device(uint16_t VID, uint16_t PID, uint8_t interface, - char *serialstring, char *productstring) +static int vsllink_usb_open(struct vsllink *vsllink) { - usb_dev_handle *dev_handle = NULL; - struct usb_bus *busses; - struct usb_bus *bus; - struct usb_device *dev; - - usb_init(); - usb_find_busses(); - usb_find_devices(); - busses = usb_get_busses(); - - for (bus = busses; bus; bus = bus->next) { - for (dev = bus->devices; dev; dev = dev->next) { - if ((dev->descriptor.idVendor == VID) - && (dev->descriptor.idProduct == PID)) { - dev_handle = usb_open(dev); - if (NULL == dev_handle) { - LOG_ERROR("failed to open %04X:%04X, %s", VID, PID, - usb_strerror()); - continue; - } + ssize_t num_devices, i; + libusb_device **usb_devices; + struct libusb_device_descriptor usb_desc; + struct libusb_device_handle *usb_device_handle; + int retval; - /* check description string */ - if ((productstring != NULL && !usb_check_string(dev_handle, - dev->descriptor.iProduct, productstring, NULL, 0)) - || (serialstring != NULL && !usb_check_string(dev_handle, - dev->descriptor.iSerialNumber, serialstring, NULL, 0))) { - usb_close(dev_handle); - dev_handle = NULL; - continue; - } + num_devices = libusb_get_device_list(vsllink->libusb_ctx, &usb_devices); - if (usb_claim_interface(dev_handle, interface) != 0) { - LOG_ERROR(ERRMSG_FAILURE_OPERATION_MESSAGE, - "claim interface", usb_strerror()); - usb_close(dev_handle); - dev_handle = NULL; - continue; - } + if (num_devices <= 0) + return ERROR_FAIL; - if (dev_handle != NULL) - return dev_handle; - } - } - } + for (i = 0; i < num_devices; i++) { + libusb_device *device = usb_devices[i]; - return dev_handle; -} + retval = libusb_get_device_descriptor(device, &usb_desc); + if (retval != 0) + continue; -static struct vsllink *vsllink_usb_open(void) -{ - usb_init(); + if (usb_desc.idVendor != versaloon_interface.usb_setting.vid || + usb_desc.idProduct != versaloon_interface.usb_setting.pid) + continue; - struct usb_dev_handle *dev; + retval = libusb_open(device, &usb_device_handle); + if (retval != 0) + continue; - dev = find_usb_device(versaloon_interface.usb_setting.vid, - versaloon_interface.usb_setting.pid, - versaloon_interface.usb_setting.interface, - versaloon_interface.usb_setting.serialstring, "Versaloon"); - if (NULL == dev) - return NULL; + retval = vsllink_check_usb_strings(usb_device_handle, &usb_desc); + if (ERROR_OK == retval) + break; - struct vsllink *result = malloc(sizeof(struct vsllink)); - result->usb_handle = dev; - return result; -} + libusb_close(usb_device_handle); + } -static void vsllink_usb_close(struct vsllink *vsllink) -{ - int ret; + libusb_free_device_list(usb_devices, 1); - ret = usb_release_interface(vsllink->usb_handle, - versaloon_interface.usb_setting.interface); - if (ret != 0) { - LOG_ERROR("fail to release interface %d, %d returned", - versaloon_interface.usb_setting.interface, ret); - exit(-1); - } + if (i == num_devices) + return ERROR_FAIL; - ret = usb_close(vsllink->usb_handle); - if (ret != 0) { - LOG_ERROR("fail to close usb, %d returned", ret); - exit(-1); + retval = libusb_claim_interface(usb_device_handle, + versaloon_interface.usb_setting.interface); + if (retval != 0) { + LOG_ERROR("unable to claim interface"); + libusb_close(usb_device_handle); + return ERROR_FAIL; } - free(vsllink); + vsllink->usb_device_handle = usb_device_handle; + return ERROR_OK; +} + +static void vsllink_usb_close(struct vsllink *vsllink) +{ + libusb_release_interface(vsllink->usb_device_handle, + versaloon_interface.usb_setting.interface); + libusb_close(vsllink->usb_device_handle); } #define BYTES_PER_LINE 16