X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=blobdiff_plain;f=src%2Fftdi.h;h=b7c011377a42bb8d23f7eb48189f9d8e06e90fcb;hp=60cc6a1fadf773ceeefad91902b355b44feaf4eb;hb=e375e6cb72af68379ae42c536728a992df0046e5;hpb=49c5ac7264ef3e1bed2a4a1e290028eb48b3bf44 diff --git a/src/ftdi.h b/src/ftdi.h index 60cc6a1..b7c0113 100644 --- a/src/ftdi.h +++ b/src/ftdi.h @@ -2,7 +2,7 @@ ftdi.h - description ------------------- begin : Fri Apr 4 2003 - copyright : (C) 2003 by Intra2net AG + copyright : (C) 2003-2011 by Intra2net AG and the libftdi developers email : opensource@intra2net.com ***************************************************************************/ @@ -17,12 +17,13 @@ #ifndef __libftdi_h__ #define __libftdi_h__ -#include +#include -#define FTDI_DEFAULT_EEPROM_SIZE 128 +/* Even on 93xx66 at max 256 bytes are used (AN_121)*/ +#define FTDI_MAX_EEPROM_SIZE 256 /** FTDI chip type */ -enum ftdi_chip_type { TYPE_AM=0, TYPE_BM=1, TYPE_2232C=2, TYPE_R=3 }; +enum ftdi_chip_type { TYPE_AM=0, TYPE_BM=1, TYPE_2232C=2, TYPE_R=3, TYPE_2232H=4, TYPE_4232H=5 }; /** Parity mode for ftdi_set_line_property() */ enum ftdi_parity_type { NONE=0, ODD=1, EVEN=2, MARK=3, SPACE=4 }; /** Number of stop bits for ftdi_set_line_property() */ @@ -33,22 +34,27 @@ enum ftdi_bits_type { BITS_7=7, BITS_8=8 }; enum ftdi_break_type { BREAK_OFF=0, BREAK_ON=1 }; /** MPSSE bitbang modes */ -enum ftdi_mpsse_mode { - BITMODE_RESET = 0x00, - BITMODE_BITBANG= 0x01, - BITMODE_MPSSE = 0x02, - BITMODE_SYNCBB = 0x04, - BITMODE_MCU = 0x08, - /* CPU-style fifo mode gets set via EEPROM */ - BITMODE_OPTO = 0x10, - BITMODE_CBUS = 0x20 +enum ftdi_mpsse_mode +{ + BITMODE_RESET = 0x00, /**< switch off bitbang mode, back to regular serial/FIFO */ + BITMODE_BITBANG= 0x01, /**< classical asynchronous bitbang mode, introduced with B-type chips */ + BITMODE_MPSSE = 0x02, /**< MPSSE mode, available on 2232x chips */ + BITMODE_SYNCBB = 0x04, /**< synchronous bitbang mode, available on 2232x and R-type chips */ + BITMODE_MCU = 0x08, /**< MCU Host Bus Emulation mode, available on 2232x chips */ + /* CPU-style fifo mode gets set via EEPROM */ + BITMODE_OPTO = 0x10, /**< Fast Opto-Isolated Serial Interface Mode, available on 2232x chips */ + BITMODE_CBUS = 0x20, /**< Bitbang on CBUS pins of R-type chips, configure in EEPROM before */ + BITMODE_SYNCFF = 0x40, /**< Single Channel Synchronous FIFO mode, available on 2232H chips */ }; -/** Port interface for FT2232C */ -enum ftdi_interface { +/** Port interface for chips with multiple interfaces */ +enum ftdi_interface +{ INTERFACE_ANY = 0, INTERFACE_A = 1, - INTERFACE_B = 2 + INTERFACE_B = 2, + INTERFACE_C = 3, + INTERFACE_D = 4 }; /* Shifting commands IN MPSSE Mode*/ @@ -77,7 +83,7 @@ enum ftdi_interface { #define DIV_VALUE(rate) (rate > 6000000)?0:((6000000/rate -1) > 0xffff)? 0xffff: (6000000/rate -1) /* Commands in MPSSE and Host Emulation Mode */ -#define SEND_IMMEDIATE 0x87 +#define SEND_IMMEDIATE 0x87 #define WAIT_ON_HIGH 0x88 #define WAIT_ON_LOW 0x89 @@ -100,8 +106,8 @@ enum ftdi_interface { #define SIO_SET_BAUD_RATE 3 /* Set baud rate */ #define SIO_SET_DATA 4 /* Set the data characteristics of the port */ -#define FTDI_DEVICE_OUT_REQTYPE (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT) -#define FTDI_DEVICE_IN_REQTYPE (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN) +#define FTDI_DEVICE_OUT_REQTYPE (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT) +#define FTDI_DEVICE_IN_REQTYPE (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN) /* Requests */ #define SIO_RESET_REQUEST SIO_RESET @@ -125,7 +131,7 @@ enum ftdi_interface { #define SIO_RESET_PURGE_RX 1 #define SIO_RESET_PURGE_TX 2 -#define SIO_DISABLE_FLOW_CTRL 0x0 +#define SIO_DISABLE_FLOW_CTRL 0x0 #define SIO_RTS_CTS_HS (0x1 << 8) #define SIO_DTR_DSR_HS (0x2 << 8) #define SIO_XON_XOFF_HS (0x4 << 8) @@ -143,15 +149,127 @@ enum ftdi_interface { (taken from libusb) */ #define FTDI_URB_USERCONTEXT_COOKIE ((void *)0x1) +#ifdef __GNUC__ + #define DEPRECATED(func) func __attribute__ ((deprecated)) +#elif defined(_MSC_VER) + #define DEPRECATED(func) __declspec(deprecated) func +#else + #pragma message("WARNING: You need to implement DEPRECATED for this compiler") + #define DEPRECATED(func) func +#endif + +struct ftdi_transfer_control +{ + int completed; + unsigned char *buf; + int size; + int offset; + struct ftdi_context *ftdi; + struct libusb_transfer *transfer; +}; + +/** + \brief FTDI eeprom structure +*/ +struct ftdi_eeprom +{ + /** vendor id */ + int vendor_id; + /** product id */ + int product_id; + + /** self powered */ + int self_powered; + /** remote wakeup */ + int remote_wakeup; + + int is_not_pnp; + + /* Suspend on DBUS7 Low */ + int suspend_dbus7; + + /** input in isochronous transfer mode */ + int in_is_isochronous; + /** output in isochronous transfer mode */ + int out_is_isochronous; + /** suspend pull downs */ + int suspend_pull_downs; + + /** use serial */ + int use_serial; + /** usb version */ + int usb_version; + /** Use usb version on FT2232 devices*/ + int use_usb_version; + /** maximum power */ + int max_power; + + /** manufacturer name */ + char *manufacturer; + /** product name */ + char *product; + /** serial number */ + char *serial; + + /* 2232D/H(/FT4432H?) specific */ + /* Hardware type, 0 = RS232 Uart, 1 = 245 FIFO, 2 = CPU FIFO, + 4 = OPTO Isolate */ + int channel_a_type; + int channel_b_type; + /* Driver Type, 1 = VCP */ + int channel_a_driver; + int channel_b_driver; + + /* Special function of FT232R devices (and possibly others as well) */ + /** CBUS pin function. See CBUS_xxx defines. */ + int cbus_function[5]; + /** Select hight current drive on R devices. */ + int high_current; + /** Select hight current drive on A channel (2232C */ + int high_current_a; + /** Select hight current drive on B channel (2232C). */ + int high_current_b; + /** Select inversion of data lines (bitmask). */ + int invert; + + /*2232H/4432H Group specific values */ + /* Group0 is AL on 2322H and A on 4232H + Group1 is AH on 2232H and B on 4232H + Group2 is BL on 2322H and C on 4232H + Group3 is BH on 2232H and C on 4232H*/ + int group0_drive; + int group0_schmitt; + int group0_slew; + int group1_drive; + int group1_schmitt; + int group1_slew; + int group2_drive; + int group2_schmitt; + int group2_slew; + int group3_drive; + int group3_schmitt; + int group3_slew; + + /** eeprom size in bytes. This doesn't get stored in the eeprom + but is the only way to pass it to ftdi_eeprom_build. */ + int size; + /* EEPROM Type 0x46 for 93xx46, 0x56 for 93xx56 and 0x66 for 93xx66*/ + int chip; + unsigned char buf[FTDI_MAX_EEPROM_SIZE]; +}; + /** \brief Main context structure for all libftdi functions. Do not access directly if possible. */ -struct ftdi_context { +struct ftdi_context +{ /* USB specific */ + /** libusb's context */ + struct libusb_context *usb_ctx; /** libusb's usb_dev_handle */ - struct usb_dev_handle *usb_dev; + struct libusb_device_handle *usb_dev; /** usb read timeout */ int usb_read_timeout; /** usb write timeout */ @@ -174,6 +292,8 @@ struct ftdi_context { unsigned int readbuffer_chunksize; /** write buffer chunk size */ unsigned int writebuffer_chunksize; + /** maximum packet size. Needed for filtering modem status bytes every n packets. */ + unsigned int max_packet_size; /* FTDI FT2232C requirecments */ /** FT2232C interface number: 0 or 1 */ @@ -188,89 +308,159 @@ struct ftdi_context { /** Bitbang mode. 1: (default) Normal bitbang mode, 2: FT2232C SPI bitbang mode */ unsigned char bitbang_mode; - /** EEPROM size. Default is 128 bytes for 232BM and 245BM chips */ - int eeprom_size; + /** Decoded eeprom structure */ + struct ftdi_eeprom *eeprom; /** String representation of last error */ char *error_str; +}; - /** Buffer needed for async communication */ - char *async_usb_buffer; - /** Number of URB-structures we can buffer */ - unsigned int async_usb_buffer_size; +/** + List all handled EEPROM values. + Append future new values only at the end to provide API/ABI stability*/ +enum ftdi_eeprom_value +{ + VENDOR_ID = 0, + PRODUCT_ID = 1, + SELF_POWERED = 2, + REMOTE_WAKEUP = 3, + IS_NOT_PNP = 4, + SUSPEND_DBUS7 = 5, + IN_IS_ISOCHRONOUS = 6, + OUT_IS_ISOCHRONOUS = 7, + SUSPEND_PULL_DOWNS = 8, + USE_SERIAL = 9, + USB_VERSION = 10, + USE_USB_VERSION = 11, + MAX_POWER = 12, + CHANNEL_A_TYPE = 13, + CHANNEL_B_TYPE = 14, + CHANNEL_A_DRIVER = 15, + CHANNEL_B_DRIVER = 16, + CBUS_FUNCTION_0 = 17, + CBUS_FUNCTION_1 = 18, + CBUS_FUNCTION_2 = 19, + CBUS_FUNCTION_3 = 20, + CBUS_FUNCTION_4 = 21, + HIGH_CURRENT = 22, + HIGH_CURRENT_A = 23, + HIGH_CURRENT_B = 24, + INVERT = 25, + GROUP0_DRIVE = 26, + GROUP0_SCHMITT = 27, + GROUP0_SLEW = 28, + GROUP1_DRIVE = 29, + GROUP1_SCHMITT = 30, + GROUP1_SLEW = 31, + GROUP2_DRIVE = 32, + GROUP2_SCHMITT = 33, + GROUP2_SLEW = 34, + GROUP3_DRIVE = 35, + GROUP3_SCHMITT = 36, + GROUP3_SLEW = 37, + CHIP_SIZE = 38, + CHIP_TYPE = 39 }; /** \brief list of usb devices created by ftdi_usb_find_all() */ -struct ftdi_device_list { +struct ftdi_device_list +{ /** pointer to next entry */ struct ftdi_device_list *next; /** pointer to libusb's usb_device */ - struct usb_device *dev; + struct libusb_device *dev; }; +#define USE_SERIAL_NUM 0x08 +enum ftdi_cbus_func {/* FIXME: Recheck value, especially the last */ + CBUS_TXDEN = 0, CBUS_PWREN = 1, CBUS_RXLED = 2, CBUS_TXLED = 3, CBUS_TXRXLED = 4, + CBUS_SLEEP = 5, CBUS_CLK48 = 6, CBUS_CLK24 = 7, CBUS_CLK12 = 8, CBUS_CLK6 = 9, + CBUS_IOMODE = 0xa, CBUS_BB_WR = 0xb, CBUS_BB_RD = 0xc, CBUS_BB = 0xd}; + +/** Invert TXD# */ +#define INVERT_TXD 0x01 +/** Invert RXD# */ +#define INVERT_RXD 0x02 +/** Invert RTS# */ +#define INVERT_RTS 0x04 +/** Invert CTS# */ +#define INVERT_CTS 0x08 +/** Invert DTR# */ +#define INVERT_DTR 0x10 +/** Invert DSR# */ +#define INVERT_DSR 0x20 +/** Invert DCD# */ +#define INVERT_DCD 0x40 +/** Invert RI# */ +#define INVERT_RI 0x80 + +/** Interface Mode. */ +#define CHANNEL_IS_UART 0x0 +#define CHANNEL_IS_245 0x1 +#define CHANNEL_IS_CPU 0x2 +#define CHANNEL_IS_OPTO 0x4 + +#define DRIVE_4MA 0 +#define DRIVE_8MA 1 +#define DRIVE_12MA 2 +#define DRIVE_16MA 3 +#define SLOW_SLEW 4 +#define IS_SCHMITT 8 + +/** Driver Type. */ +#define DRIVER_VCP 0x08 + +#define USE_USB_VERSION_BIT 0x10 + +#define SUSPEND_DBUS7_BIT 0x80 + +/** High current drive. */ +#define HIGH_CURRENT_DRIVE 0x10 +#define HIGH_CURRENT_DRIVE_R 0x04 + /** - \brief FTDI eeprom structure + \brief Progress Info for streaming read */ -struct ftdi_eeprom { - /** vendor id */ - int vendor_id; - /** product id */ - int product_id; - - /** self powered */ - int self_powered; - /** remote wakeup */ - int remote_wakeup; - /** chip type */ - int BM_type_chip; - - /** input in isochronous transfer mode */ - int in_is_isochronous; - /** output in isochronous transfer mode */ - int out_is_isochronous; - /** suspend pull downs */ - int suspend_pull_downs; +struct size_and_time +{ + uint64_t totalBytes; + struct timeval time; +}; - /** use serial */ - int use_serial; - /** fake usb version */ - int change_usb_version; - /** usb version */ - int usb_version; - /** maximum power */ - int max_power; +typedef struct +{ + struct size_and_time first; + struct size_and_time prev; + struct size_and_time current; + double totalTime; + double totalRate; + double currentRate; +} FTDIProgressInfo; - /** manufacturer name */ - char *manufacturer; - /** product name */ - char *product; - /** serial number */ - char *serial; +typedef int (FTDIStreamCallback)(uint8_t *buffer, int length, + FTDIProgressInfo *progress, void *userdata); - /** eeprom size in bytes. This doesn't get stored in the eeprom - but is the only way to pass it to ftdi_eeprom_build. */ - int size; -}; #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif int ftdi_init(struct ftdi_context *ftdi); - struct ftdi_context *ftdi_new(); + struct ftdi_context *ftdi_new(void); int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface); void ftdi_deinit(struct ftdi_context *ftdi); void ftdi_free(struct ftdi_context *ftdi); - void ftdi_set_usbdev (struct ftdi_context *ftdi, usb_dev_handle *usbdev); + void ftdi_set_usbdev (struct ftdi_context *ftdi, struct libusb_device_handle *usbdev); int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist, int vendor, int product); void ftdi_list_free(struct ftdi_device_list **devlist); void ftdi_list_free2(struct ftdi_device_list *devlist); - int ftdi_usb_get_strings(struct ftdi_context *ftdi, struct usb_device *dev, + int ftdi_usb_get_strings(struct ftdi_context *ftdi, struct libusb_device *dev, char * manufacturer, int mnf_len, char * description, int desc_len, char * serial, int serial_len); @@ -278,7 +468,10 @@ extern "C" { int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product); int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product, const char* description, const char* serial); - int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev); + int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product, + const char* description, const char* serial, unsigned int index); + int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct libusb_device *dev); + int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description); int ftdi_usb_close(struct ftdi_context *ftdi); int ftdi_usb_reset(struct ftdi_context *ftdi); @@ -290,8 +483,8 @@ extern "C" { int ftdi_set_line_property(struct ftdi_context *ftdi, enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity); int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits, - enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity, - enum ftdi_break_type break_type); + enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity, + enum ftdi_break_type break_type); int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size); int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize); @@ -301,10 +494,15 @@ extern "C" { int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize); int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize); + int ftdi_readstream(struct ftdi_context *ftdi, FTDIStreamCallback *callback, + void *userdata, int packetsPerTransfer, int numTransfers); int ftdi_write_data_async(struct ftdi_context *ftdi, unsigned char *buf, int size); void ftdi_async_complete(struct ftdi_context *ftdi, int wait_for_more); - int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask); + struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size); + int ftdi_transfer_data_done(struct ftdi_transfer_control *tc); + + int DEPRECATED(ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask)); int ftdi_disable_bitbang(struct ftdi_context *ftdi); int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode); int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins); @@ -323,22 +521,26 @@ extern "C" { int ftdi_set_event_char(struct ftdi_context *ftdi, unsigned char eventch, unsigned char enable); int ftdi_set_error_char(struct ftdi_context *ftdi, unsigned char errorch, unsigned char enable); - /* set eeprom size */ - void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom, int size); + /* init eeprom for the given FTDI type */ + int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, + char * manufacturer, char *product, + char * serial); + int ftdi_eeprom_build(struct ftdi_context *ftdi); + int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose); - /* init and build eeprom from ftdi_eeprom structure */ - void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom); - int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output); - int ftdi_eeprom_decode(struct ftdi_eeprom *eeprom, unsigned char *output, int size); + int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value value_name, int* value); + int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value value_name, int value); - /* "eeprom" needs to be valid 128 byte eeprom (generated by the eeprom generator) - the checksum of the eeprom is valided */ - int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom); + int ftdi_get_eeprom_buf(struct ftdi_context *ftdi, unsigned char * buf, int size); + + int ftdi_read_eeprom(struct ftdi_context *ftdi); int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid); - int ftdi_read_eeprom_getsize(struct ftdi_context *ftdi, unsigned char *eeprom, int maxsize); - int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom); + int ftdi_write_eeprom(struct ftdi_context *ftdi); int ftdi_erase_eeprom(struct ftdi_context *ftdi); + int ftdi_read_eeprom_location (struct ftdi_context *ftdi, int eeprom_addr, unsigned short *eeprom_val); + int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr, unsigned short eeprom_val); + char *ftdi_get_error_string(struct ftdi_context *ftdi); #ifdef __cplusplus