jtag/hla, jtag/stlink: switch to command 'adapter serial'
[fw/openocd] / src / jtag / drivers / ti_icdi_usb.c
index 171ac66c471f5641af30675038cccc1477e2f30f..a359dd17dceb6d7e40535675a155e24c22cca19f 100644 (file)
@@ -23,6 +23,7 @@
 
 /* project specific includes */
 #include <helper/binarybuffer.h>
+#include <jtag/adapter.h>
 #include <jtag/interface.h>
 #include <jtag/hla/hla_layout.h>
 #include <jtag/hla/hla_transport.h>
@@ -31,7 +32,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 +45,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 +123,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) {
@@ -254,7 +254,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++];
@@ -476,13 +476,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;
@@ -505,14 +505,14 @@ 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);
+       int cmd_len = snprintf(cmd, sizeof(cmd), "P%x=", regsel);
        hexify(cmd + cmd_len, buf, 4, sizeof(cmd));
 
        result = icdi_send_cmd(handle, cmd);
@@ -657,24 +657,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;
 
@@ -687,15 +680,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], adapter_get_required_serial() ? adapter_get_required_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, adapter_get_required_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;