#include <stdio.h>
#include <stdlib.h>
+#include "ftdi_i.h"
#include "ftdi.h"
#include "ftdi_version_i.h"
\retval 0: all fine
\retval -1: unknown interface
\retval -2: USB device unavailable
+ \retval -3: Device already open, interface can't be set in that state
*/
int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface)
{
if (ftdi == NULL)
ftdi_error_return(-2, "USB device unavailable");
+ if (ftdi->usb_dev != NULL)
+ {
+ int check_interface = interface;
+ if (check_interface == INTERFACE_ANY)
+ check_interface = INTERFACE_A;
+
+ if (ftdi->index != check_interface)
+ ftdi_error_return(-3, "Interface can not be changed on an already open device");
+ }
+
switch (interface)
{
case INTERFACE_ANY:
return 0;
}
-
/**
- Enable bitbang mode.
-
- \deprecated use \ref ftdi_set_bitmode with mode BITMODE_BITBANG instead
+ Enable/disable bitbang modes.
\param ftdi pointer to ftdi_context
\param bitmask Bitmask to configure lines.
HIGH/ON value configures a line as output.
+ \param mode Bitbang mode: use the values defined in \ref ftdi_mpsse_mode
\retval 0: all fine
\retval -1: can't enable bitbang mode
\retval -2: USB device unavailable
*/
-int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask)
+int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
{
unsigned short usb_val;
ftdi_error_return(-2, "USB device unavailable");
usb_val = bitmask; // low byte: bitmask
- /* FT2232C: Set bitbang_mode to 2 to enable SPI */
- usb_val |= (ftdi->bitbang_mode << 8);
-
- if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
- SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index,
- NULL, 0, ftdi->usb_write_timeout) < 0)
- ftdi_error_return(-1, "unable to enter bitbang mode. Perhaps not a BM type chip?");
+ usb_val |= (mode << 8);
+ if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
+ ftdi_error_return(-1, "unable to configure bitbang mode. Perhaps not a BM/2232C type chip?");
- ftdi->bitbang_enabled = 1;
+ ftdi->bitbang_mode = mode;
+ ftdi->bitbang_enabled = (mode == BITMODE_RESET) ? 0 : 1;
return 0;
}
return 0;
}
-/**
- Enable/disable bitbang modes.
-
- \param ftdi pointer to ftdi_context
- \param bitmask Bitmask to configure lines.
- HIGH/ON value configures a line as output.
- \param mode Bitbang mode: use the values defined in \ref ftdi_mpsse_mode
-
- \retval 0: all fine
- \retval -1: can't enable bitbang mode
- \retval -2: USB device unavailable
-*/
-int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
-{
- unsigned short usb_val;
-
- if (ftdi == NULL || ftdi->usb_dev == NULL)
- ftdi_error_return(-2, "USB device unavailable");
-
- usb_val = bitmask; // low byte: bitmask
- usb_val |= (mode << 8);
- if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
- ftdi_error_return(-1, "unable to configure bitbang mode. Perhaps not a 2232C type chip?");
-
- ftdi->bitbang_mode = mode;
- ftdi->bitbang_enabled = (mode == BITMODE_RESET) ? 0 : 1;
- return 0;
-}
/**
Directly read pin state, circumventing the read buffer. Useful for bitbang mode.