vsllink: Port to libusb-1.0 API 52/1952/7
authorFatih Aşıcı <fatih.asici@gmail.com>
Tue, 18 Feb 2014 07:55:15 +0000 (09:55 +0200)
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>
Thu, 3 Jul 2014 19:43:16 +0000 (19:43 +0000)
Change-Id: I8a9a4dace8e7e8152947094b27b86f9a0d90fa61
Signed-off-by: Fatih Aşıcı <fatih.asici@gmail.com>
Reviewed-on: http://openocd.zylin.com/1952
Tested-by: jenkins
Reviewed-by: Nemui Trinomius <nemuisan_kawausogasuki@live.jp>
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
configure.ac
src/jtag/drivers/versaloon/versaloon.c
src/jtag/drivers/versaloon/versaloon.h
src/jtag/drivers/versaloon/versaloon_include.h
src/jtag/drivers/vsllink.c

index 7745bbfbe23265c62f3d35c76b22a874623f6d5f..13d25591f7f872c9946a14ddbf092b6a0f1278ce 100644 (file)
@@ -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]]])
 
index cf14b847018531d7026230a2a9d0e23f44e37545..04d73cf38ec4a15d7525633f49e91bc1b0f0feae 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <libusb.h>
 
 #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
index 580085377ed8fd4755f31f07a2be5cb2adb2daec..46f5c3191f638e0c2bc1f5e9576ffcc85ec54869 100644 (file)
@@ -20,6 +20,8 @@
 #ifndef __VERSALOON_H_INCLUDED__
 #define __VERSALOON_H_INCLUDED__
 
+#include <libusb.h>
+
 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__ */
 
index 177ec83aeb565c35d055a0b008f271df3241c29a..2eb374a7e677a226f72b593be51c2099314674dd 100644 (file)
@@ -21,7 +21,6 @@
 /* according to different platform */
 #include <jtag/interface.h>
 #include <jtag/commands.h>
-#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
 
index 1f861baa97cb515723ba8ac3d806ce6b19dbd522..fcac28820a436fa261e77a941c259d05ce1a5beb 100644 (file)
@@ -29,7 +29,7 @@
 #include <jtag/interface.h>
 #include <jtag/commands.h>
 #include <jtag/swd.h>
-#include "usb_common.h"
+#include <libusb.h>
 
 #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

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)