This is an automated email from Gerrit.

Fatih Aşıcı (fatih.as...@gmail.com) just uploaded a new patch set to Gerrit, 
which you can find at http://openocd.zylin.com/1952

-- gerrit

commit 48408c015bb7d1ef916ab4826904166fcacce7ad
Author: Fatih Aşıcı <fatih.as...@gmail.com>
Date:   Tue Feb 18 09:55:15 2014 +0200

    vsllink: Port to libusb-1.0 API
    
    Change-Id: I8a9a4dace8e7e8152947094b27b86f9a0d90fa61
    Signed-off-by: Fatih Aşıcı <fatih.as...@gmail.com>

diff --git a/configure.ac b/configure.ac
index 73f7bef..1f17cde 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 5a6c7ee..698dd8e 100644
--- a/src/jtag/drivers/versaloon/versaloon.c
+++ b/src/jtag/drivers/versaloon/versaloon.c
@@ -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
diff --git a/src/jtag/drivers/versaloon/versaloon.h 
b/src/jtag/drivers/versaloon/versaloon.h
index 2323aee..a7939ca 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 <libusb.h>
+
 struct usart_status_t {
        uint32_t tx_buff_avail;
        uint32_t tx_buff_size;
@@ -106,7 +108,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 177ec83..2eb374a 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 <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
 
diff --git a/src/jtag/drivers/vsllink.c b/src/jtag/drivers/vsllink.c
index 1448008..d45ac88 100644
--- a/src/jtag/drivers/vsllink.c
+++ b/src/jtag/drivers/vsllink.c
@@ -31,7 +31,7 @@
 #include <jtag/swd.h>
 #include <jtag/tcl.h>
 #include <target/arm_adi_v5.h>
-#include "usb_common.h"
+#include <libusb.h>
 
 #include "versaloon/versaloon_include.h"
 #include "versaloon/versaloon.h"
@@ -75,10 +75,11 @@ static void vsllink_tap_append_scan(int length, uint8_t 
*buffer,
 
 /* 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_
@@ -92,7 +93,7 @@ static uint8_t *tdi_buffer;
 static uint8_t *tdo_buffer;
 static uint16_t swd_delay;
 
-struct vsllink *vsllink_handle;
+static struct vsllink *vsllink_handle;
 
 /* global command context from openocd.c */
 extern struct command_context *global_cmd_ctx;
@@ -337,6 +338,8 @@ static int vsllink_quit(void)
        vsllink_free_buffer();
        vsllink_usb_close(vsllink_handle);
 
+       free(vsllink_handle);
+
        return ERROR_OK;
 }
 
@@ -344,8 +347,15 @@ static int vsllink_interface_init(void)
 {
        uint16_t voltage;
 
-       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;
@@ -353,7 +363,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;
@@ -795,132 +805,94 @@ static int vsllink_tap_execute(void)
 /****************************************************************************
  * 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

-- 

------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to