FT2232H and FT4232H
The fifth generation of fixed-function D2xx devices, an upgrade to FT2232D. There are two base devices:
- FT2232H: has two channels with 16 IO pins each and a large selection of operating modes
- FT4232H: has four channels with 8 IO pins each and a smaller selection of operating modes
Both of these devices are actually the same silicon, and are thus highly similar. Whether a device is FT2232H or FT4232H is determined by a fuse programmed at the factory. Note that the FT232H is not another variant of the same silicon, but a completely distinct device with different capabilities.
The devices have automotive variants, known as FT2232HA and FT4232HA. It is not known what their functional differences are, if any.
The devices also have USB-PD variants, which integrate a power delivery core into the same die. The D2xx function and the power delivery function are largely separate and operate independently, but they do share the same configuration EEPROM. The USB-PD variants are:
- FT2233HP and FT4233HP: two USB-PD ports
- FT2232HP and FT4232HP: one USB-PD port (actually identical to FTx233HP with the extra port unbonded)
All USB-PD variants are the same silicon (which is distinct from the "base" FT2232H silicon).
This document will use the name FT2232H to refer to FT2232HA/FT2232HP/FT2233HP as well, unless otherwise specified. The same applies for FT4232H.
Features:
- is a high-speed USB 2.0 peripherial
- supports higher UART baud rates and bitbang/FIFO/MPSSE speeds thanks to the extra oomph
- integrated D+ pullup resistor
- dual-channel (FT2232H) or quad-channel (FT4232H) D2xx device
- each channel can be independently configured to one of several supported modes:
- FT232B-like UART mode (default)
- FT245B-like FIFO mode (selected in EEPROM; FT2232H only)
- new synchronous FIFO mode (dynamically selected variant of FIFO mode; FT2232H only)
- available on channel A only
- NOTE: channel B cannot be used while this mode is active, as it reuses channel B's buffer resources
- FT2232D-like CPU FIFO mode (selected in EEPROM; FT2232H only)
- FT2xxB-like async bitbang mode (dynamically selected)
- FT2232C-like sync bitbang mode (dynamically selected)
- FT2232C-like MPSSE mode (dynamically selected)
- on FT2232H, supported on both channels (an improvement from FT2232C)
- on FT4232H, supported on channels A and B only
- FT2232C-like fast opto-isolated serial mode (selected in EEPROM; FT2232H only)
- FT2232C-like MCU bus controller mode (dynamically selected; FT2232H only, uses both channels)
- FT2232H: 4kiB IN FIFO and 4kiB OUT FIFO for each channel
- FT4232H: 2kiB IN FIFO and 2kiB OUT FIFO for each channel
- 120MHz internal base clock, generated from 12MHz crystal
- internal 3.3V to 1.8V LDO
- 1.8V VCORE power supply for internal logic; can be connected to internal LDO
- 3.3V VCCIO power supply for business-end IO
- 3.3V VPHY power supply for USB PHY
- 3.3V separate AGND and VPLL power supply for PHY PLL
- internal power-on reset circuit
- required external support circuitry:
- precision resistor for PHY current reference
- VBUS to 3.3V LDO (or other 3.3V power source)
- decoupling capacitor for internal LDO
- 12MHz crystal
- optionally, a 93LC46 (64×16-bit), 93LC56 (128×16-bit), or 93LC66 (256×16-bit) EEPROM
For USB-PD devices, the USB-PD function is described on the USB-PD page.
The full list of devices is:
| device | channels | USB-PD ports | default VID:PID | bcdDevice | package |
|---|---|---|---|---|---|
| FT2232HL | 2 | - | 0403:6010 | 0x0700 | 64-pin LQFP |
| FT2232HQ | 2 | - | 0403:6010 | 0x0700 | 64-pin QFN |
| FT2232H-56Q | 2 | - | 0403:6010 | 0x0700 | 56-pin VQFN |
| FT4232HL | 4 | - | 0403:6011 | 0x0800 | 64-pin LQFP |
| FT4232HQ | 4 | - | 0403:6011 | 0x0800 | 64-pin QFN |
| FT4232H-56Q | 4 | - | 0403:6011 | 0x0800 | 56-pin VQFN |
| FT2233HPQ | 2 | 2 | 0403:6040 | 0x2800 | 76-pin QFN |
| FT4233HPQ | 4 | 2 | 0403:6041 | 0x2900 | 76-pin QFN |
| FT2232HPQ | 2 | 1 | 0403:6042 | 0x2a00 | 68-pin QFN |
| FT4232HPQ | 4 | 1 | 0403:6043 | 0x2b00 | 68-pin QFN |
| FT2232HA? | 2 | - | 0403:6047 | 0x3500 | ??? |
| FT4232HAQ | 4 | - | 0403:6048 | 0x3600 | 64-pin QFN |
Note: while FT2232HA is supported by the drivers, there is no datasheet available, thus packaging options are unknown. However, "same as FT4232HA" is probably a good bet.
Pinout — base and automotive devices
| LQFP64 or QFN64 pin | VQFN56 pin | category | FT2232H | FT4232H |
|---|---|---|---|---|
| 1 | - | power | GND | GND |
| 2 | 3 | clock | OSCI | OSCI |
| 3 | 4 | clock | OSCO | OSCO |
| 4 | 5 | power | VPHY | VPHY |
| 5 | - | power | GND | GND |
| 6 | 6 | reference | REF | REF |
| 7 | 7 | USB | DM | DM |
| 8 | 8 | USB | DP | DP |
| 9 | 9 | power | VPLL | VPLL |
| 10 | - | power | AGND | AGND |
| 11 | - | power | GND | GND |
| 12 | - | power | VCORE | VCORE |
| 13 | 10 | control | TEST | TEST |
| 14 | 11 | control | RESET# | RESET# |
| 15 | - | power | GND | GND |
| 16 | 12 | IO-A | ADBUS0 | ADBUS0 |
| 17 | 13 | IO-A | ADBUS1 | ADBUS1 |
| 18 | 14 | IO-A | ADBUS2 | ADBUS2 |
| 19 | 15 | IO-A | ADBUS3 | ADBUS3 |
| 20 | 16 | power | VCCIO | VCCIO |
| 21 | 17 | IO-A | ADBUS4 | ADBUS4 |
| 22 | 18 | IO-A | ADBUS5 | ADBUS5 |
| 23 | 19 | IO-A | ADBUS6 | ADBUS6 |
| 24 | 20 | IO-A | ADBUS7 | ADBUS7 |
| 25 | 21 | power | GND | GND |
| 26 | 22 | IO-B | ACBUS0 | BDBUS0 |
| 27 | 23 | IO-B | ACBUS1 | BDBUS1 |
| 28 | 24 | IO-B | ACBUS2 | BDBUS2 |
| 29 | 25 | IO-B | ACBUS3 | BDBUS3 |
| 30 | 26 | IO-B | ACBUS4 | BDBUS4 |
| 31 | - | power | VCCIO | VCCIO |
| 32 | 27 | IO-B | ACBUS5 | BDBUS5 |
| 33 | 28 | IO-B | ACBUS6 | BDBUS6 |
| 34 | 29 | IO-B | ACBUS7 | BDBUS7 |
| 35 | - | power | GND | GND |
| 36 | 30 | IO-shared | SUSPEND# | SUSPEND# |
| 37 | 31 | power | VCORE | VCORE |
| 38 | 32 | IO-C | BDBUS0 | CDBUS0 |
| 39 | 33 | IO-C | BDBUS1 | CDBUS1 |
| 40 | 34 | IO-C | BDBUS2 | CDBUS2 |
| 41 | 35 | IO-C | BDBUS3 | CDBUS3 |
| 42 | 36 | power | VCCIO | VCCIO |
| 43 | 37 | IO-C | BDBUS4 | CDBUS4 |
| 44 | 38 | IO-C | BDBUS5 | CDBUS5 |
| 45 | 39 | IO-C | BDBUS6 | CDBUS6 |
| 46 | 40 | IO-C | BDBUS7 | CDBUS7 |
| 47 | 41 | power | GND | GND |
| 48 | 42 | IO-D | BCBUS0 | DDBUS0 |
| 49 | 43 | power | VREGOUT | VREGOUT |
| 50 | 44 | power | VREGIN | VREGIN |
| 51 | 45 | power | GND | GND |
| 52 | 46 | IO-D | BCBUS1 | DDBUS1 |
| 53 | 47 | IO-D | BCBUS2 | DDBUS2 |
| 54 | 48 | IO-D | BCBUS3 | DDBUS3 |
| 55 | 49 | IO-D | BCBUS4 | DDBUS4 |
| 56 | 50 | power | VCCIO | VCCIO |
| 57 | 51 | IO-D | BCBUS5 | DDBUS5 |
| 58 | 52 | IO-D | BCBUS6 | DDBUS6 |
| 59 | 53 | IO-D | BCBUS7 | DDBUS7 |
| 60 | 54 | IO-shared | PWREN# | PWREN# |
| 61 | 55 | EEPROM | EEDATA | EEDATA |
| 62 | 56 | EEPROM | EECLK | EECLK |
| 63 | 1 | EEPROM | EECS | EECS |
| 64 | 2 | power | VCORE | VCORE |
Pinout — USB-PD devices
| QFN76 | QFN68 | category | FT2232H | FT4232H |
|---|---|---|---|---|
| 1 | 1 | EEPROM | EECLK | EECLK |
| 2 | 2 | EEPROM | EEDATA | EEDATA |
| 3 | 3 | control | TEST | TEST |
| 4 | 4 | control | RESET# | RESET# |
| 5 | 5 | IO-PD | GPIO3 | GPIO3 |
| 6 | - | IO-PD | GPIO4 | GPIO4 |
| 7 | - | IO-PD | GPIO5 | GPIO5 |
| 8 | 6 | IO-A | ADBUS0 | ADBUS0 |
| 9 | 7 | IO-A | ADBUS1 | ADBUS1 |
| 10 | 8 | power | VCORE | VCORE |
| 11 | 9 | power | GND | GND |
| 12 | 10 | power | VCCIO | VCCIO |
| 13 | 11 | IO-A | ADBUS2 | ADBUS2 |
| 14 | 12 | IO-A | ADBUS3 | ADBUS3 |
| 15 | 13 | IO-A | ADBUS4 | ADBUS4 |
| 16 | 14 | IO-A | ADBUS5 | ADBUS5 |
| 17 | 15 | IO-A | ADBUS6 | ADBUS6 |
| 18 | 16 | IO-A | ADBUS7 | ADBUS7 |
| 19 | 17 | IO-B | ACBUS0 | BDBUS0 |
| 20 | 18 | IO-B | ACBUS1 | BDBUS1 |
| 21 | 19 | IO-B | ACBUS2 | BDBUS2 |
| 22 | 20 | IO-B | ACBUS3 | BDBUS3 |
| 23 | 21 | IO-B | ACBUS4 | BDBUS4 |
| 24 | 22 | IO-B | ACBUS5 | BDBUS5 |
| 25 | 23 | IO-B | ACBUS6 | BDBUS6 |
| 26 | 24 | IO-B | ACBUS7 | BDBUS7 |
| 27 | 25 | power | VCORE | VCORE |
| 28 | 26 | power | VCCIO | VCCIO |
| 29 | 27 | clock | OSCI | OSCI |
| 30 | 28 | clock | OSCO | OSCO |
| 31 | 29 | power | GND | GND |
| 32 | 30 | power | VREGIN | VREGIN |
| 33 | 31 | power | VREGOUT | VREGOUT |
| 34 | 32 | power | FSOURCE | FSOURCE |
| 35 | 33 | power | VPP | VPP |
| 36 | 34 | IO-C | BDBUS0 | CDBUS0 |
| 37 | 35 | IO-C | BDBUS1 | CDBUS1 |
| 38 | 36 | IO-C | BDBUS2 | CDBUS2 |
| 39 | 37 | IO-C | BDBUS3 | CDBUS3 |
| 40 | 38 | IO-C | BDBUS4 | CDBUS4 |
| 41 | 39 | power | VCCIO | VCCIO |
| 42 | 40 | IO-C | BDBUS5 | CDBUS5 |
| 43 | 41 | IO-C | BDBUS6 | CDBUS6 |
| 44 | 42 | IO-C | BDBUS7 | CDBUS7 |
| 45 | 43 | IO-shared | SUSPEND# | SUSPEND# |
| 46 | - | IO-PD | GPIO6 | GPIO6 |
| 47 | 44 | power | VCORE | VCORE |
| 48 | 45 | IO-D | BCBUS0 | DDBUS0 |
| 49 | 46 | IO-D | BCBUS1 | DDBUS1 |
| 50 | 47 | IO-D | BCBUS2 | DDBUS2 |
| 51 | 48 | IO-D | BCBUS3 | DDBUS3 |
| 52 | 49 | IO-D | BCBUS4 | DDBUS4 |
| 53 | 50 | IO-D | BCBUS5 | DDBUS5 |
| 54 | 51 | power | VCCIO | VCCIO |
| 55 | - | power | GND | GND |
| 56 | 52 | IO-D | BCBUS6 | DDBUS6 |
| 57 | 53 | IO-D | BCBUS7 | DDBUS7 |
| 58 | - | IO-PD | GPIO7 | GPIO7 |
| 59 | 54 | IO-PD | GPIO2 | GPIO2 |
| 60 | 55 | IO-PD | GPIO1 | GPIO1 |
| 61 | 56 | IO-PD | GPIO0 | GPIO0 |
| 62 | 57 | power | VCC_USB | VCC_USB |
| 63 | 58 | USB | DM | DM |
| 64 | 59 | USB | DP | DP |
| 65 | 60 | reference | REF | REF |
| 66 | 61 | power | VCC_PD | VCC_PD |
| 67 | 62 | PD | PD1_CC2 | PD1_CC2 |
| 68 | 63 | PD | PD1_SVBUS | PD1_SVBUS |
| 69 | 64 | PD | PD1_VCONN | PD1_VCONN |
| 70 | 65 | PD | PD1_CC1 | PD1_CC1 |
| 71 | - | PD | PD2_CC1 | PD2_CC1 |
| 72 | - | PD | PD2_SVBUS | PD2_SVBUS |
| 73 | - | PD | PD2_CC2 | PD2_CC2 |
| 74 | 66 | power | VCORE | VCORE |
| 75 | 67 | IO-shared | PWREN# | PWREN# |
| 76 | 68 | EEPROM | EECS | EECS |
Pin functions per mode — FT2232H
| pin | UART | FIFO | sync FIFO | CPU FIFO | bitbang | MPSSE | MCU bus | opto-isolated |
|---|---|---|---|---|---|---|---|---|
| ADBUS0 | TXD | D0 | D0 | D0 | D0 | TCK/SK | AD0 | - |
| ADBUS1 | RXD | D1 | D1 | D1 | D1 | TDI/DO | AD1 | - |
| ADBUS2 | RTS# | D2 | D2 | D2 | D2 | TDO/DI | AD2 | - |
| ADBUS3 | CTS# | D3 | D3 | D3 | D3 | TMS/CS | AD3 | - |
| ADBUS4 | DTR# | D4 | D4 | D4 | D4 | GPIOL0 | AD4 | - |
| ADBUS5 | DSR# | D5 | D5 | D5 | D5 | GPIOL1 | AD5 | - |
| ADBUS6 | DCD# | D6 | D6 | D6 | D6 | GPIOL2 | AD6 | - |
| ADBUS7 | RI# | D7 | D7 | D7 | D7 | GPIOL3 | AD7 | - |
| ACBUS0 | TXDEN | RXF# | RXF# | CS# | - | GPIOH0 | A8 | - |
| ACBUS1 | - | TXE# | TXE# | A0 | WR# | GPIOH1 | A9 | - |
| ACBUS2 | - | RD# | RD# | RD# | RD# | GPIOH2 | A10 | - |
| ACBUS3 | RXLED# | WR | WR | WR# | - | GPIOH3 | A11 | - |
| ACBUS4 | TXLED# | SI/WU | SI/WU | SI/WU | SI/WU | GPIOH4 | A12 | - |
| ACBUS5 | - | - | CLKOUT | - | - | GPIOH5 | A13 | - |
| ACBUS6 | - | - | OE# | - | - | GPIOH6 | A14 | - |
| ACBUS7 | - | - | - | - | - | GPIOH7 | A15 | - |
| BDBUS0 | TXD | D0 | N/A | D0 | D0 | TCK/SK | CS# | FSDI |
| BDBUS1 | RXD | D1 | N/A | D1 | D1 | TDI/DO | ALE | FSCLK |
| BDBUS2 | RTS# | D2 | N/A | D2 | D2 | TDO/DI | RD# | FSDO |
| BDBUS3 | CTS# | D3 | N/A | D3 | D3 | TMS/CS | WR# | FSCTS |
| BDBUS4 | DTR# | D4 | N/A | D4 | D4 | GPIOL0 | IORDY | - |
| BDBUS5 | DSR# | D5 | N/A | D5 | D5 | GPIOL1 | CLKOUT | - |
| BDBUS6 | DCD# | D6 | N/A | D6 | D6 | GPIOL2 | I/O0 | - |
| BDBUS7 | RI# | D7 | N/A | D7 | D7 | GPIOL3 | I/O1 | - |
| BCBUS0 | TXDEN | RXF# | N/A | CS# | - | GPIOH0 | - | - |
| BCBUS1 | SLEEP# | TXE# | N/A | A0 | WR# | GPIOH1 | - | - |
| BCBUS2 | RXLED# | RD# | N/A | RD# | RD# | GPIOH2 | - | - |
| BCBUS3 | TXLED# | WR | N/A | WR# | - | GPIOH3 | - | - |
| BCBUS4 | SI/WU | SI/WU | N/A | SI/WU | SI/WU | GPIOH4 | - | SI/WU |
| BCBUS5 | - | - | N/A | - | - | GPIOH5 | - | - |
| BCBUS6 | - | - | N/A | - | - | GPIOH6 | - | - |
| BCBUS7 | PWRSAV# | PWRSAV# | N/A | PWRSAV# | PWRSAV# | GPIOH7 | PWRSAV# | PWRSAV# |
NOTE: The pin mapping is changed from FT2232C/D for many modes.
PWRSAV# is a device input that, if enabled in EEPROM, will force the device into suspend mode when low. It can be connected to VBUS/GND via a resistor ladder to force-suspend a self-powered device when not connected to USB.
Pin functions per mode — FT4232H
| pin | UART | bitbang | MPSSE |
|---|---|---|---|
| *DBUS0 | TXD | D0 | TCK/SK |
| *DBUS1 | RXD | D1 | TDI/DO |
| *DBUS2 | RTS# | D2 | TDO/SI |
| *DBUS3 | CTS# | D3 | TMS/CS |
| *DBUS4 | DTR# | D4 | GPIOL0 |
| *DBUS5 | DSR# | D5 | GPIOL1 |
| *DBUS6 | DCD# | D6 | GPIOL2 |
| *DBUS7 | RI# or TXDEN (selected in EEPROM) | D7 | GPIOL3 |
EEPROM data format
The device will accept 64-word, 128-word, and 256-word EEPROMs. In case of 256-word EEPROMs, only first half is covered by the checksum. The other half can still be used to store user data.
For USB-PD devices, a 256-word EEPROM is required for the USB-PD part of the device to function. The second half of the EEPROM is used to store the USB-PD configuration data, and it has its own, separate checksum. It is described on the USB-PD page.
- word 0x00 (FT2232H):
- bits 0-2: channel A mode
- 0: UART
- 1: 245-style FIFO
- 2: CPU FIFO
- 4: fast opto-isolated serial
- bit 3: channel A enable bind to VCP driver
- bits 8-10: channel B mode (see above)
- bit 11: channel B enable bind to VCP driver
- bit 15: enable PWRSAV# function on BCBUS7
- bits 0-2: channel A mode
- word 0x00 (FT4232H):
- bit 3: channel A enable bind to VCP driver
- bit 7: channel C enable bind to VCP driver
- bit 11: channel B enable bind to VCP driver
- bit 15: channel D enable bind to VCP driver
- word 0x01: idVendor (USB VID)
- word 0x02: idProduct (USB PID)
- word 0x03: bcdDevice (see table)
- word 0x04: USB config (goes straight to configuration descriptor)
- bits 0-7: bmAttributes
- bit 5: remote wakeup enabled
- bit 6: self-powered
- bit 7: always set to 1
- bits 8-15: bMaxPower (max power in units of 2mA)
- bits 0-7: bmAttributes
- word 0x05: device control
- bit 2: IO pulldown in suspend
- bit 3: serial number enabled
- bit 12 (FT4232H only): ADBUS7 function in UART mode
- 0: RI
- 1: TXDEN
- bit 13 (FT4232H only): BDBUS7 function in UART mode
- bit 14 (FT4232H only): CDBUS7 function in UART mode
- bit 15 (FT4232H only): DDBUS7 function in UART mode
- word 0x06: controls electrical characteristics of channel IO pins; the IO-* names match the pin categories in the pinout table above. on FT4232H, they correspond directly to channels, while on FT2232H, CBUS and DBUS of each channel can be controlled independently
- bits 0-1: IO-A pin drive strength
- 0: 4mA
- 1: 8mA
- 2: 12mA
- 3: 16mA
- bit 2: IO-A pin slow slew rate
- bit 3: IO-A pin schmitt trigger
- bits 4-5: IO-B drive strength
- bit 6: IO-B slow slew rate
- bit 7: IO-B schmitt trigger
- bits 8-9: IO-C drive strength
- bit 10: IO-C slow slew rate
- bit 11: IO-C schmitt trigger
- bits 12-13: IO-D drive strength
- bit 14: IO-D slow slew rate
- bit 15: IO-D schmitt trigger
- bits 0-1: IO-A pin drive strength
- word 0x07: manufacturer string pointer
- word 0x08: product description string pointer
- word 0x09: serial number string pointer
- word 0x0a: always 0
- word 0x0b:
- bits 3-4: TPRDRV (an obscure undocumented trim parameter for the USB HS PHY)
- word 0x0c: EEPROM type
- 0x46: 93LC46 (64-word)
- 0x56: 93LC56 (128-word)
- 0x66: 93LC66 (256-word)
- for 64-word EEPROM:
- words 0x0d..0x3f: string / user area
- word 0x3f: checksum
- for 128-word and 256-word EEPROM:
- words 0xd..0x4d: user area
- word 0x2b: for some reason, set to 0x302 by default (concidentally or not, this corresponds to a header of an empty string descriptor)
- words 0x4d..0x7f: string / user area
- word 0x7f: checksum
- words 0xd..0x4d: user area
String pointers are formatted as follows:
- for 64-word EEPROM:
- bits 0-6: pointer to descriptor within EEPROM (counted in bytes)
- bit 7: always set to 1
- for 128-word or 256-word EEPROM:
- bits 0-7: pointer to descriptor within EEPROM (counted in bytes); note that FTDI tools will only store string descriptors in the area starting at word 0x4d, ensuring the high bit is always set
- bits 8-15: total length of descriptor in bytes
TODO: figure out wtf it is with the always-set high bit
The string descriptors are stored in ROM with the descriptor header included, as follows:
- word 0: header
- bits 0-7: total length of descriptor in bytes (includes header)
- bits 8-15: descriptor type (always 3 — string)
- words 1 and up: string in UTF-16
The checksum can be computed as follows:
#![allow(unused)] fn main() { fn checksum(eeprom: &[u16]) -> u16 { let checksum_word = match eeprom.len() { 0x40 => 0x3f, 0x80 | 0x100 => 0x7f, }; let mut res: u16 = 0xaaaa; for pos in 0..checksum_word { // checksum word is NOT included — we're calculating it res ^= eeprom[pos]; res = res.rotate_left(1); } res } }