X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=blobdiff_plain;f=src%2Fftdi.h;h=4e3880ee74405e9ed589e5297aca66c7034cbb9d;hp=03bb167d5949e4ccd09002cff29d1aa348a0134c;hb=b9c1e31765740e24a34112a3df58e95646b2316b;hpb=85394e6249329e13fd8530a5aeb72355c5340d62 diff --git a/src/ftdi.h b/src/ftdi.h index 03bb167..4e3880e 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 ***************************************************************************/ @@ -19,11 +19,11 @@ #include -/* Evne on 93xx66 at max 256 bytes are used (AN_121)*/ +/* 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, TYPE_2232H=4, TYPE_4232H=5 }; +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 }; /** 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() */ @@ -45,6 +45,7 @@ enum ftdi_mpsse_mode 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 */ + BITMODE_FT1284 = 0x80, /**< FT1284 mode, available on 232H chips */ }; /** Port interface for chips with multiple interfaces */ @@ -57,6 +58,13 @@ enum ftdi_interface INTERFACE_D = 4 }; +/** Automatic loading / unloading of kernel modules */ +enum ftdi_module_detach_mode +{ + AUTO_DETACH_SIO_MODULE = 0, + DONT_DETACH_SIO_MODULE = 1 +}; + /* Shifting commands IN MPSSE Mode*/ #define MPSSE_WRITE_NEG 0x01 /* Write TDI/DO on negative TCK/SK edge*/ #define MPSSE_BITMODE 0x02 /* Write bits, not bytes */ @@ -78,6 +86,21 @@ enum ftdi_interface #define LOOPBACK_START 0x84 #define LOOPBACK_END 0x85 #define TCK_DIVISOR 0x86 +/* H Type specific commands */ +#define DIS_DIV_5 0x8a +#define EN_DIV_5 0x8b +#define EN_3_PHASE 0x8c +#define DIS_3_PHASE 0x8d +#define CLK_BITS 0x8e +#define CLK_BYTES 0x8f +#define CLK_WAIT_HIGH 0x94 +#define CLK_WAIT_LOW 0x95 +#define EN_ADAPTIVE 0x96 +#define DIS_ADAPTIVE 0x97 +#define CLK_BYTES_OR_HIGH 0x9c +#define CLK_BYTES_OR_LOW 0x0d +/*FT232H specific commands */ +#define DRIVE_OPEN_COLLECTOR 0x9e /* Value Low */ /* Value HIGH */ /*rate is 12000000/((1+value)*2) */ #define DIV_VALUE(rate) (rate > 6000000)?0:((6000000/rate -1) > 0xffff)? 0xffff: (6000000/rate -1) @@ -177,13 +200,20 @@ struct ftdi_eeprom int vendor_id; /** product id */ int product_id; + + /** Was the eeprom structure initialized for the actual + connected device? **/ + int initialized_for_connected_device; /** self powered */ int self_powered; /** remote wakeup */ int remote_wakeup; - /** release */ - int release; + + int is_not_pnp; + + /* Suspend on DBUS7 Low */ + int suspend_dbus7; /** input in isochronous transfer mode */ int in_is_isochronous; @@ -194,11 +224,11 @@ struct ftdi_eeprom /** use serial */ int use_serial; - /** fake usb version */ - int change_usb_version; /** usb version */ int usb_version; - /** maximum power */ + /** Use usb version on FT2232 devices*/ + int use_usb_version; + /** maximum power */ int max_power; /** manufacturer name */ @@ -208,21 +238,57 @@ struct ftdi_eeprom /** serial number */ char *serial; - /* Special function of FT232R devices (and possibly others as well) */ + /* 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/FT232H devices (and possibly others as well) */ /** CBUS pin function. See CBUS_xxx defines. */ - int cbus_function[5]; - /** Select hight current drive. */ + int cbus_function[10]; + /** 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 port (2232C). */ + /** 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; + + int powersave; + + int clock_polarity; + int data_order; + int flow_control; + /** 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 46 for 93xx46, 56 for 93xx56 and 66 for 93xx66*/ + /* EEPROM Type 0x46 for 93xx46, 0x56 for 93xx56 and 0x66 for 93xx66*/ int chip; + unsigned char buf[FTDI_MAX_EEPROM_SIZE]; }; /** @@ -280,6 +346,65 @@ struct ftdi_context /** String representation of last error */ char *error_str; + + /** Defines behavior in case a kernel module is already attached to the device */ + enum ftdi_module_detach_mode module_detach_mode; +}; + +/** + 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, + CBUS_FUNCTION_5 = 22, + CBUS_FUNCTION_6 = 23, + CBUS_FUNCTION_7 = 24, + CBUS_FUNCTION_8 = 25, + CBUS_FUNCTION_9 = 26, + HIGH_CURRENT = 27, + HIGH_CURRENT_A = 28, + HIGH_CURRENT_B = 29, + INVERT = 30, + GROUP0_DRIVE = 31, + GROUP0_SCHMITT = 32, + GROUP0_SLEW = 33, + GROUP1_DRIVE = 34, + GROUP1_SCHMITT = 35, + GROUP1_SLEW = 36, + GROUP2_DRIVE = 37, + GROUP2_SCHMITT = 38, + GROUP2_SLEW = 39, + GROUP3_DRIVE = 40, + GROUP3_SCHMITT = 41, + GROUP3_SLEW = 42, + CHIP_SIZE = 43, + CHIP_TYPE = 44, + POWER_SAVE = 45, + CLOCK_POLARITY = 46, + DATA_ORDER = 47, + FLOW_CONTROL = 48 }; /** @@ -292,34 +417,21 @@ struct ftdi_device_list /** pointer to libusb's usb_device */ struct libusb_device *dev; }; - -/** TXDEN */ -#define CBUS_TXDEN 0 -/** PWREN# */ -#define CBUS_PWREN 1 -/** RXLED# */ -#define CBUS_RXLED 2 -/** TXLED#*/ -#define CBUS_TXLED 3 -/** RXLED# & TXLED# */ -#define CBUS_TXRXLED 4 -/** SLEEP# */ -#define CBUS_SLEEP 5 -/** 48 MHz clock */ -#define CBUS_CLK48 6 -/** 24 MHz clock */ -#define CBUS_CLK24 7 -/** 12 MHz clock */ -#define CBUS_CLK12 8 -/** 6 MHz clock */ -#define CBUS_CLK6 9 -/** Bitbang IO Mode*/ -#define CBUS_IOMODE 10 -/** Bitbang IO WR#*/ -#define CBUS_BB_WR 11 -/** Bitbang IO RD#*/ -#define CBUS_BB_RD 12 - +#define FT1284_CLK_IDLE_STATE 0x01 +#define FT1284_DATA_LSB 0x02 /* DS_FT232H 1.3 amd ftd2xx.h 1.0.4 disagree here*/ +#define FT1284_FLOW_CONTROL 0x04 +#define POWER_SAVE_DISABLE_H 0x80 + +#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}; + +enum ftdi_cbush_func {/* FIXME: Recheck value, especially the last */ + CBUSH_TRISTATE = 0, CBUSH_RXLED = 1, CBUSH_TXLED = 2, CBUSH_TXRXLED = 3, CBUSH_PWREN = 4, + CBUSH_SLEEP = 5, CBUSH_DRIVE_0 = 6, CBUSG_DRIVE1 = 7, CBUSH_IOMODE = 8, CBUSH_TXDEN = 9, + CBUSH_CLK30 = 0xa, CBUSH_CLK15 = 0xb, CBUSH_CLK7_5 = 0xc}; /** Invert TXD# */ #define INVERT_TXD 0x01 @@ -338,8 +450,31 @@ struct ftdi_device_list /** Invert RI# */ #define INVERT_RI 0x80 +/** Interface Mode. */ +#define CHANNEL_IS_UART 0x0 +#define CHANNEL_IS_FIFO 0x1 +#define CHANNEL_IS_OPTO 0x2 +#define CHANNEL_IS_CPU 0x4 +#define CHANNEL_IS_FT1284 0x8 + +#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 DRIVER_VCPH 0x10 /* FT232H has moved the VCP bit */ + +#define USE_USB_VERSION_BIT 0x10 + +#define SUSPEND_DBUS7_BIT 0x80 + /** High current drive. */ -#define HIGH_CURRENT_DRIVE 0x10 +#define HIGH_CURRENT_DRIVE 0x10 +#define HIGH_CURRENT_DRIVE_R 0x04 /** \brief Progress Info for streaming read @@ -442,20 +577,22 @@ 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); + + 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); - /* init and build eeprom from ftdi_eeprom structure */ - void ftdi_eeprom_initdefaults(struct ftdi_context *ftdi); - void ftdi_eeprom_free(struct ftdi_context *ftdi); - int ftdi_eeprom_build(struct ftdi_context *ftdi, unsigned char *output); - int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *output, int size, int verbose); + int ftdi_get_eeprom_buf(struct ftdi_context *ftdi, unsigned char * buf, int size); + int ftdi_set_eeprom_buf(struct ftdi_context *ftdi, const unsigned char * buf, int size); - /* "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_read_eeprom(struct ftdi_context *ftdi); int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid); - 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);