diff options
author | Peter Stuge <peter@stuge.se> | 2012-10-28 05:42:15 +0100 |
---|---|---|
committer | Peter Stuge <peter@stuge.se> | 2012-10-30 11:57:17 +0000 |
commit | 452248af1d06cb1140b85f53ef4fdee1c746d807 (patch) | |
tree | 1f350e66254f41a2f9b28046298b0889a242bad4 /src/jtag/drivers | |
parent | d2f61e1a4592449188305164b27f495f78dca00a (diff) |
mpsse: Always perform a general reset of the MPSSE in mpsse_open()
Per AN_135 FTDI MPSSE Basics Version 1.1, section 4.2 step 7.
http://www.ftdichip.com/Support/Documents/AppNotes/AN_135_MPSSE_Basics.pdf
This allows to stop and restart OpenOCD reliably, without needing
to power cycle the interface.
Change-Id: Ibeafe5ecfe7b2f6f82712cbc85116904407ddb36
Signed-off-by: Peter Stuge <peter@stuge.se>
Reviewed-on: http://openocd.zylin.com/939
Tested-by: jenkins
Diffstat (limited to 'src/jtag/drivers')
-rw-r--r-- | src/jtag/drivers/mpsse.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c index d6cbc840..92f9331a 100644 --- a/src/jtag/drivers/mpsse.c +++ b/src/jtag/drivers/mpsse.c @@ -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 @@ -315,6 +316,19 @@ struct mpsse_ctx *mpsse_open(const uint16_t *vid, const uint16_t *pid, const cha 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, 0x0b | (BITMODE_MPSSE << 8), ctx->index, NULL, |