swim: fix adapter speed handling
[fw/openocd] / src / jtag / drivers / ti_icdi_usb.c
index 20b308179833b08488342d5eb73b07a268c710c1..f316c8256e596ba43f3f2bf7a7b38d4ca99b6d38 100644 (file)
@@ -14,9 +14,7 @@
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -244,7 +242,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);
 }
@@ -268,7 +267,7 @@ static int icdi_get_cmd_result(void *handle)
 
        if (h->read_buffer[offset] == 'E') {
                /* get error code */
-               char result;
+               uint8_t result;
                if (unhexify(&result, h->read_buffer + offset + 1, 1) != 1)
                        return ERROR_FAIL;
                return result;
@@ -330,7 +329,7 @@ static int icdi_usb_version(void *handle)
        }
 
        /* convert reply */
-       if (unhexify(version, h->read_buffer + 2, 4) != 4) {
+       if (unhexify((uint8_t *)version, h->read_buffer + 2, 4) != 4) {
                LOG_WARNING("unable to get ICDI version");
                return ERROR_OK;
        }
@@ -497,7 +496,7 @@ static int icdi_usb_read_reg(void *handle, int num, uint32_t *val)
 
        /* convert result */
        uint8_t buf[4];
-       if (unhexify((char *)buf, h->read_buffer + 2, 4) != 4) {
+       if (unhexify(buf, h->read_buffer + 2, 4) != 4) {
                LOG_ERROR("failed to convert result");
                return ERROR_FAIL;
        }
@@ -514,7 +513,7 @@ static int icdi_usb_write_reg(void *handle, int num, uint32_t val)
        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));
+       hexify(cmd + cmd_len, buf, 4, sizeof(cmd));
 
        result = icdi_send_cmd(handle, cmd);
        if (result != ERROR_OK)
@@ -645,10 +644,18 @@ static int icdi_usb_write_mem(void *handle, uint32_t addr, uint32_t size,
        return retval;
 }
 
+static int icdi_usb_override_target(const char *targetname)
+{
+       return !strcmp(targetname, "cortex_m");
+}
+
 static int icdi_usb_close(void *handle)
 {
        struct icdi_usb_handle_s *h = handle;
 
+       if (!h)
+               return ERROR_OK;
+
        if (h->usb_dev)
                libusb_close(h->usb_dev);
 
@@ -681,14 +688,18 @@ static int icdi_usb_open(struct hl_interface_param_s *param, void **fd)
        }
 
        LOG_DEBUG("transport: %d vid: 0x%04x pid: 0x%04x", param->transport,
-               param->vid, param->pid);
+                 param->vid[0], param->pid[0]);
+
+       /* 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!");
 
        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, param->pid);
+       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;
@@ -770,5 +781,7 @@ struct hl_layout_api_s icdi_usb_layout_api = {
        .write_reg = icdi_usb_write_reg,
        .read_mem = icdi_usb_read_mem,
        .write_mem = icdi_usb_write_mem,
-       .write_debug_reg = icdi_usb_write_debug_reg
+       .write_debug_reg = icdi_usb_write_debug_reg,
+       .override_target = icdi_usb_override_target,
+       .custom_command = icdi_send_remote_cmd,
 };