#include <stdio.h>
#include <stdlib.h>
+#include "ftdi_i.h"
#include "ftdi.h"
+#include "ftdi_version_i.h"
#define ftdi_error_return(code, str) do { \
ftdi->error_str = str; \
ftdi->usb_dev = usb;
}
+/**
+ * @brief Get libftdi library version
+ *
+ * @return ftdi_version_info Library version information
+ **/
+struct ftdi_version_info ftdi_get_library_version()
+{
+ struct ftdi_version_info ver;
+
+ ver.major = FTDI_MAJOR_VERSION;
+ ver.minor = FTDI_MINOR_VERSION;
+ ver.micro = FTDI_MICRO_VERSION;
+ ver.version_str = FTDI_VERSION_STRING;
+ ver.snapshot_str = FTDI_SNAPSHOT_VERSION;
+
+ return ver;
+}
/**
Finds all ftdi devices with given VID:PID on the usb bus. Creates a new
best_divisor = divisor/2;
if(best_divisor > 0x20000)
best_divisor = 0x1ffff;
- best_baud = clk*8/clk_div/best_divisor;
+ best_baud = clk*16/clk_div/best_divisor;
+ if (best_baud & 1) /* Decide if to round up or down*/
+ best_baud = best_baud /2 +1;
+ else
+ best_baud = best_baud /2;
*encoded_divisor = (best_divisor >> 3) | (frac_code[best_divisor & 0x7] << 14);
}
return best_baud;
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.