]> git.sur5r.net Git - openocd/blobdiff - src/jtag/drivers/mpsse.c
update files to correct FSF address
[openocd] / src / jtag / drivers / mpsse.c
index 92f9331a543c39385eaa538eaa64889bab62e879..13f61d751d5f8413d93c3337cb4227959bed3ccb 100644 (file)
@@ -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);