* 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
#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
err = libusb_open(device, &ctx->usb_dev);
if (err != LIBUSB_SUCCESS) {
- LOG_ERROR("libusb_open() failed with %d", err);
+ LOG_ERROR("libusb_open() failed with %s",
+ libusb_error_name(err));
continue;
}
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,
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 };
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);