The following list is of FTDI-specific commands sent via the ioctl system call to the USB driver. The usb_control_msg routine of libusb wraps these commands into the correct ioctl format. The 7 parameters of the usb_control_msg are:
struct usb_device The particular USB device to talk with 1-byte request type Read (0xC0), Write(0x40), or read and write 1-byte command Defined by FTDI firmware 2-byte Value Defined by FTDI firmware 2-byte Index Defined by FTDI firmware pointer to data structure Defined by FTDI firmware 2-byte size of data structure sizeof(data structure) Timeout read or write Timeout (5000 milliseconds is typical)
These are the command messages issued by libftdi routines:
reset: usb_control_msg(ftdi->usb_dev, 0x40, 0x00, 0, Index, NULL, 0, Timeout) purge RX buffer: usb_control_msg(ftdi->usb_dev, 0x40, 0x00, 1, Index, NULL, 0, Timeout) purge TX buffer: usb_control_msg(ftdi->usb_dev, 0x40, 0x00, 2, Index, NULL, 0, Timeout) setflowctrl: usb_control_msg(ftdi->usb_dev, 0x40, 0x01, Value, Index, NULL, 0, Timeout) Value encodes cc parameters, etc. (See ftdi_sio.c in Linux Kernel for details.) Index encodes the following flow control options: 0x00 Disable flow control on Channel A 0x01 Disable flow control on Channel B 0x10 Set RTS/CTS flow control on Channel A 0x11 Set RTS/CTS flow control on Channel B 0x20 Set DTR/DSR flow control on Channel A 0x21 Set DTR/DSR flow control on Channel B 0x40 Set XON/XOFF flow control on Channel A 0x41 Set XON/XOFF flow control on Channel B set DTR: usb_control_msg(ftdi->usb_dev, 0x40, 0x02, Value, Interface, NULL, 0, Timeout) Value is 0x10 to set DTR Low, 0x11 to set DTR High Interface is 0 for Channel A, 1 for Channel B set RTS: usb_control_msg(ftdi->usb_dev, 0x40, 0x02, Value, Interface, NULL, 0, Timeout) Value is 0x20 to set RTS Low, 0x21 to set RTS High Interface is 0 for Channel A, 1 for Channel B set baudrate: usb_control_msg(ftdi->usb_dev, 0x40, 0x03, Value, Index, NULL, 0, Timeout) Value and Index combined encode the divisor and output channel. (See ftdi_convert_baudrate for details.) set line property: usb_control_msg(ftdi->usb_dev, 0x40, 0x04, Value, Interface, NULL, 0, Timeout) Value encodes the number of data bits, stop bits and parity. Bits 0-7: Number of data bits Bits 8-10: Parity: NONE=0x00, ODD=0x01, EVEN=0x02, MARK=0x03, SPACE=0x04 Bits 11-12: Stop bits: STOP_BIT_1=0x00, STOP_BIT_15=0x01, STOP_BIT_2=0x02 Interface is 0 for Channel A, 1 for Channel B get modem status: usb_control_msg(ftdi->usb_dev, 0xC0, 0x05, Value, Interface, (char *)&Value, 0, Timeout) Value is returned with the following bits set: Bit 4: CTS state Bit 5: DSR state Bit 6: RI state Bit 7: RLSD state Interface is 0 for Channel A, 1 for Channel B set event char: usb_control_msg(ftdi->usb_dev, 0x40, 0x06, Value, Interface, NULL, 0, Timeout) Value encodes the event character and whether it is to be used: Bits 0-7: Event character Bit 8: Event character enabled=1, disabled=0 Interface is 0 for Channel A, 1 for Channel B set error char: usb_control_msg(ftdi->usb_dev, 0x40, 0x07, Value, Interface, NULL, 0, Timeout) Value encodes the error character and whether it is to be used: Bits 0-7: Error character Bit 8: Error character enabled=1, disabled=0 set latency time: usb_control_msg(ftdi->usb_dev, 0x40, 0x09, Value, Interface, NULL, 0, Timeout) Value has the latency time with Value between 1 and 255 milliseconds.) Interface is 0 for Channel A, 1 for Channel B get latency time: usb_control_msg(ftdi->usb_dev, 0xC0, 0x0A, 0, Interface, (char *)&Value, 1, Timeout) The current latency time will be placed in Value. Interface is 0 for Channel A, 1 for Channel B enable bitbang: usb_control_msg(ftdi->usb_dev, 0x40, 0x0B, Value, Index, NULL, 0, Timeout) Value encodes the bitmask and bitbang mode (1=normal, 2=SPI bitbang mode). Index encodes channel (1 = Channel A, 2 = Channel B) disable bitbang: usb_control_msg(ftdi->usb_dev, 0x40, 0x0B, 0, Index, NULL, 0, Timeout) Index encodes channel (1 = Channel A, 2 = Channel B) set bitmode: usb_control_msg(ftdi->usb_dev, 0x40, 0x0B, Value, Index, NULL, 0, Timeout) Value encodes the bitmask in bits 0-7 and MPSSE bitmode in bits 8-12. The bitmode bits are: 0x00 Reset I/O Bit Mode 0x01 Asynchronous Bit Bang Mode 0x02 Multi-Protocol Synchronous Serial Engine Mode 0x04 Synchronous Bit Bang Mode 0x08 MCU Host Bus Emulation Mode 0x10 Fast Opto-Isolated Serial Interface Mode Index encodes channel (1 = Channel A, 2 = Channel B) read pins: usb_control_msg(ftdi->usb_dev, 0xC0, 0x0C, 0, Index, (char *)&Value, 1, Timeout) Index encodes channel (1 = Channel A, 2 = Channel B) The bits of Value will contain the pin settings. read eeprom: usb_control_msg(ftdi->usb_dev, 0xC0, 0x90, 0, i, eeprom+(i*2), 2, Timeout) Called for each byte pair read from EEPROM. Results put in the 128-byte eeprom string. write eeprom: usb_control_msg(ftdi->usb_dev, 0x40, 0x91, Value, i, NULL, 0, Timeout) Called for each byte pair to be written to EEPROM address i. Value contains the pair of bytes starting at EEPROM address i. erase eeprom: usb_control_msg(ftdi->usb_dev, 0x40, 0x92, 0, 0, NULL, 0, Timeout)
Last updated: February 19, 2007
Contact Craig Van Degrift if you have problems or questions with this web site.