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:

devicechannelsUSB-PD portsdefault VID:PIDbcdDevicepackage
FT2232HL2-0403:60100x070064-pin LQFP
FT2232HQ2-0403:60100x070064-pin QFN
FT2232H-56Q2-0403:60100x070056-pin VQFN
FT4232HL4-0403:60110x080064-pin LQFP
FT4232HQ4-0403:60110x080064-pin QFN
FT4232H-56Q4-0403:60110x080056-pin VQFN
FT2233HPQ220403:60400x280076-pin QFN
FT4233HPQ420403:60410x290076-pin QFN
FT2232HPQ210403:60420x2a0068-pin QFN
FT4232HPQ410403:60430x2b0068-pin QFN
FT2232HA?2-0403:60470x3500???
FT4232HAQ4-0403:60480x360064-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 pinVQFN56 pincategoryFT2232HFT4232H
1-powerGNDGND
23clockOSCIOSCI
34clockOSCOOSCO
45powerVPHYVPHY
5-powerGNDGND
66referenceREFREF
77USBDMDM
88USBDPDP
99powerVPLLVPLL
10-powerAGNDAGND
11-powerGNDGND
12-powerVCOREVCORE
1310controlTESTTEST
1411controlRESET#RESET#
15-powerGNDGND
1612IO-AADBUS0ADBUS0
1713IO-AADBUS1ADBUS1
1814IO-AADBUS2ADBUS2
1915IO-AADBUS3ADBUS3
2016powerVCCIOVCCIO
2117IO-AADBUS4ADBUS4
2218IO-AADBUS5ADBUS5
2319IO-AADBUS6ADBUS6
2420IO-AADBUS7ADBUS7
2521powerGNDGND
2622IO-BACBUS0BDBUS0
2723IO-BACBUS1BDBUS1
2824IO-BACBUS2BDBUS2
2925IO-BACBUS3BDBUS3
3026IO-BACBUS4BDBUS4
31-powerVCCIOVCCIO
3227IO-BACBUS5BDBUS5
3328IO-BACBUS6BDBUS6
3429IO-BACBUS7BDBUS7
35-powerGNDGND
3630IO-sharedSUSPEND#SUSPEND#
3731powerVCOREVCORE
3832IO-CBDBUS0CDBUS0
3933IO-CBDBUS1CDBUS1
4034IO-CBDBUS2CDBUS2
4135IO-CBDBUS3CDBUS3
4236powerVCCIOVCCIO
4337IO-CBDBUS4CDBUS4
4438IO-CBDBUS5CDBUS5
4539IO-CBDBUS6CDBUS6
4640IO-CBDBUS7CDBUS7
4741powerGNDGND
4842IO-DBCBUS0DDBUS0
4943powerVREGOUTVREGOUT
5044powerVREGINVREGIN
5145powerGNDGND
5246IO-DBCBUS1DDBUS1
5347IO-DBCBUS2DDBUS2
5448IO-DBCBUS3DDBUS3
5549IO-DBCBUS4DDBUS4
5650powerVCCIOVCCIO
5751IO-DBCBUS5DDBUS5
5852IO-DBCBUS6DDBUS6
5953IO-DBCBUS7DDBUS7
6054IO-sharedPWREN#PWREN#
6155EEPROMEEDATAEEDATA
6256EEPROMEECLKEECLK
631EEPROMEECSEECS
642powerVCOREVCORE

Pinout — USB-PD devices

QFN76QFN68categoryFT2232HFT4232H
11EEPROMEECLKEECLK
22EEPROMEEDATAEEDATA
33controlTESTTEST
44controlRESET#RESET#
55IO-PDGPIO3GPIO3
6-IO-PDGPIO4GPIO4
7-IO-PDGPIO5GPIO5
86IO-AADBUS0ADBUS0
97IO-AADBUS1ADBUS1
108powerVCOREVCORE
119powerGNDGND
1210powerVCCIOVCCIO
1311IO-AADBUS2ADBUS2
1412IO-AADBUS3ADBUS3
1513IO-AADBUS4ADBUS4
1614IO-AADBUS5ADBUS5
1715IO-AADBUS6ADBUS6
1816IO-AADBUS7ADBUS7
1917IO-BACBUS0BDBUS0
2018IO-BACBUS1BDBUS1
2119IO-BACBUS2BDBUS2
2220IO-BACBUS3BDBUS3
2321IO-BACBUS4BDBUS4
2422IO-BACBUS5BDBUS5
2523IO-BACBUS6BDBUS6
2624IO-BACBUS7BDBUS7
2725powerVCOREVCORE
2826powerVCCIOVCCIO
2927clockOSCIOSCI
3028clockOSCOOSCO
3129powerGNDGND
3230powerVREGINVREGIN
3331powerVREGOUTVREGOUT
3432powerFSOURCEFSOURCE
3533powerVPPVPP
3634IO-CBDBUS0CDBUS0
3735IO-CBDBUS1CDBUS1
3836IO-CBDBUS2CDBUS2
3937IO-CBDBUS3CDBUS3
4038IO-CBDBUS4CDBUS4
4139powerVCCIOVCCIO
4240IO-CBDBUS5CDBUS5
4341IO-CBDBUS6CDBUS6
4442IO-CBDBUS7CDBUS7
4543IO-sharedSUSPEND#SUSPEND#
46-IO-PDGPIO6GPIO6
4744powerVCOREVCORE
4845IO-DBCBUS0DDBUS0
4946IO-DBCBUS1DDBUS1
5047IO-DBCBUS2DDBUS2
5148IO-DBCBUS3DDBUS3
5249IO-DBCBUS4DDBUS4
5350IO-DBCBUS5DDBUS5
5451powerVCCIOVCCIO
55-powerGNDGND
5652IO-DBCBUS6DDBUS6
5753IO-DBCBUS7DDBUS7
58-IO-PDGPIO7GPIO7
5954IO-PDGPIO2GPIO2
6055IO-PDGPIO1GPIO1
6156IO-PDGPIO0GPIO0
6257powerVCC_USBVCC_USB
6358USBDMDM
6459USBDPDP
6560referenceREFREF
6661powerVCC_PDVCC_PD
6762PDPD1_CC2PD1_CC2
6863PDPD1_SVBUSPD1_SVBUS
6964PDPD1_VCONNPD1_VCONN
7065PDPD1_CC1PD1_CC1
71-PDPD2_CC1PD2_CC1
72-PDPD2_SVBUSPD2_SVBUS
73-PDPD2_CC2PD2_CC2
7466powerVCOREVCORE
7567IO-sharedPWREN#PWREN#
7668EEPROMEECSEECS

Pin functions per mode — FT2232H

pinUARTFIFOsync FIFOCPU FIFObitbangMPSSEMCU busopto-isolated
ADBUS0TXDD0D0D0D0TCK/SKAD0-
ADBUS1RXDD1D1D1D1TDI/DOAD1-
ADBUS2RTS#D2D2D2D2TDO/DIAD2-
ADBUS3CTS#D3D3D3D3TMS/CSAD3-
ADBUS4DTR#D4D4D4D4GPIOL0AD4-
ADBUS5DSR#D5D5D5D5GPIOL1AD5-
ADBUS6DCD#D6D6D6D6GPIOL2AD6-
ADBUS7RI#D7D7D7D7GPIOL3AD7-
ACBUS0TXDENRXF#RXF#CS#-GPIOH0A8-
ACBUS1-TXE#TXE#A0WR#GPIOH1A9-
ACBUS2-RD#RD#RD#RD#GPIOH2A10-
ACBUS3RXLED#WRWRWR#-GPIOH3A11-
ACBUS4TXLED#SI/WUSI/WUSI/WUSI/WUGPIOH4A12-
ACBUS5--CLKOUT--GPIOH5A13-
ACBUS6--OE#--GPIOH6A14-
ACBUS7-----GPIOH7A15-
BDBUS0TXDD0N/AD0D0TCK/SKCS#FSDI
BDBUS1RXDD1N/AD1D1TDI/DOALEFSCLK
BDBUS2RTS#D2N/AD2D2TDO/DIRD#FSDO
BDBUS3CTS#D3N/AD3D3TMS/CSWR#FSCTS
BDBUS4DTR#D4N/AD4D4GPIOL0IORDY-
BDBUS5DSR#D5N/AD5D5GPIOL1CLKOUT-
BDBUS6DCD#D6N/AD6D6GPIOL2I/O0-
BDBUS7RI#D7N/AD7D7GPIOL3I/O1-
BCBUS0TXDENRXF#N/ACS#-GPIOH0--
BCBUS1SLEEP#TXE#N/AA0WR#GPIOH1--
BCBUS2RXLED#RD#N/ARD#RD#GPIOH2--
BCBUS3TXLED#WRN/AWR#-GPIOH3--
BCBUS4SI/WUSI/WUN/ASI/WUSI/WUGPIOH4-SI/WU
BCBUS5--N/A--GPIOH5--
BCBUS6--N/A--GPIOH6--
BCBUS7PWRSAV#PWRSAV#N/APWRSAV#PWRSAV#GPIOH7PWRSAV#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

pinUARTbitbangMPSSE
*DBUS0TXDD0TCK/SK
*DBUS1RXDD1TDI/DO
*DBUS2RTS#D2TDO/SI
*DBUS3CTS#D3TMS/CS
*DBUS4DTR#D4GPIOL0
*DBUS5DSR#D5GPIOL1
*DBUS6DCD#D6GPIOL2
*DBUS7RI# or TXDEN (selected in EEPROM)D7GPIOL3

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
    • 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
  • 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)
  • 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
  • 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

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
}
}