#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
case 0x800:
ctx->type = TYPE_FT4232H;
break;
+ case 0x900:
+ ctx->type = TYPE_FT232H;
+ break;
default:
LOG_ERROR("unsupported FTDI chip type: 0x%04x", desc.bcdDevice);
goto error;
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,
while (length > 0) {
/* Guarantee buffer space enough for a minimum size transfer */
- if (buffer_write_space(ctx) + (length < 8) < (out ? 4 : 3)
- || (in && buffer_read_space(ctx) < 1))
+ if (buffer_write_space(ctx) + (length < 8) < (out || (!out && !in) ? 4 : 3)
+ || (in && buffer_read_space(ctx) < 1))
retval = mpsse_flush(ctx);
if (length < 8) {
if (this_bytes > 65536)
this_bytes = 65536;
/* Buffer space limit. We already made sure there's space for the minimum
- *transfer. */
- if (out && this_bytes + 3 > buffer_write_space(ctx))
+ * transfer. */
+ if ((out || (!out && !in)) && this_bytes + 3 > buffer_write_space(ctx))
this_bytes = buffer_write_space(ctx) - 3;
if (in && this_bytes > buffer_read_space(ctx))
this_bytes = buffer_read_space(ctx);