X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fmpsse.c;h=41429693c15fe8a347de26cbf3e2d3a9b526e4b8;hb=30fde70c0321fd70d9330d5c6b56ed4e86653dd9;hp=92f9331a543c39385eaa538eaa64889bab62e879;hpb=452248af1d06cb1140b85f53ef4fdee1c746d807;p=openocd.git diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c index 92f9331a54..41429693c1 100644 --- a/src/jtag/drivers/mpsse.c +++ b/src/jtag/drivers/mpsse.c @@ -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);