drivers/jtag_vpi: Added "jtag_vpi:" prefixes to log messages
[fw/openocd] / src / jtag / drivers / ti_icdi_usb.c
index 7a6272fdb2da3dff51cfe31e7ae78b8dd1fe982c..d911fdacbfe225c0c3268dd2595a9fa3f2b035ed 100644 (file)
@@ -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;
@@ -123,7 +122,7 @@ static int icdi_send_packet(void *handle, int len)
        int result, retry = 0;
        int transferred = 0;
 
-       assert(handle != NULL);
+       assert(handle);
 
        /* check we have a large enough buffer for checksum "#00" */
        if (len + 3 > h->max_packet) {
@@ -242,7 +241,8 @@ static int icdi_send_remote_cmd(void *handle, const char *data)
        struct icdi_usb_handle_s *h = handle;
 
        size_t cmd_len = sprintf(h->write_buffer, PACKET_START "qRcmd,");
-       cmd_len += hexify(h->write_buffer + cmd_len, data, 0, h->max_packet - cmd_len);
+       cmd_len += hexify(h->write_buffer + cmd_len, (const uint8_t *)data,
+               strlen(data), h->max_packet - cmd_len);
 
        return icdi_send_packet(handle, cmd_len);
 }
@@ -253,7 +253,7 @@ static int icdi_get_cmd_result(void *handle)
        int offset = 0;
        char ch;
 
-       assert(handle != NULL);
+       assert(handle);
 
        do {
                ch = h->read_buffer[offset++];
@@ -475,13 +475,13 @@ static int icdi_usb_read_regs(void *handle)
        return ERROR_OK;
 }
 
-static int icdi_usb_read_reg(void *handle, int num, uint32_t *val)
+static int icdi_usb_read_reg(void *handle, unsigned int regsel, uint32_t *val)
 {
        int result;
        struct icdi_usb_handle_s *h = handle;
        char cmd[10];
 
-       snprintf(cmd, sizeof(cmd), "p%x", num);
+       snprintf(cmd, sizeof(cmd), "p%x", regsel);
        result = icdi_send_cmd(handle, cmd);
        if (result != ERROR_OK)
                return result;
@@ -504,15 +504,15 @@ static int icdi_usb_read_reg(void *handle, int num, uint32_t *val)
        return result;
 }
 
-static int icdi_usb_write_reg(void *handle, int num, uint32_t val)
+static int icdi_usb_write_reg(void *handle, unsigned int regsel, uint32_t val)
 {
        int result;
        char cmd[20];
        uint8_t buf[4];
        h_u32_to_le(buf, val);
 
-       int cmd_len = snprintf(cmd, sizeof(cmd), "P%x=", num);
-       hexify(cmd + cmd_len, (const char *)buf, 4, sizeof(cmd));
+       int cmd_len = snprintf(cmd, sizeof(cmd), "P%x=", regsel);
+       hexify(cmd + cmd_len, buf, 4, sizeof(cmd));
 
        result = icdi_send_cmd(handle, cmd);
        if (result != ERROR_OK)
@@ -656,24 +656,17 @@ 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);
-
-       if (h->read_buffer)
-               free(h->read_buffer);
-
-       if (h->write_buffer)
-               free(h->write_buffer);
+               jtag_libusb_close(h->usb_dev);
 
+       free(h->read_buffer);
+       free(h->write_buffer);
        free(handle);
-
        return ERROR_OK;
 }
 
 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;
 
@@ -686,15 +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, param->pid);
+       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 : "");
 
-       if (libusb_init(&h->usb_ctx) != 0) {
-               LOG_ERROR("libusb init failed");
-               goto error_open;
-       }
+       /* 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);
 
-       h->usb_dev = libusb_open_device_with_vid_pid(h->usb_ctx, param->vid, param->pid);
        if (!h->usb_dev) {
                LOG_ERROR("open failed");
                goto error_open;