#ifndef PLATFORMS_HOSTED_WINDOWS_FTDI
#define PLATFORMS_HOSTED_WINDOWS_FTDI
enum ftdi_interface {
INTERFACE_ANY = 0,
INTERFACE_A = 1,
INTERFACE_B = 2,
INTERFACE_C = 3,
INTERFACE_D = 4
};
enum ftdi_module_detach_mode {
AUTO_DETACH_SIO_MODULE = 0,
DONT_DETACH_SIO_MODULE = 1,
AUTO_DETACH_REATACH_SIO_MODULE = 2
};
#define SET_BITS_LOW 0x80U
#define SET_BITS_HIGH 0x82U
#define GET_BITS_LOW 0x81U
#define GET_BITS_HIGH 0x83U
#define LOOPBACK_START 0x84U
#define LOOPBACK_END 0x85U
#define TCK_DIVISOR 0x86U
#define DIS_DIV_5 0x8aU
#define EN_DIV_5 0x8bU
#define EN_3_PHASE 0x8cU
#define DIS_3_PHASE 0x8dU
#define CLK_BITS 0x8eU
#define CLK_BYTES 0x8fU
#define CLK_WAIT_HIGH 0x94U
#define CLK_WAIT_LOW 0x95U
#define EN_ADAPTIVE 0x96U
#define DIS_ADAPTIVE 0x97U
#define CLK_BYTES_OR_HIGH 0x9cU
#define CLK_BYTES_OR_LOW 0x9dU
#define DRIVE_OPEN_COLLECTOR 0x9eU
#define DIV_VALUE(rate) ((rate) > 6000000U) ? 0U : ((6000000U / (rate)-1U) > 0xffffU) ? 0xffffU : (6000000U / (rate)-1U)
#define SEND_IMMEDIATE 0x87U
#define WAIT_ON_HIGH 0x88U
#define WAIT_ON_LOW 0x89U
#define READ_SHORT 0x90U
#define READ_EXTENDED 0x91U
#define WRITE_SHORT 0x92U
#define WRITE_EXTENDED 0x93U
#define MPSSE_WRITE_NEG 0x01U
#define MPSSE_BITMODE 0x02U
#define MPSSE_READ_NEG 0x04U
#define MPSSE_LSB 0x08U
#define MPSSE_DO_WRITE 0x10U
#define MPSSE_DO_READ 0x20U
#define MPSSE_WRITE_TMS 0x40U
enum ftdi_mpsse_mode {
BITMODE_RESET = 0x00,
BITMODE_BITBANG = 0x01,
BITMODE_MPSSE = 0x02,
BITMODE_SYNCBB = 0x04,
BITMODE_MCU = 0x08,
BITMODE_OPTO = 0x10,
BITMODE_CBUS = 0x20,
BITMODE_SYNCFF = 0x40,
BITMODE_FT1284 = 0x80,
};
enum ftdi_chip_type {
TYPE_AM = 0,
TYPE_BM = 1,
TYPE_2232C = 2,
TYPE_R = 3,
TYPE_2232H = 4,
TYPE_4232H = 5,
TYPE_232H = 6,
TYPE_230X = 7,
};
struct ftdi_context {
struct libusb_context *usb_ctx;
struct libusb_device_handle *usb_dev;
int usb_read_timeout;
int usb_write_timeout;
enum ftdi_chip_type type;
int baudrate;
unsigned char bitbang_enabled;
unsigned char *readbuffer;
unsigned int readbuffer_offset;
unsigned int readbuffer_remaining;
unsigned int readbuffer_chunksize;
unsigned int writebuffer_chunksize;
unsigned int max_packet_size;
int interface;
int index;
int in_ep;
int out_ep;
unsigned char bitbang_mode;
struct ftdi_eeprom *eeprom;
const char *error_str;
enum ftdi_module_detach_mode module_detach_mode;
};
struct ftdi_context *ftdi_new(void);
int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface);
int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate);
int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product, const char *description, const char *serial);
int ftdi_usb_close(struct ftdi_context *ftdi);
void ftdi_free(struct ftdi_context *ftdi);
int ftdi_usb_purge_buffers(struct ftdi_context *ftdi);
int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency);
int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode);
int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size);
int ftdi_write_data(struct ftdi_context *ftdi, const unsigned char *buf, int size);
int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize);
const char *ftdi_get_error_string(struct ftdi_context *ftdi);
#endif