X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fmpsse.c;h=13f61d751d5f8413d93c3337cb4227959bed3ccb;hp=92f9331a543c39385eaa538eaa64889bab62e879;hb=refs%2Fchanges%2F26%2F1426%2F4;hpb=452248af1d06cb1140b85f53ef4fdee1c746d807 diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c index 92f9331a54..13f61d751d 100644 --- a/src/jtag/drivers/mpsse.c +++ b/src/jtag/drivers/mpsse.c @@ -15,7 +15,7 @@ * 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., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H @@ -55,7 +55,6 @@ #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 @@ -313,19 +312,6 @@ 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, @@ -793,11 +779,8 @@ int mpsse_flush(struct mpsse_ctx *ctx) if (ctx->read_count) { buffer_write_byte(ctx, 0x87); /* SEND_IMMEDIATE */ read_result.done = false; - read_transfer = libusb_alloc_transfer(0); - libusb_fill_bulk_transfer(read_transfer, ctx->usb_dev, ctx->in_ep, ctx->read_chunk, - ctx->read_chunk_size, read_cb, &read_result, - ctx->usb_read_timeout); - retval = libusb_submit_transfer(read_transfer); + /* delay read transaction to ensure the FTDI chip can support us with data + immediately after processing the MPSSE commands in the write transaction */ } struct transfer_result write_result = { .ctx = ctx, .done = false }; @@ -806,6 +789,14 @@ int mpsse_flush(struct mpsse_ctx *ctx) ctx->write_count, write_cb, &write_result, ctx->usb_write_timeout); retval = libusb_submit_transfer(write_transfer); + if (ctx->read_count) { + read_transfer = libusb_alloc_transfer(0); + libusb_fill_bulk_transfer(read_transfer, ctx->usb_dev, ctx->in_ep, ctx->read_chunk, + ctx->read_chunk_size, read_cb, &read_result, + ctx->usb_read_timeout); + retval = libusb_submit_transfer(read_transfer); + } + /* Polling loop, more or less taken from libftdi */ while (!write_result.done || !read_result.done) { retval = libusb_handle_events(ctx->usb_ctx);