mpsse: Always perform a general reset of the MPSSE in mpsse_open()
[fw/openocd] / src / jtag / drivers / mpsse.c
index d6cbc8404c6e93330f3f38d6ed87317776b0e617..92f9331a543c39385eaa538eaa64889bab62e879 100644 (file)
@@ -55,6 +55,7 @@
 #define FTDI_DEVICE_OUT_REQTYPE (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE)
 #define FTDI_DEVICE_IN_REQTYPE (0x80 | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE)
 
+#define BITMODE_RESET 0x00
 #define BITMODE_MPSSE 0x02
 
 #define SIO_RESET_REQUEST             0x00
@@ -312,6 +313,19 @@ struct mpsse_ctx *mpsse_open(const uint16_t *vid, const uint16_t *pid, const cha
                goto error;
        }
 
+       err = libusb_control_transfer(ctx->usb_dev,
+                       FTDI_DEVICE_OUT_REQTYPE,
+                       SIO_SET_BITMODE_REQUEST,
+                       0x0b | (BITMODE_RESET << 8),
+                       ctx->index,
+                       NULL,
+                       0,
+                       ctx->usb_write_timeout);
+       if (err < 0) {
+               LOG_ERROR("unable to reset bitmode: %d", err);
+               goto error;
+       }
+
        err = libusb_control_transfer(ctx->usb_dev,
                        FTDI_DEVICE_OUT_REQTYPE,
                        SIO_SET_BITMODE_REQUEST,