From e8f483139d15d824cfae48d950ec761184d89510 Mon Sep 17 00:00:00 2001
From: John Pham <jhnphm@gmail.com>
Date: Mon, 2 Feb 2015 05:23:32 -0500
Subject: [PATCH] Enable  hla_serial for TI ICDI devices

Used jtag_libusb_open from libusb_helper.h instead of
libusb_open_device_with_vid_pid to get device handle,
as well as managing context, i.e. similar to stlink_usb.
Direct calls to libusb1 are left in for the moment.

(When this Gerrit revision was originally created,
the jtag_libusb_ wrappers did not return error conditions.)

Tested w/ a TM4C123GXL board

Change-Id: I71e9a366356c125444d4813e58ddd9b6c6498bf0
Signed-off-by: John Pham <jhnphm@gmail.com>
Signed-off-by: Matthew Trescott <matthewtrescott@gmail.com>
Reviewed-on: http://openocd.zylin.com/2527
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
---
 src/jtag/drivers/ti_icdi_usb.c | 28 ++++++++++------------------
 1 file changed, 10 insertions(+), 18 deletions(-)

diff --git a/src/jtag/drivers/ti_icdi_usb.c b/src/jtag/drivers/ti_icdi_usb.c
index d276e588f..920be7783 100644
--- a/src/jtag/drivers/ti_icdi_usb.c
+++ b/src/jtag/drivers/ti_icdi_usb.c
@@ -31,7 +31,7 @@
 
 #include <target/cortex_m.h>
 
-#include <libusb.h>
+#include "libusb_helper.h"
 
 #define ICDI_WRITE_ENDPOINT 0x02
 #define ICDI_READ_ENDPOINT 0x83
@@ -44,8 +44,7 @@
 #define PACKET_END "#"
 
 struct icdi_usb_handle_s {
-	libusb_context *usb_ctx;
-	libusb_device_handle *usb_dev;
+	struct libusb_device_handle *usb_dev;
 
 	char *read_buffer;
 	char *write_buffer;
@@ -657,10 +656,7 @@ static int icdi_usb_close(void *handle)
 		return ERROR_OK;
 
 	if (h->usb_dev)
-		libusb_close(h->usb_dev);
-
-	if (h->usb_ctx)
-		libusb_exit(h->usb_ctx);
+		jtag_libusb_close(h->usb_dev);
 
 	free(h->read_buffer);
 	free(h->write_buffer);
@@ -670,6 +666,7 @@ static int icdi_usb_close(void *handle)
 
 static int icdi_usb_open(struct hl_interface_param_s *param, void **fd)
 {
+	/* TODO: Convert remaining libusb_ calls to jtag_libusb_ */
 	int retval;
 	struct icdi_usb_handle_s *h;
 
@@ -682,19 +679,14 @@ static int icdi_usb_open(struct hl_interface_param_s *param, void **fd)
 		return ERROR_FAIL;
 	}
 
-	LOG_DEBUG("transport: %d vid: 0x%04x pid: 0x%04x", param->transport,
-		  param->vid[0], param->pid[0]);
+	for (uint8_t i = 0; param->vid[i] && param->pid[i]; ++i)
+		LOG_DEBUG("transport: %d vid: 0x%04x pid: 0x%04x serial: %s", param->transport,
+			param->vid[i], param->pid[i], param->serial ? param->serial : "");
 
-	/* TODO: convert libusb_ calls to jtag_libusb_ */
-	if (param->vid[1])
-		LOG_WARNING("Bad configuration: 'hla_vid_pid' command does not accept more than one VID PID pair on ti-icdi!");
+	/* TI (Stellaris) ICDI provides its serial number in the USB descriptor;
+	   no need to provide a callback here. */
+	jtag_libusb_open(param->vid, param->pid, param->serial, &h->usb_dev, NULL);
 
-	if (libusb_init(&h->usb_ctx) != 0) {
-		LOG_ERROR("libusb init failed");
-		goto error_open;
-	}
-
-	h->usb_dev = libusb_open_device_with_vid_pid(h->usb_ctx, param->vid[0], param->pid[0]);
 	if (!h->usb_dev) {
 		LOG_ERROR("open failed");
 		goto error_open;