Devices
FTDI has made a great variety of devices. Here we attempt to categorize all of them.
Note that, at one point, FTDI has spun off its MCU division as a new company, Bridgetek. There are many device that exist with both FTDI (FTxxx) and Bridgetek (BTxxx) naming and branding. To simplify things, we just consider all Bridgetek devices to be FTDI devices as well.
Usually, the last letter of a full part name (eg. Q in FT2232HQ) represents the package type (SSOP / QFP / QFN / etc). We usually skip this letter when describing the devices, as it doesn't affect their behavior in any way.
D2xx devices
D2xx devices are USB peripherial devices that implement the D2xx protocol, originally created for USB—UART bridging. They come in several varieties:
- the "proper" fixed-function D2xx devices implementing the D2xx protocol in hardware
- FT8U232A, FT232B, FT232R, FT230X, FT231X, FT234X: single-channel USB—UART bridge
- FT8U245A, FT245B, FT245R, FT240X: single-channel USB—FIFO bridge
- FT200X, FT201X: single-channel USB—I2C peripherial bridge
- FT220X, FT221X: single-channel USB-SPI/FT1248 bridge
- FT2232, FT2232H: dual-channel USB—multiprotocol bridge
- FT4232H: quad-channel USB—multiprotocol bridge
- FT232H: single-channel USB-multiprotocol bridge
- preprogrammed MCUs implementing the D2xx protocol in fixed firmware
- FT4222H: quad-channel USB—SPI/I2C bridge
- UMFT4222PROG: programmer board for FT4222H (based on FT51A)
- UMFTPD3A: programmer board for FT260/FT4222H (based on FT51A)
- programmable MCUs with FTDI-provided libraries that can be used to implement the D2xx protocol in firmware
- FT8U100A: ???-based MCU
- FT51: 8051-based MCU
- FT900 series: FT32-based MCU (custom RISC-like 32-bit Harvard architecture)
- FT930 series: FT32B-based MCU (a revision of FT32)
D2xx devices come with one or more "channel"s, which are essentially independent bidirectional data pipes. They correspond to USB interfaces with one IN endpoint and one OUT endpoint. On the host side, they can be opened and used independently by distinct applications.
The fixed-function D2xx devices as well as FT4222H can be configured through non-volatile memory — some device types use an external EEPROM for that purpose, while others come with on-chip EEPROM or OTP memory.
Almost all D2xx devices allow the designer to provide custom USB vendor and product IDs (as well as string descriptors), making fully reliable detection impossible. However, once something is known to be a D2xx device, the bcdDevice field of device descriptor can be used to determine its exact type:
| bcdDevice | default VID:PID | # channels | device |
|---|---|---|---|
| 0001 | 0403:8372 | 1 | FT8U100A UART "applet" |
| 0200 | 0403:6001 | 1 | FT8U232A or FT8U245A |
| 0400 or 0200 | 0403:6001 | 1 | FT232B or FT245B |
| 0400 or 0200 | 0403:6004 | 1 | FT232B (alternate PID strap) |
| 0400 or 0200 | 0403:6005 | 1 | FT245B (alternate PID strap) |
| 0500 | 0403:6010 | 2 | FT2232C, FT2232D |
| 0600 | 0403:6001 | 1 | FT232R or FT245R |
| 0600 | 0403:6049 | 1 | FT232RN or FT245RN |
| 0700 | 0403:6010 | 2 | FT2232H |
| 0800 | 0403:6011 | 4 | FT4232H |
| 0900 | 0403:6014 | 1 | FT232H |
| 1000 | 0403:6015 | 1 | FT-X series |
| 1400 | 0403:601b | 1 | FT4222 mode 3 (unreleased) |
| 1500 | 0403:601b | 2 | FT4222 mode 0 (unreleased) |
| 1600 | 0403:601b | 4 | FT4222 mode 1 or 2 (unreleased) |
| 1700 | 0403:601c | 1 | FT4222H mode 3 |
| 1800 | 0403:601c | 2 | FT4222H mode 0 |
| 1900 | 0403:601c | 4 | FT4222H mode 1 or 2 |
| 2100 | 0403:0fec | 1? | UMFT4222PROG |
| 2400 | 0403:6031 | 1 | FT90x (1 channel) |
| 2400 | 0403:6032 | 2 | FT90x (2 channels) |
| 2400 | 0403:6033 | 3 | FT90x (3 channels) |
| 2500 | 0403:6034 | 1 | FT93x (1 channel) |
| 2500 | 0403:6035 | 2 | FT93x (2 channels) |
| 2500 | 0403:6036 | 3 | FT93x (3 channels) |
| 2500 | 0403:6037 | 4 | FT93x (4 channels) |
| 2500 | 0403:6038 | 5 | FT93x (5 channels) |
| 2500 | 0403:6039 | 6 | FT93x (6 channels) |
| 2500 | 0403:603a | 7 | FT93x (7 channels) |
| 2700 | 0403:603e | 1? | UMFTPD3A |
| 2800 | 0403:6040 | 2 | FT2233HP |
| 2900 | 0403:6041 | 4 | FT4233HP |
| 3000 | 0403:6042 | 2 | FT2232HP |
| 3100 | 0403:6043 | 4 | FT4232HP |
| 3200 | 0403:6044 | 1 | FT233HP |
| 3300 | 0403:6045 | 1 | FT232HP |
| 3500 | 0403:6047 | 2 | FT2232HA |
| 3600 | 0403:6048 | 4 | FT4232HA |
FT8U232A and FT8U245A
These are the first-generation fixed-function D2xx devices. FT8U232A is a USB—UART bridge, while FT8U245A is a USB—FIFO bridge. They look exactly the same from the software perspective, and in fact may or may not be the same silicon.
They are configured by an optional external 93C46 (64×16-bit word) EEPROM. If no EEPROM is present, or the EEPROM is unprogrammed, the device will use a default configuration.
| device | package |
|---|---|
| FT8U232AM | 32-pin MQFP |
| FT8U245AM | 32-pin MQFP |
FT232B and FT245B
These are a second-generation revision of FT8U2xxA. They are largely software-compatible, but introduce a few new features:
- configurable latency timer
- bitbang mode
- serial number descriptor
- support for larger 93C56 (128×16) and 93C66 (256×16) EEPROMs in addition to 93C46
They are mostly, but not completely pin compatible with FT8U2xxA in the QFP packages.
| device | package |
|---|---|
| FT232BM | 32-pin LQFP |
| FT232BL | 32-pin lead-free LQFP |
| FT232BQ | 32-pin QFN |
| FT245BM | 32-pin LQFP |
| FT245BL | 32-pin lead-free LQFP |
FT2232C/D/L
A third-generation D2xx device. This device features two largely-independent channels (called A and B), which can be independently configured through EEPROM in several modes:
- UART (like FT232B)
- FIFO (like FT245B)
- CPU FIFO (new mode, meant for use as a peripherial on an 8051-style MCU bus)
- fast opto-isolated serial (custom serial protocol, optimised for low pin count and speed)
In addition, the device can also dynamically switch either of the two channels into alternate modes:
- async bitbang mode: like FT232B/FT245B
- MPSSE mode: implements a fast controller for SPI, JTAG, and similar protocols (channel A only)
- sync bitbang mode: new, variation of the async bitbang mode
- MCU bus: uses pins of both channels; makes the device capable of controlling an 8051-style MCU bus and driving MCU peripherials
Like FT2xxB, the device can be configured by a 93C46/93C56/93C66 external EEPROM.
| device | package | what is |
|---|---|---|
| FT2232C | 48-pin LQFP | base version |
| FT2232L | 48-pin lead-free LQFP | base version |
| FT2232D | 48-pin lead-free LQFP | revised version |
FT232R/FT245R
A fourth-generation D2xx device. The FT232R and FT245R are, in fact, the same chip, and it seems that they can be converted into one another via an EEPROM change. They are an enhanced version of FT2xxB, with the following new features:
- internal 32×32-bit EEPROM for configuration (instead of external 93C*), plus 8×32-bit factory-programmed area with unique per-chip ID
- whether the device is FT232R or FT245R is stored in the user-programmable area and can be changed, though vendor tools go out of their way not to do so
- internal oscillator
- configurable CBUS pins with multiple functions (FT232R only)
- CBUS GPIO mode (allows putting individual CBUS pins under software control while continuing to use other pins for their normal UART purpose)
- adds the synchronous bitbang mode (ported from FT2232C)
The FT2xxRN is a variant of the device that makes the internal oscillator work with 3.3V VCC.
| device | package |
|---|---|
| FT232RL | 28-pin TSSOP |
| FT232RQ | 32-pin QFN |
| FT245RL | 28-pin TSSOP |
| FT245RQ | 32-pin QFN |
| FT232RNL | 28-pin TSSOP |
| FT232RNQ | 32-pin QFN |
| FT245RNL | 28-pin TSSOP |
| FT245RNQ | 32-pin QFN |
FT2232H and FT4232H
Fifth-generation D2xx devices. FT2232H and FT4232H are the same silicon, and are differentiated by a fuse programmed in the factory.
FT2232H is an enhanced version of FT2232C, with the following new features:
- USB 2.0 high-speed interface
- max UART speed bumped from 3Mbaud to 12Mbaud
- max FIFO speed bumped from 1MB/s to 8MB/s
- adds new synchronous FIFO submode, which further increases FIFO speed to 40MB/s
- MPSSE mode is available on both channels
- each channel now has 16 pins instead of 13 (additional pins can be used as GPIO in MPSSE mode)
FT4232H is a variant with the following differences:
- four channels (A, B, C, D) instead of two, each of which includes 8 pins instead of 16
- modes requiring more than 8 pins are not supported (FIFO, CPU FIFO, MCU bus)
- fast opto-isolated serial mode is also not supported
- only channels A and B support MPSSE (C and D are limitted to UART and bitbang)
Later on, variants of these devices were made with USB-PD support. They have the same core functionality as the base version, but they require a 93C66 EEPROM to fit the extra configuration required for USB-PD.
| device | package | what |
|---|---|---|
| FT2232HL | 64-pin LQFP | base FT2232H |
| FT2232HQ | 56-pin VQFN | base FT2232H |
| FT4232HL | 64-pin LQFP | base FT4232H |
| FT4232HQ | 56-pin VQFN | base FT4232H |
| FT2233HPQ | 76-pin QFN | FT2232H with two USB-PD ports |
| FT4233HPQ | 76-pin QFN | FT4232H with two USB-PD ports |
| FT2232HPQ | 68-pin QFN | FT2232H with one USB-PD port |
| FT4232HPQ | 68-pin QFN | FT4232H with one USB-PD port |
| FT2232HAQ | 64-pin QFN | FT2232H automotive version |
| FT4232HAQ | 64-pin QFN | FT4232H automotive version |
FT232H
A single-channel variant of FT2232H, with some FT232R features merged in. Features include:
- USB 2.0 high-speed interface
- a single channel, with 18 pins
- supports all FT2232H modes except for the MCU bus mode (which would require more than 16 pins)
- adds FT232R-style configurable CBUS pins, as well as the CBUS bitbang mode
- continues to require external EEPROM; only 93C56 and 93C66 are supported
- adds a new FT1248 mode
Like FT2232H and FT4232H, this device also got USB-PD variants later on.
| device | package | what |
|---|---|---|
| FT232HL | 48-pin LQFP | base FT232H |
| FT232HQ | 48-pin QFN | base FT232H |
| FT233HPQ | 64-pin QFN | FT232H with two USB-PD ports |
| FT232HPQ | 56-pin QFN | FT232H with one USB-PD port |
FT-X series
A single-channel D2xx device. Essentially an enhanced version of FT232R, with the following changes:
- internal 2048-byte MTP memory for configuration, including some immutable factory pre-programmed data
- the device comes in several variants; the variant is selected by the factory-programmed MTP area and cannot be changed
- FT200X and FT201X: USB to I2C peripherial bridge
- FT220X and FT221X: USB to FT1248 bridge
- FT230X, FT231X, FT234X: USB to UART bridge (like FT232R)
- FT240X: USB to FIFO bridge (like FT245R)
- adds battery charger detection
| device | package | business end | business end pins |
|---|---|---|---|
| FT200XD | 10-pin DFN | I2C peripherial | 2×I2C + 1×CBUS |
| FT201XS | 16-pin SSOP | I2C peripherial | 2×I2C + 6×CBUS |
| FT201XQ | 16-pin QFN | I2C peripherial | 2×I2C + 6×CBUS |
| FT220XS | 16-pin SSOP | 4-bit FT1248 | 7×FT1248 + 1×CBUS |
| FT220XQ | 16-pin QFN | 4-bit FT1248 | 7×FT1248 + 1×CBUS |
| FT221XS | 20-pin SSOP | 8-bit FT1248 | 11×FT1248 + 1×CBUS |
| FT221XQ | 20-pin QFN | 8-bit FT1248 | 11×FT1248 + 1×CBUS |
| FT230XS | 16-pin SSOP | basic UART | 4×UART + 4×CBUS |
| FT230XQ | 16-pin QFN | basic UART | 4×UART + 4×CBUS |
| FT231XS | 20-pin SSOP | full UART | 8×UART + 4×CBUS |
| FT231XQ | 20-pin QFN | full UART | 8×UART + 4×CBUS |
| FT234XD | 12-pin DFN | basic UART | 4×UART + 1×CBUS |
| FT240XS | 24-pin SSOP | FIFO | 13×FIFO + 2×CBUS |
| FT240XQ | 24-pin QFN | FIFO | 13×FIFO + 2×CBUS |
FT4222H
The FT4222H is a high-speed USB to QSPI/I2C + GPIO bridge. Internally, it is based on an MCU (unknown, but likely FT32).
The device is configured using internal OTP memory.
The device has four channel configurations, selectable by two configuration pins:
| mode | channel count | channel 0 | channel 1 | channel 2 | channel 3 |
|---|---|---|---|---|---|
| 0 | 2 | SPIC / SPIP / I2CC / I2CP | GPIO | - | - |
| 1 | 4 | SPIC (CS0) | SPIC (CS1) | SPIC (CS2) | GPIO |
| 2 | 4 | SPIC (CS0) | SPIC (CS1) | SPIC (CS2) | SPIC (CS3) |
| 3 | 1 | SPIC / SPIP / I2CC / I2CP | - | - | - |
The device has four modes, selected at runtime:
- SPIC: SPI controller; depending on channel configuration, can use up to four CS lines, and thus control 4 peripherials; every peripherial is controlled by a dedicated channel
- SPIP: SPI peripherial (not available in modes 1 and 2)
- I2CC: I2C controller (not available in modes 1 and 2)
- I2CP: I2C peripherial (not available in modes 1 and 2)
The device comes in 4 revisions, which differ in firmware version:
| device | package | firmware |
|---|---|---|
| FT4222HQ-A | 32-pin VQFN | rev A |
| FT4222HQ-B | 32-pin VQFN | rev B |
| FT4222HQ-C | 32-pin VQFN | rev C |
| FT4222HQ-D | 32-pin VQFN | rev D |
D3xx devices
D3xx devices are USB super-speed peripherial devices that implement the D3xx protocol. There are several variants:
- FT600 and FT601: USB—FIFO bridge
- FT600: up to 16-bit FIFO
- FT601: up to 32-bit FIFO
- FT602: USB—FIFO bridge implementing the UVC protocol
All of these devices are internally based on an FT32-based MCU.
| default VID:PID | device |
|---|---|
| 0403:601e | FT600 |
| 0403:601f | FT601 |
| TODO | FT602 |
FT260
FT260 is a USB—UART/I2C bridge implementing the HID device class. It is internally based on an unknown MCU (FT32? FT51?). It can be configured using internal eFUSE memory or external EEPROM.
| device | default VID:PID | package |
|---|---|---|
| FT260Q | 0403:6030 | 28-pin WQFN |
| FT260S | 0403:6030 | 28-pin TSSOP |
FT12 series
FT12 series devices are, essentially, completely customizable USB peripherial devices meant to be controlled by an external MCU. The FT12 acts as a PHY and endpoint FIFO controller, while the MCU is supposed to implement all USB endpoint logic, including control requests.
Note that the internal VID:PID listed in the table is actually presented to the MCU as FT12's identification, not to the host. The actual USB VID:PID is provided by the MCU.
| device | max endpoints | MCU interface | internal VID:PID | package |
|---|---|---|---|---|
| FT120T | 6 | MCU parallel bus | none | 28-pin TSSOP |
| FT121T | 16 | SPI | 0403:6018 | 16-pin TSSOP |
| FT121Q | 16 | SPI | 0403:6018 | 16-pin QFN |
| FT122T | 16 | MCU parallel bus | 0403:6018 | 28-pin TSSOP |
| FT122Q | 16 | MCU parallel bus | 0403:6018 | 28-pin QFN |
MCU devices
FT8U100A
FT8U100A is an MCU based on an unknown 8-bit architecture (8051?). It implements a USB hub, with 1 upstream port and 7 physical downstream ports, as well as virtual downstream ports for internal devices. It also has a variety of peripherials, such as UART, PS/2 keyboard/mouse host, IrDA, I2C controller, and GPIO. It comes with ready-made firmware that can be used to expose these peripherials as USB devices (including SIO UART, the first device in the D2xx family).
| device | package |
|---|---|
| FT8U100AX | 100-pin PQFP |
| VID:PID | internal device |
|---|---|
| 0403:8370 | USB hub |
| 0403:8371 | PS/2 keyboard and mouse |
| 0403:8372 | UART (D2xx protocol) |
TODO: list incomplete
FT51
FT51 is an 8051-based MCU that has a programmable USB peripherial interface, as well as a USB hub. It is used in the UMFTPD3A and UMFT4222PROG boards. It comes in several variants, all of which are the same silicon and only differ in the number of pins:
| device | package | GPIO |
|---|---|---|
| FT51AQ | 48-pin QFN | 16×DIO + 16×AIO |
| FT51AL | 44-pin LQFP | 16×DIO + 16×AIO |
| FT51BQ | 32-pin QFN | 16×DIO + 8×AIO |
| FT51CS | 28-pin SSOP | 12×DIO + 8×AIO |
FT900 series
FT900 is an MCU based on FTDI's custom FT32 RISC-like architecture. It comes in several variants, all of which are actually the same silicon:
| device | ethernet | CAN | GPIO pins | SD host | SPI peripherial | I2C | I2S | package |
|---|---|---|---|---|---|---|---|---|
| FT900Q | yes | yes | 66 | yes | 2 | 2 | yes | 100-pin QFN |
| FT900L | yes | yes | 66 | yes | 2 | 2 | yes | 100-pin LQFP |
| FT901Q | yes | no | 66 | yes | 2 | 2 | yes | 100-pin QFN |
| FT901L | yes | no | 66 | yes | 2 | 2 | yes | 100-pin LQFP |
| FT902Q | no | yes | 66 | yes | 2 | 2 | yes | 100-pin QFN |
| FT902L | no | yes | 66 | yes | 2 | 2 | yes | 100-pin LQFP |
| FT903Q | no | no | 66 | yes | 2 | 2 | yes | 100-pin QFN |
| FT903L | no | no | 66 | yes | 2 | 2 | yes | 100-pin LQFP |
| FT905Q | yes | yes | 44 | no | 1 | 1 | no | 76-pin QFN |
| FT905L | yes | yes | 44 | no | 1 | 1 | no | 80-pin LQFP |
| FT906Q | yes | no | 44 | no | 1 | 1 | no | 76-pin QFN |
| FT906L | yes | no | 44 | no | 1 | 1 | no | 80-pin LQFP |
| FT907Q | no | yes | 44 | no | 1 | 1 | no | 76-pin QFN |
| FT907L | no | yes | 44 | no | 1 | 1 | no | 80-pin LQFP |
| FT908Q | no | no | 44 | no | 1 | 1 | no | 76-pin QFN |
| FT908L | no | no | 44 | no | 1 | 1 | no | 80-pin LQFP |
FT900 comes with (device-side) libraries that can implement the D2xx protocol in software.
FT930 series
FT930 is an MCU based on FT32B, a revision of the FT32 architecture used in the FT900 series. It comes in several variants, all of which are actually the same silicon:
| device | DAC | ADC | PWM | SD host | RTC | UART | GPIO | pins |
|---|---|---|---|---|---|---|---|---|
| FT930Q | ×2 | ×3 | ×8 | yes | yes | ×4 | 40 | 68-pin QFN |
| FT931Q | ×2 | ×3 | ×4 | yes | yes | ×2 | 28 | 56-pin QFN |
| FT932Q | ×2 | ×3 | ×4 | yes | no | ×2 | 24 | 48-pin QFN |
| FT933Q | no | ×2 | ×4 | no | no | ×2 | 16 | 48-pin QFN |
In addition to the main FT32B core that is advertised in the datasheet, FT930 also contains a secondary MCU (unknown architecture, but likely also FT32). The "hardware D2xx engine" advertised in the datasheet is actually implemented in software on the other MCU core.
VNC1
VNC1, also known as Vinculum, is an MCU with USB host and peripherial interfaces. It is based on a custom 8-bit Harvard architecture, known as FT8. It has a cute 32-bit integer numeric coprocessor for complex arithmetic tasks such as "handling the FAT filesystem".
| device | package |
|---|---|
| VNC1L | 48-pin LQFP |
VNC2
VNC2, also known as Vinculum-II, is an MCU with USB host and peripherial interfaces. It is based on a custom Harvard 16-bit architecture, known as FT16.
| device | package | GPIO |
|---|---|---|
| VNC2-48L | 48-pin LQFP | 28 |
| VNC2-48Q | 48-pin QFN | 28 |
| VNC2-32L | 32-pin LQFP | 12 |
| VNC2-32Q | 32-pin QFN | 12 |
FT311 and FT312
FT311 and FT312 are Android Open Accessory host devices. They are USB full-speed hosts that accept a single peripherial that should support the AOA protocol. They will then expose UART or other interface to the Android device.
The device has internal flash memory which stores, among other things, the descriptor strings presented to the Android device. It can be modified via an FTDI null-modem cable and a configuration utility.
Both of these devices are actually just VNC2 chips with preprogrammed firmware.
| device | package | interfaces |
|---|---|---|
| FT311D-32Q1C | 32-pin QFN | one of: UART, GPIO, PWM, I2C controller, SPI controller, SPI peripherial |
| FT311D-32L1C | 32-pin LQFP | one of: UART, GPIO, PWM, I2C controller, SPI controller, SPI peripherial |
| FT312D-32Q1C | 32-pin QFN | UART |
| FT312D-32L1C | 32-pin LQFP | UART |
FT313
FT313 is an EHCI controller meant to be connected as a peripherial to 8051-style MCU bus. It has 24kiB of internal buffer memory and DMA support.
| device | package |
|---|---|
| FT313HQ | 64-pin QFN |
| FT313HL | 64-pin LQFP |
| FT313HP | 64-pin TQFP |
EVE display controllers
EVE (Embedded Video Engine) aka FT8xx aka BT8xx is a series of display controllers. They are meant to be driven by an external MCU, and provide parallel or LVDS video output (and, in some cases, input), audio output, and a resistive or capacitive touch controller.
EVE aka FT80x
The first generation of EVE. Both chips are the same silicon. It features:
- SPI peripherial or I2C peripherial interface exposing internal RAM and registers, meant to be controlled by the MCU host
- 256kiB of internal RAM
- parallel 18-bit RGB video output, up to 480×272 resolution
- display list based graphics engine driving the video output
- basic rendering features
- JPEG decode
- zlib decompression
- ROM and RAM fonts
- backlight control
- one-channel PWM audio output, playing PCM audio or predefined sound effects from ROM wave table
- touch controller
- resistive version: directly controls the touchscreen via analog pins
- capacitive version: has an I2C controller interface meant to be connected to the capacitive touchscreen
| device | touch interface | package |
|---|---|---|
| FT800Q | resistive | 48-pin VQFN |
| FT801Q | capacitive | 48-pin VQFN |
EVE2 aka FT81x and BT88x
The second generation of EVE. FT81x has the following differences from FT80x:
- MCU interface is SPI or QSPI peripherial
- 1MiB of internal RAM
- different memory map
- video output supports up to 800×600 resolution
- video output is 24-bit instead of 18-bit (on FT812 and FT813 only)
The BT88x is a smaller variant of EVE2. It has the following differences from FT81x:
- only 256kiB of internal RAM
- video output resolution is limitted to 131072 pixels total
| device | video output | touch interface | internal RAM | package |
|---|---|---|---|---|
| FT810Q | 18-bit RGB | resistive | 1MiB | 48-pin VQFN |
| FT811Q | 18-bit RGB | capacitive | 1MiB | 48-pin VQFN |
| FT812Q | 24-bit RGB | resistive | 1MiB | 56-pin VQFN |
| FT813Q | 24-bit RGB | capacitive | 1MiB | 56-pin VQFN |
| BT880Q | 18-bit RGB | resistive | 256kiB | 48-pin VQFN |
| BT881Q | 18-bit RGB | capacitive | 256kiB | 48-pin VQFN |
| BT882Q | 24-bit RGB | resistive | 256kiB | 56-pin VQFN |
| BT883Q | 24-bit RGB | capacitive | 256kiB | 56-pin VQFN |
All of the FT81x devices are the same silicon. FT810 and FT811 are pin-compatible with FT800 and FT801.
Likewise, all BT88x devices are the same silicon. They are pin-compatible with their corresponding FT81x devices.
EVE3 aka BT815/BT816
The third generation of EVE. It has switched to the BT (Bridgetek) device name prefix. It has the following differences from EVE2:
- added QSPI controller interface meant for connecting an external flash chip with preprogrammed graphics or audio data
- sigma-delta audio output instead of PWM
| device | touch interface | package |
|---|---|---|
| BT815Q | capacitive | 64-pin VQFN |
| BT816Q | resistive | 64-pin VQFN |
Both BT815 and BT816 are the same silicon.
EVE4 aka BT817/BT818
The fourth generation of EVE. It has the following differences from EVE3:
- video output supports up to 1920×480, 1440×540, or 1280×800 resolution
| device | touch interface | package |
|---|---|---|
| BT817Q | capacitive | 64-pin VQFN |
| BT817AQ | capacitive | 64-pin VQFN |
| BT818Q | resistive | 64-pin VQFN |
BT817A is an automotive variant of BT817.
All EVE4 devices are the same silicon.
EVE5 aka BT820
The fifth generation of EVE, with major changes. It has the following features:
- QSPI peripherial interface for the MCU host
- QSPI controller interface for flash
- memory controller for DDR3/DDR3L/LPDDR2 working memory
- SD card host interface
- dual-channel FPD-link video output
- with backlight control
- dual-channel FPD-link video input
- I2C controller interface for capacitive touch
- audio output through stereo delta-sigma or I2S
- 16 GPIO pins
- display list based graphics engine
- PNG and JPG decode support
- deflate decode support
- ROM and RAM fonts
- render engine for memory-to-memory drawing
- ASTC decode support
| device | package |
|---|---|
| BT820B | 329-pin BGA |
D2xx protocol
D2xx is the name of protocol used by most FTDI USB devices. It was originally made for the UART function of the FT8U100A, and remains quite UART-oriented. However, FTDI has reused it for all kinds of stream-based interfaces.
Channels and interfaces
A D2xx device can have one or more channels. A channel is, at the core, a bidirectional byte-oriented stream of data.
Channels are often identified by single letters, in order (A, B, C, D, ...).
Each channel is exposed as a separate USB interface. Each interface has two bulk endpoints: IN and OUT. In addition, a channel also makes use of D2xx-specific control requests on the default config pipe (endpoint 0).
Some devices have an undocumented option to use isochronous endpoints instead of bulk endpoints. That options is undoubtedly broken in some completely hilarious ways.
Identifying a D2xx device
Since all D2xx devices can have custom VIDs and PIDs programmed, there is no sure-fire way to identify a USB device as a D2xx device — you need to know what VID:PID you are looking for. However, there are some predefined VID:PID combinations that will be used by default. They are listed in the table on the devices page.
As you can see, FTDI used to reuse its VID:PID combinations for groups of similar devices for some time, but then decided to just start assigning new IDs for every new device.
Once something is known to be a FTD2xx device, further identification can be obtained from the bcdDevice field of USB descriptor. The bcdDevice values are likewise listed on the devices page. It is not clear whether the bcdDevice field may be overriden via EEPROM.
Even putting VID:PID and bcdDevice together, it is still not always possible to uniquely identify the device. Usually, one can just live with the uncertainty. However, there are some more checks that can be done for further identification:
- FT8U2xxA and FT2xxB can be told apart by attempting the
GET_LATENCY_TIMERrequest — a failure implies A-series device, while a success implies B-series device - FT232R and FT245R can be told apart by a field in the internal EEPROM, which the vendor claims to not be modifiable by the user
- likewise, FT-X series devices can be told apart to some extent by another EEPROM field
Stream protocol
Note: FT2xxR devices have configurable wMaxPacketSize field in the bulk endpoint descriptors. There are devices in the wild where people have programmed the (invalid) value of 0 in that field. In case a device is encountered with such value, it should be overriden in the driver to 64 bytes.
IN endpoint
The IN endpoint of a channel is used to transfer byte stream data from the device to the user. It involves a framing protocol: every packet transferred on the endpoint includes a header with modem and line status. Packets are always at least 2 bytes long. The packet format is as follows:
- byte 0: modem status (shows the most recent state of the modem status input pins)
- bit 0: always 1?
- bit 1: always 0?
- bit 2: always 0?
- bit 3: always 0?
- TODO: allegedly high-speed devices have 0010 in low bits?
- bit 4: CTS
- bit 5: DSR
- bit 6: RI
- bit 7: DCD
- byte 1: line status
- bit 0: data ready (???)
- bit 1: overrun error (device received data on the business end when there was no more space in IN endpoint FIFO)
- bit 2: parity error
- bit 3: framing error
- bit 4: break interrupt
- bit 5: TX holding register (???)
- bit 6: TX (OUT endpoint) FIFO is empty
- bit 7: FIFO error (???)
- bytes 2 and up (if any): actual stream data
As can be seen, the protocol is very UART-oriented. The modem and line status bytes are present even for D2xx devices that have nothing to do with UART, though they are mostly dummied out in that case. The TX FIFO empty bit is, however, generally useful.
TODO: kernel driver alleges that parity/framing errors are always associated with the last byte in the packet. Check this.
To avoid excessive load on the host, the device doesn't always transmit packets on the IN endpoint as soon as data is available. Instead, the device will send a packet in the following circumstances:
- a full-sized packet has been filled
- a special "event" character has been received (if enabled by driver)
- data is available and the latency timer has expired
- on FT8U2xxA (and FT8U100A?), the latency timer is always 16ms
- on newer devices, the default latency timer is 16ms, but it can be configured to any value between 2ms and 255ms
- TODO: line errors / modem status changes too? kernel alleges device will send an update packet every 40ms even with no activity
OUT endpoint
There are two variants of the protocol with respect to OUT endpoint handling.
The original variant is present on the FT8U100A only. In this variant, every OUT endpoint packet has to be prefixed with a header. The packet then has the following format:
- byte 0: header
- bit 0: must be 1
- bit 1: must be 0
- bits 2-7: length of payload (ie. length of packet, not including the header byte)
- bytes 1 and up: actual stream data
Since the header is completely useless, it has been done away with in later devices. In every device other than FT8U100A, the OUT endpoint is completely headerless and packets contain just the raw stream data.
Control requests
The protocol includes the following control requests:
| request | bmRequestType | bRequest | wValue | wIndex | data |
|---|---|---|---|---|---|
RESET | 0x40 | 0x00 | reset kind | channel | - |
SET_MODEM_CTRL | 0x40 | 0x01 | DTR + RTS state | channel | - |
SET_FLOW_CTRL | 0x40 | 0x02 | XON / XOFF chars | channel + mode | - |
SET_BAUD_RATE | 0x40 | 0x03 | divisor low bits | channel + divisor high bits | - |
SET_DATA_CHARACTERISTICS | 0x40 | 0x04 | data format + break state | channel | - |
GET_MODEM_STATUS | 0xc0 | 0x05 | 0 | channel | 2 bytes |
SET_EVENT_CHAR | 0x40 | 0x06 | event char + enable | channel | - |
SET_ERROR_CHAR | 0x40 | 0x07 | error char + enable | channel | - |
SET_LATENCY_TIMER | 0x40 | 0x09 | latency timer | channel | - |
GET_LATENCY_TIMER | 0xc0 | 0x0a | 0 | channel | 1 byte |
SET_BITMODE | 0x40 | 0x0b | bit mode + output mask | channel | - |
GET_PIN_STATE | 0xc0 | 0x0c | 0 | channel | 1 byte |
VENDOR_CMD_GET | 0xc0 | 0x20 | request | channel | up to 0x80 bytes |
VENDOR_CMD_SET | 0x40 | 0x21 | request + data | channel | up to 0x80 bytes |
READ_EEPROM | 0xc0 | 0x90 | 0 | word address | 2 bytes |
WRITE_EEPROM | 0x40 | 0x91 | word value | word address | - |
ERASE_EEPROM | 0x40 | 0x92 | 0 | 0 | - |
Most control requests operate on a channel. The channel is specified as follows:
- for single-channel devices: channel is 0
- for multi-channel devices: the channel indices start at 1 (ie. channel number in control request is USB interface index + 1)
- TODO: allegedly, specifying 0 means "all channels"?
The channel is usually stuffed directly into wIndex. However, there are variations to keep you on your toes.
RESET
Resets the device or purges IN/OUT endpoint buffers on device.
- applicable to: all D2xx devices
bmRequestType:0x40bRequest:0x00wValue: kind of reset to perform- 0: reset the serial engine
- purge both IN and OUT endpoints
- disable event char and set it to
0x0d('\r') - disable flow control
- clear DTR and RTS
- 1: purge OUT endpoint (nuke all buffered data)
- 2: purge IN endpoint
- 0: reset the serial engine
wIndex: channel
TODO: determine exactly what the reset actually resets; the above list is according to the kernel sources.
TODO: libftd2xx seems to always send resets with wIndex set to 0; is this a bug?
SET_MODEM_CTRL
Changes the state of DTR and RTS lines.
- applicable to: all D2xx devices (but may be a no-op in non-UART modes)
bmRequestType:0x40bRequest:0x01wValue:- bit 0: new DTR value
- bit 1: new RTS value
- bit 8: change DTR (if not set, DTR will be unchanged)
- bit 9: change RTS
wIndex: channel
SET_FLOW_CTRL
Changes hardware flow control mode.
- applicable to: all D2xx devices (but may be a no-op in non-UART modes)
bmRequestType:0x40bRequest:0x02wValue:- bits 0-7: XON character
- bits 8-15: XOFF character
wIndex:- bits 0-7: channel
- bit 8: enable RTS/CTS flow control
- bit 9: enable DTR/DSR flow control
- bit 10: enable XON/XOFF flow control
TODO: make double-sure of wIndex encoding
TODO: check if XON/XOFF is applicable to eg. FIFO mode
SET_BAUD_RATE
Sets the baud rate, and also the clock for bitbang and MPSSE modes.
- applicable to: all D2xx devices (but may be a no-op on MCU-based ones)
bmRequestType:0x40bRequest:0x03wValue: bits 0-15 of the divisor valuewIndex:- for single-channel device:
- bits 0-1: bits 16-17 of the divisor
- for multi-channel device:
- bits 0-7: channel
- bits 8-9: bits 16-17 of the divisor
- for single-channel device:
The format of the divisor varies depending on the exact device.
FT8U100A
For FT8U100A, the divisor is an enum, selecting the baud rate from the following fixed list:
- 0: 300 baud
- 1: 600
- 2: 1200
- 3: 2400
- 4: 4800
- 5: 9600
- 6: 19200
- 7: 38400
- 8: 57600
- 9: 115200
FT8U232A, FT8U245A
These devices run on 48MHz base clock. The base clock is divided by a fractional divisor to obtain the channel clock. The channel clock is then further divided by 16 to obtain the baud rate.
The divisor is encoded into a 16-bit number as follows:
- bits 0-13: integer part (must be at least 2, except for the special case below)
- bits 14-15: fractional part, encoded
- 0: .0
- 1: .5
- 2: .25
- 3: .125
There is also a special divisor with dedicated encoding:
0x0000encodes a special divisor of 1 (corresponding to 3000000 baud rate)
FT232B, FT245B, FT232R, FT245R, FT2232[CDL], FT-X series
These devices are similar to FT8U2xxA, with minor extensions. The encoding scheme is backwards-compatible.
The divisor is encoded into a 17-bit number (with top bit overflowing into the wIndex field) as follows:
- bits 0-13: integer part (must be at least 2, except for the special cases below)
- bits 14-16: fractional part, encoded
- 0: .0
- 1: .5
- 2: .25
- 3: .125
- 4: .375
- 5: .675
- 6: .75
- 7: .875
There are also two special divisors with dedicated encoding:
0x0000encodes a special divisor of 1 (corresponding to 3000000 baud rate)0x0001encodes a special divisor of 1.5 (corresponding to 2000000 baud rate)
In addition to providing the UART baud rate, the channel clock (not divided by 16) is also used for other modes such as bitbang and MPSSE.
FT2232H, FT4232H, FT232H (and all their variants)
These devices are USB high-speed peripherials, and support a higher baud rate and channel clock range. The base clock of the device is 120MHz. The divisor encoding is an extension of the one used in FT232B, and is backwards compatible.
The divisor is encoded into an 18-bit number (with top two bits overflowing into the wIndex field) as follows:
- bits 0-13: integer part (must be at least 2, except for the special cases below)
- bits 14-16: fractional part, encoded
- 0: .0
- 1: .5
- 2: .25
- 3: .125
- 4: .375
- 5: .675
- 6: .75
- 7: .875
- bit 17: divisor and UART mode
- 0: low-speed, FT232B compatible:
- base 120MHz clock is pre-divided by 2.5 into a 48MHz clock before being put through the divisor
- baud rate is channel clock divided by 16
- 1: high-speed:
- base 120MHz clock is fed directly into the divisor
- baud rate is channel clock divided by 10
- 0: low-speed, FT232B compatible:
There are also two special divisors with dedicated encoding:
0x00000or0x20000encodes a special divisor of 1 (corresponding to low-speed 3000000 or high-speed 12000000 baud rate, respectively)0x00001or0x20001encodes a special divisor of 1.5 (corresponding to low-speed 2000000 or high-speed 8000000 baud rate, respectively)
In addition to providing the UART baud rate, the channel clock (not divided by 10 or 16) is also used for other modes such as bitbang and MPSSE.
Note that, while the new high-speed divisor mode is usually preferable due to more precision, it cannot represent some of the lowest baud rates (600 baud and below). The low-speed mode should be used for those.
SET_DATA_CHARACTERISTICS
Sets the UART data format and break state.
- applicable to: all D2xx devices (but will be a no-op in non-UART mode)
bmRequestType:0x40bRequest:0x04wValue:- bits 0-7: number of data bits (7-8; allegedly FT8U100A can also do 5-6)
- bits 8-10: parity mode
- 0: none
- 1: odd
- 2: even
- 3: mark
- 4: space
- bits 11-13: stop bits
- 0: 1 bit
- 1: 1.5 bits (support status unclear)
- 2: 2 bits
- bit 14: transmitter in break state if set
wIndex: channel
GET_MODEM_STATUS
Returns current modem status and line status. This is the same information that is transmitted in the packet header bytes on the IN endpoint.
- applicable to: all D2xx devices
bmRequestType:0xc0bRequest:0x05wValue:0wIndex: channelwLength:2- data:
- byte 0: modem status (shows the most recent state of the modem status input pins)
- bit 0: always 1?
- bit 1: always 0?
- bit 2: always 0?
- bit 3: always 0?
- TODO: allegedly high-speed devices have 0010 in low bits?
- bit 4: CTS
- bit 5: DSR
- bit 6: RI
- bit 7: DCD
- byte 1: line status
- bit 0: data ready (???)
- bit 1: overrun error (device received data on the business end when there was no more space in IN endpoint FIFO)
- bit 2: parity error
- bit 3: framing error
- bit 4: break interrupt
- bit 5: TX holding register (???)
- bit 6: TX (OUT endpoint) FIFO is empty
- bit 7: FIFO error (???)
- byte 0: modem status (shows the most recent state of the modem status input pins)
TODO: allegedly FT8U100A only returns the first byte?
SET_EVENT_CHAR
Sets the special "event" character. Whenever a matching byte is received on the business end of the device, a packet will be sent on the IN endpoint immediately, instead of waiting for the buffer to fill completely or for the latency timer to expire. This can be eg. set to 0x0d (CR) to immediately present received lines to the host.
- applicable to: all D2xx devices
bmRequestType:0x40bRequest:0x06wValue:- bits 0-7: event character
- bit 8: event character enable (if unset, no event character processing is done)
wIndex: channel
SET_ERROR_CHAR
Sets the special "error" character that will be inserted into the receive FIFO in place of parity and framing errors.
- applicable to: all D2xx devices (but will be a no-op in non-UART mode)
bmRequestType:0x40bRequest:0x07wValue:- bits 0-7: error character
- bit 8: error character enable (if unset, parity and framing errors do not insert anything into the FIFO)
wIndex: channel
SET_LATENCY_TIMER
Sets the latency timer (see IN endpoint description).
- applicable to: everything except FT8U100A, FT8U232A, FT8U245A
bmRequestType:0x40bRequest:0x09wValue: latency timer, in units of 1ms (2 to 255)wIndex: channel
Note: on FT232R and FT245R this command is also used as EEPROM write unlock. The latency timer has to be set to 0x77 to enable EEPROM writes. Otherwise, the write commands get ignored.
GET_LATENCY_TIMER
Reads back the latency timer (see IN endpoint description). Also useful for telling FT8U2xxA and FT2xxB apart.
- applicable to: everything except FT8U100A, FT8U232A, FT8U245A
bmRequestType:0xc0bRequest:0x0awValue: 0wIndex: channelwLength: 1- data: latency timer (1 byte)
SET_BITMODE
Sets a special mode on the channel, overriding whatever base mode it has.
- applicable to: FT232B, FT245B, FT232R, FT245R, FT2232[CDL], FT2232H, FT4232H, FT232H, FT-X series
- async bitbang: all of the above devices
- MPSSE: FT2232[CDL] (channel A only), FT2232H, FT4232H (channel A and B only), FT232H
- sync bitbang: FT232R, FT245R, FT2232[CDL], FT2232H, FT4232H, FT232H, FT-X series
- MCU host bus: FT2232[CDL], FT2232H
- fast opto-isolated serial: FT2232[CDL], FT2232H, FT232H
- CBUS bit-bang: FT232R, FT232H, FT-X series
- synchronous 245-style FIFO: FT2232H, FT232H
- FT1248: FT232H maybe?!?
bmRequestType:0x40bRequest:0x09wValue:- bits 0-7: depends on mode
- async and sync bit-bang: mask of which data pins are outputs (0 is input, 1 is output)
- CBUS bit-bang:
- bits 0-3: output data
- bits 4-7: output pin mask (0 is input, 1 is output)
- others: unused?
- bits 8-15: mode
- 0x00: reset to base mode
- 0x01: async bit-bang
- 0x02: MPSSE
- 0x04: sync bit-bang
- 0x08: MCU host bus
- 0x10: reset fast opto-isolated serial (?!?!?)
- 0x20: CBUS bit-bang
- 0x40: synchronous 245-style FIFO
- 0x80: allegedly FT1248 according to libftdi (?!?!?)
- bits 0-7: depends on mode
wIndex: channel
TODO: figure out the details of this cursed thing
TODO: why are FT1248 and fast opto-isolated serial set both here and in the EEPROM
TODO: CBUS bit-bang has special semantics and can be combined with base mode?!? figure that out
GET_PIN_STATE
Reads current raw state of the channel's DBUS pins.
FTDI calls this request GET_BITMODE. However, this naming decision is a crime against catgirlkind, and we shall not respect it.
- applicable to: FT232B, FT245B, FT232R, FT245R, FT2232[CDL], FT2232H, FT4232H, FT232H, FT-X series
bmRequestType:0xc0bRequest:0x0cwValue: 0wIndex: channelwLength: 1- data: pin state
TODO: allegedly this reads CBUS state instead of DBUS state when in CBUS bit-bang mode
VENDOR_CMD_GET
Does a vendor-specific operation with get semantics. Corresponds to FT_VendorCmdGet and FT_VendorCmdGetEx.
You may be asking yourself why FTDI saw fit to create a space for vendor-defined requests within its vendor-defined requests space as defined by USB, given that it is the defining vendor in both cases. The answer is that I have no meowing idea. However, this seems to be where they stuff a bunch of subcommands specific to their weirder devices.
- applicable to: FT4222H, allegedly UMFTPD3A
bmRequestType:0xc0bRequest:0x20wValue: request typewIndex: channel (or not, it's vendor-defined after all)wLength: up to0x80
The request set appears to be specific to the exact device. For the FT4222H request list, see [TODO].
VENDOR_CMD_SET
Does a vendor-specific operation with set semantics. Corresponds to FT_VendorCmdSet.
- applicable to: FT4222H, allegedly UMFTPD3A
bmRequestType:0x40bRequest:0x21wValue:- bits 0-7: request type
- bits 8-15: data, if a single byte of data is transferred
wIndex: channel (or not, it's vendor-defined after all)wLength: up to0x80
If exactly 1 byte is sent to the device, it is put in the high byte of wValue, and wLength is set to 0. If more than 1 byte is sent to the device, they are all put in the data payload, and the high byte of wValue is unused.
The request set appears to be specific to the exact device. For the FT4222H request list, see [TODO].
READ_EEPROM
Reads a 16-bit word from the EEPROM.
- applicable to: FT8U100A?, FT8U232A, FT8U245A, FT232B, FT245B, FT232R, FT245R, FT2232[CDL], FT2232H, FT4232H, FT232H, FT-X series
bmRequestType:0xc0bRequest:0x90wValue: 0wIndex: word address to read; note that the address is counted in 16-bit words, not byteswLength: 2- data: word from EEPROM (little-endian)
The format of the EEPROM depends on the device. See the documentation for the particular device.
WRITE_EEPROM
Writes a 16-bit word into the EEPROM.
- applicable to: FT8U100A?, FT8U232A, FT8U245A, FT232B, FT245B, FT232R, FT245R, FT2232[CDL], FT2232H, FT4232H, FT232H, FT-X series
bmRequestType:0x40bRequest:0x91wValue: word to write to the EEPROMwIndex: word address to write; note that the address is counted in 16-bit words, not bytes
Note: on FT232R and FT245R this command is only accepted when the latency timer is set to the magic 0x77 value.
Note that the EEPROM on FT232R and FT245R devices is 32-bit dword oriented, not 16-bit. This is completely transparent on reads, but is significant for writes: FT2xxR EEPROM must always be written one aligned dword at a time, with the lower-address word written first.
TODO: what about FT-X series?
ERASE_EEPROM
Erases the entire EEPROM.
- applicable to: FT8U100A?, FT8U232A, FT8U245A, FT232B, FT245B, FT2232[CDL], FT2232H, FT4232H, FT232H
bmRequestType:0x40bRequest:0x92wValue: 0wIndex: 0
FIFO modes
TODO
Bitbang modes
TODO
MPSSE mode
TODO
MCU host bus mode
TODO
FT1248 mode
TODO
Fast opto-isolated serial mode
TODO
I2C peripherial mode
TODO
FT8U232A and FT8U245A
The first generation of fixed-function D2xx devices. The devices are:
- FT8U232AM: UART mode, 32-pin MQFP
- FT8U245AM: FIFO mode, 32-pin MQFP
Both devices look exactly the same from the software perspective, and in fact may or may not be the same silicon.
Features:
- is a full-speed USB 1.1 peripherial
- single channel D2xx device, hardwired to either UART or FIFO mode
- no alternate bit modes
- 384-byte IN FIFO, 128-byte OUT FIFO
- 48MHz internal base clock, generated from 6MHz crystal
- 5V VCC supply (used for internal circuitry and business-end IO)
- separate AGND and AVCC supply for the clock multiplier
- internal 3.3V LDO
- required external support circuitry:
- USB D+ pullup
- power-on reset circuit
- decoupling capacitor for internal LDO
- RC timer for oscillator bootstrap
- 6MHz crystal
- optionally, a 93C46 64×16-bit EEPROM
The default VID:PID of the device is 0403:6001, unless configured otherwise by the EEPROM. The bcdDevice value is 0x0200.
Pinout
| MQFP pin | category | FT8U232A | FT8U245A |
|---|---|---|---|
| 1 | EEPROM | EESK | EESK |
| 2 | EEPROM | EEDATA | EEDATA |
| 3 | power | VCC | VCC |
| 4 | control | RESET# | RESET# |
| 5 | control | TEST | TEST |
| 6 | power | 3V3OUT | 3V3OUT |
| 7 | USB | USBDP | USBDP |
| 8 | USB | USBDM | USBDM |
| 9 | power | GND | GND |
| 10 | IO | SLEEP# | EEGNT# |
| 11 | IO | RXLED# | EEREQ# |
| 12 | IO | TXLED# | RXF# |
| 13 | power | VCC | VCC |
| 14 | IO | PWRCTL | TXE# |
| 15 | IO | USBEN | WR |
| 16 | IO | TXDEN | RD# |
| 17 | power | GND | GND |
| 18 | IO | RI# | D7 |
| 19 | IO | DCD# | D6 |
| 20 | IO | DSR# | D5 |
| 21 | IO | DTR# | D4 |
| 22 | IO | CTS# | D3 |
| 23 | IO | RTS# | D2 |
| 24 | IO | RXD | D1 |
| 25 | IO | TXD | D0 |
| 26 | power | VCC | VCC |
| 27 | clock | XTIN | XTIN |
| 28 | clock | XTOUT | XTOUT |
| 29 | power | AGND | AGND |
| 30 | power | AVCC | AVCC |
| 31 | clock | RCCLK | RCCLK |
| 32 | EEPROM | EECS | EECS |
UART-mode IO pins have the following functions:
- TXD, RXD, RTS#, CTS#, DTR#, DSR#, DCD#, RI#: standard UART pins
- SLEEP#: device output, goes low when in USB suspend mode
- RXLED#, TXLED#: active-low LED outputs
- PWRCTL: device input, used to generate USB descriptors when EEPROM not present or not functional
- 0: bus-powered
- 1: self-powered
- TXDEN: device output, high while TXD is actively transmitting data; can be used as transmitter enable for RS485 transceivers
- USBEN: device output, high after the host configures the device
FIFO-mode IO pins have the following functions:
- D0-D7, TXE#, RXF#, RD#, WR: standard FIFO-mode pins
- EEREQ#: device input, requests access to EEPROM via data bus
- EEGNT#: device output, grants access to EEPROM via data bus
The semantics of EEREQ# and EEGNT# are unclear. They were removed from all subsequent devices.
TODO: wtf is this exactly
The EEPROM interface is 3-pin at the FTDI chip, while the EEPROM itself has a 4-pin interface. This is because the FTDI device uses a single tied data line. To connect the EEPROM, connect the FTDI EEDATA pin directly to the ROM's data input, and to the data output via a 2.2kΩ resistor.
EEPROM data format
- word 0x00: always 0
- word 0x01: idVendor (USB VID)
- word 0x02: idProduct (USB PID)
- word 0x03: bcdDevice (should be 0x200)
- 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
- words 0x05, 0x06: always 0
- word 0x07: manufacturer string pointer
- word 0x08: product description string pointer
- word 0x09: serial number string pointer
- words 0x0a..0x3f: string / user area
- word 0x3f: checksum
String pointers are formatted as follows:
- bits 0-6: pointer to descriptor within EEPROM (counted in bytes)
- bit 7: always set to 1
- bits 8-15: total length of descriptor in bytes
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; 0x40]) -> u16 { let mut res: u16 = 0xaaaa; for pos in 0..0x3f { // checksum word is NOT included — we're calculating it res ^= eeprom[pos]; res = res.rotate_left(1); } res } }
FT232B and FT245B
The second generation of fixed-function D2xx devices, an upgrade to FT8U232A and FT8U245A. The devices are:
- FT232BM: UART mode, 32-pin LQFP
- FT232BL: UART mode, 32-pin LQFP (lead-free version)
- FT232BQ: UART mode, 32-pin QFN
- FT245BM: FIFO mode, 32-pin LQFP
- FT245BL: FIFO mode, 32-pin LQFP (lead-free version)
Both FT232B and FT245B look exactly the same from the software perspective, and in fact may or may not be the same silicon.
Features:
- is a full-speed USB 1.1 peripherial
- single channel D2xx device, hardwired to either UART or FIFO base mode
- can be set to an alternate mode: async bitbang
- 384-byte IN FIFO, 128-byte OUT FIFO
- 48MHz internal base clock, generated from 6MHz crystal
- 5V VCC supply for internal circuitry
- separate 3.3V or 5V VCCIO supply for business-end IO
- separate AGND and AVCC 5V supply for the clock multiplier
- internal 3.3V LDO
- internal power-on reset circuit
- required external support circuitry:
- USB D+ pullup
- decoupling capacitor for internal LDO
- 6MHz crystal or external clock
- optionally, a 93C46 64×16-bit EEPROM; a 93C56 or 93C66 is also acceptable, but the device will not be able to access the extra space
On reset, the device samples the value of the EESK pin to determine the default VID:PID that will be used unless configured otherwise by the EEPROM. The default VID:PID is:
0403:6001if EESK is high (or left floating, as the device has weak internal pullup)0403:6004if EESK is low and the device is an FT232B0403:6005if EESK is low and the device is an FT245B
The bcdDevice value for the device is 0x0200 (same as FT8U2xxA) if no serial number has been configured, or 0x0400 if a serial number has been configured.
Pinout
The pinout is mostly, but not quite, compatible with FT8U2xxA.
| LQFP / QFN pin | category | FT8U232A | FT8U245A |
|---|---|---|---|
| 1 | EEPROM | EESK | EESK |
| 2 | EEPROM | EEDATA | EEDATA |
| 3 | power | VCC | VCC |
| 4 | control | RESET# | RESET# |
| 5 | control | RSTOUT# | RSTOUT# |
| 6 | power | 3V3OUT | 3V3OUT |
| 7 | USB | USBDP | USBDP |
| 8 | USB | USBDM | USBDM |
| 9 | power | GND | GND |
| 10 | IO | SLEEP# | PWREN# |
| 11 | IO | RXLED# | SI/WU# |
| 12 | IO | TXLED# | RXF# |
| 13 | power | VCCIO | VCCIO |
| 14 | IO | PWRCTL | TXE# |
| 15 | IO | PWREN# | WR |
| 16 | IO | TXDEN | RD# |
| 17 | power | GND | GND |
| 18 | IO | RI# | D7 |
| 19 | IO | DCD# | D6 |
| 20 | IO | DSR# | D5 |
| 21 | IO | DTR# | D4 |
| 22 | IO | CTS# | D3 |
| 23 | IO | RTS# | D2 |
| 24 | IO | RXD | D1 |
| 25 | IO | TXD | D0 |
| 26 | power | VCC | VCC |
| 27 | clock | XTIN | XTIN |
| 28 | clock | XTOUT | XTOUT |
| 29 | power | AGND | AGND |
| 30 | power | AVCC | AVCC |
| 31 | control | TEST | TEST |
| 32 | EEPROM | EECS | EECS |
UART-mode IO pins have the following functions:
- TXD, RXD, RTS#, CTS#, DTR#, DSR#, DCD#, RI#: standard UART pins
- SLEEP#: device output, goes low when in USB suspend mode
- RXLED#, TXLED#: active-low LED outputs
- PWRCTL: device input, used to generate USB descriptors when EEPROM not present or not functional
- 0: bus-powered
- 1: self-powered
- TXDEN: device output, high while TXD is actively transmitting data; can be used as transmitter enable for RS485 transceivers
- PWREN#: device output, low when the device has been configured by the host and is not in suspend mode (can be used to gate power to the rest of the board)
FIFO-mode IO pins have the following functions:
- D0-D7, TXE#, RXF#, RD#, WR, SI/WU#: standard FIFO-mode pins
- PWREN#: like in UART mode
The EEPROM interface is 3-pin at the FTDI chip, while the EEPROM itself has a 4-pin interface. This is because the FTDI device uses a single tied data line. To connect the EEPROM, connect the FTDI EEDATA pin directly to the ROM's data input, and to the data output via a 2.2kΩ resistor.
EEPROM data format
The format is backwards-compatible with the one used by FT8U2xxA devices.
- word 0x00: always 0
- word 0x01: idVendor (USB VID)
- word 0x02: idProduct (USB PID)
- word 0x03: bcdDevice (should be 0x400 or 0x200 when serial number not present)
- 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 0: IN endpoint is isochronous
- bit 1: OUT endpoint is isochronous
- bit 2: IO pulldown in suspend
- bit 3: serial number enabled
- bit 4: bcdUSB is present
- word 0x06: bcdUSB
- word 0x07: manufacturer string pointer
- word 0x08: product description string pointer
- word 0x09: serial number string pointer
- words 0x0a..0x3f: string / user area
- word 0x3f: checksum
String pointers are formatted as follows:
- bits 0-6: pointer to descriptor within EEPROM (counted in bytes)
- bit 7: always set to 1
- bits 8-15: total length of descriptor in bytes
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; 0x40]) -> u16 { let mut res: u16 = 0xaaaa; for pos in 0..0x3f { // checksum word is NOT included — we're calculating it res ^= eeprom[pos]; res = res.rotate_left(1); } res } }
FT2232[CDL]
The third generation of fixed-function D2xx devices, now with two channels. The devices are:
- FT2232C: first revision; 48-pin LQFP package
- FT2232L: first revision; 48-pin LQFP package (lead-free version)
- FT2232D: second revision, fixed CPU FIFO mode; 48-pin LQFP package (lead-free version)
The FT2232H is an entirely different device, and is not described here.
Features:
- is a full-speed USB 1.1 peripherial
- dual-channel 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)
- new CPU FIFO mode (selected in EEPROM; FT2232D only — this mode is present but unusably broken on FT2232C)
- FT2xxB-like async bitbang mode (dynamically selected)
- new sync bitbang mode (dynamically selected)
- new MPSSE mode (dynamically selected; channel A only)
- new fast opto-isolated serial mode (selected in EEPROM)
- new MCU bus controller mode (dynamically selected; uses both channels)
- 384-byte IN FIFOs, 128-byte OUT FIFOs (per channel)
- 48MHz internal base clock, generated from 6MHz crystal
- 5V VCC supply for internal circuitry
- separate 3.3V or 5V VCCIOA supply for channel A business-end IO
- separate 3.3V or 5V VCCIOB supply for channel B business-end IO
- separate AGND and AVCC 5V supply for the clock multiplier
- internal 3.3V LDO
- internal power-on reset circuit
- required external support circuitry:
- USB D+ pullup
- decoupling capacitor for internal LDO
- 6MHz crystal or external clock
- optionally, a 93C46 (64×16-bit), 93C56 (128×16-bit), or 93C66 (256×16-bit) EEPROM
The default VID:PID of the device is 0403:6010, unless configured otherwise by the EEPROM. The bcdDevice value is 0x0500.
Pinout
| pin | category | function |
|---|---|---|
| 1 | EEPROM | EESK |
| 2 | EEPROM | EEDATA |
| 3 | power | VCC |
| 4 | control | RESET# |
| 5 | control | RSTOUT# |
| 6 | power | 3V3OUT |
| 7 | USB | USBDP |
| 8 | USB | USBDM |
| 9 | power | GND |
| 10 | IO-A | SI/WUA |
| 11 | IO-A | ACBUS3 |
| 12 | IO-A | ACBUS2 |
| 13 | IO-A | ACBUS1 |
| 14 | power | VCCIOA |
| 15 | IO-A | ACBUS0 |
| 16 | IO-A | ADBUS7 |
| 17 | IO-A | ADBUS6 |
| 18 | power | GND |
| 19 | IO-A | ADBUS5 |
| 20 | IO-A | ADBUS4 |
| 21 | IO-A | ADBUS3 |
| 22 | IO-A | ADBUS2 |
| 23 | IO-A | ADBUS1 |
| 24 | IO-A | ADBUS0 |
| 25 | power | GND |
| 26 | IO-B | SI/WUB |
| 27 | IO-B | BCBUS3 |
| 28 | IO-B | BCBUS2 |
| 29 | IO-B | BCBUS1 |
| 30 | IO-B | BCBUS0 |
| 31 | power | VCCIOB |
| 32 | IO-B | BDBUS7 |
| 33 | IO-B | BDBUS6 |
| 34 | power | GND |
| 35 | IO-B | BDBUS5 |
| 36 | IO-B | BDBUS4 |
| 37 | IO-B | BDBUS3 |
| 38 | IO-B | BDBUS2 |
| 39 | IO-B | BDBUS1 |
| 40 | IO-B | BDBUS0 |
| 41 | control | PWREN# |
| 42 | power | VCC |
| 43 | clock | XTIN |
| 44 | clock | XTOUT |
| 45 | power | AGND |
| 46 | power | AVCC |
| 47 | control | TEST |
| 48 | EEPROM | EECS |
Pin functions per mode
| pin | UART | FIFO | CPU FIFO | bitbang (U) | bitbang (F) | 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# | CS# | - | WR# | GPIOH0 | I/O0 | - |
| ACBUS1 | SLEEP# | TXE# | A0 | - | RD# | GPIOH1 | I/O1 | - |
| ACBUS2 | RXLED# | RD# | RD# | WR# | - | GPIOH2 | IORDY | - |
| ACBUS3 | TXLED# | WR | WR# | RD# | - | GPIOH3 | OSC | - |
| SI/WUA | SI/WU | SI/WU | - (?) | SI/WU | SI/WU | N/A | - | - |
| BDBUS0 | TXD | D0 | D0 | D0 | D0 | N/A | A8 | FSDI |
| BDBUS1 | RXD | D1 | D1 | D1 | D1 | N/A | A9 | FSCLK |
| BDBUS2 | RTS# | D2 | D2 | D2 | D2 | N/A | A10 | FSDO |
| BDBUS3 | CTS# | D3 | D3 | D3 | D3 | N/A | A11 | FSCTS |
| BDBUS4 | DTR# | D4 | D4 | D4 | D4 | N/A | A12 | - |
| BDBUS5 | DSR# | D5 | D5 | D5 | D5 | N/A | A13 | - |
| BDBUS6 | DCD# | D6 | D6 | D6 | D6 | N/A | A14 | - |
| BDBUS7 | RI# | D7 | D7 | D7 | D7 | N/A | A15 | - |
| BCBUS0 | TXDEN | RXF# | CS# | - | WR# | N/A | CS# | - |
| BCBUS1 | SLEEP# | TXE# | A0 | - | RD# | N/A | ALE | - |
| BCBUS2 | RXLED# | RD# | RD# | WR# | - | N/A | RD# | - |
| BCBUS3 | TXLED# | WR | WR# | RD# | - | N/A | WR# | - |
| SI/WUB | SI/WU | SI/WU | - (?) | SI/WU | SI/WU | N/A | - | SI/WU |
Note: for bitbang modes, the pin assignments in the "bitbang (U)" column apply when the base mode of the channel is UART, and the "bitbang (F)" column applies otherwise.
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.
- word 0x00:
- 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
- bit 4: channel A high current output drive
- bits 8-10: channel B mode (see above)
- bit 11: channel B enable bind to VCP driver
- bit 12: channel B high current output drive
- bits 0-2: channel A mode
- word 0x01: idVendor (USB VID)
- word 0x02: idProduct (USB PID)
- word 0x03: bcdDevice (0x500)
- 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 0: channel A IN endpoint is isochronous
- bit 1: channel A OUT endpoint is isochronous
- bit 2: IO pulldown in suspend
- bit 3: serial number enabled
- bit 4: bcdUSB is present
- bit 5: channel B IN endpoint is isochronous
- bit 6: channel B OUT endpoint is isochronous
- word 0x06: bcdUSB
- word 0x07: manufacturer string pointer
- word 0x08: product description string pointer
- word 0x09: serial number string pointer
- word 0x0a: EEPROM type
- 0x46: 93C46 (64-word)
- 0x56: 93C56 (128-word)
- 0x66: 93C66 (256-word)
- for 64-word EEPROM:
- words 0x0b..0x3f: string / user area
- word 0x3f: checksum
- for 128-word and 256-word EEPROM:
- words 0xb..0x4b: user area
- words 0x4b..0x7f: string / user area
- word 0x7f: checksum
- words 0x80..0x100 (256-word EEPROM only): user area (not covered by 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 0x4b, 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 } }
FT232R and FT245R
The fourth generation of fixed-function D2xx devices, an upgrade to FT232B and FT245B. The devices are:
- FT232RL: UART mode, 28-pin TSSOP
- FT232RQ: UART mode, 32-pin QFN
- FT245RL: FIFO mode, 28-pin TSSOP
- FT245RQ: FIFO mode, 32-pin QFN
- FT232RNL: revised version, UART mode, 28-pin TSSOP
- FT232RNQ: revised version, UART mode, 32-pin QFN
- FT245RNL: revised version, FIFO mode, 28-pin TSSOP
- FT245RNQ: revised version, FIFO mode, 32-pin QFN
FT232R and FT245R are the exact same device, and differ only in a configuration bit in the internal EEPROM. That bit can just be reprogrammed by the user. Likewise, FT232RN and FT245RN are the exact same device.
The FT2xxRN is a minor revision of FT2xxR, making the internal oscillator work when powered by 3.3V VCC.
Features:
- is a full-speed USB 1.1 peripherial
- single channel D2xx device, set to either UART or FIFO base mode by EEPROM
- in UART mode, the device has 5 CBUS pins that can be programmed (via EEPROM) to a variety of functions
- added EEPROM-programmable signal inversion on all UART pins
- dynamically-selectable alternate modes include:
- FT2xxB-like async bitbang
- FT2232-like sync bitbang
- a new CBUS bitbang mode
- 256-byte IN FIFO, 128-byte OUT FIFO
- internal EEPROM, replacing the external EEPROM interface of FT2xxB
- pre-programmed factory area in EEPROM, including a unique chip ID
- 48MHz internal base clock, generated from either internal 12MHz oscillator or external 12MHz crystal
- external oscillator has to be selected through EEPROM configuration
- internal oscillator doesn't work on 3.3V VCC on the original FT2xxR
- ... leading to a fun factory programming procedure if you wish to use the device on 3.3V VCC, which likely further motivated the FT2xxRN revision
- 3.3V or 5V VCC supply for internal circuitry
- separate 1.8V to 5V VCCIO supply for business-end IO
- internal 5V-to-3.3V LDO
- internal D+ pullup resistor
- internal power-on reset circuit
- required external support circuitry:
- just the decoupling capacitors
The default VID:PID of the device is 0403:6001 (FT2xxR) or 0403:6049 (FT2xxRN), unless configured otherwise by the EEPROM. The bcdDevice value is 0x0600.
Pinout
| QFN32 | TSSOP28 | category | FT232R | FT245R |
|---|---|---|---|---|
| 1 | 4 | power | VCCIO | VCCIO |
| 2 | 5 | IO-DBUS | RXD | D1 |
| 3 | 6 | IO-DBUS | RI# | D7 |
| 4 | 7 | power | GND | GND |
| 5 | 8 | NC? | - | - |
| 6 | 9 | IO-DBUS | DSR# | D5 |
| 7 | 10 | IO-DBUS | DCD# | D6 |
| 8 | 11 | IO-DBUS | CTS# | D3 |
| 9 | 12 | IO-CBUS | CBUS4 | PWREN# |
| 10 | 13 | IO-CBUS | CBUS2 | RD# |
| 11 | 14 | IO-CBUS | CBUS3 | WR |
| 12 | - | NC | - | - |
| 13 | - | NC | - | - |
| 14 | 15 | USB | USBDP | USBDP |
| 15 | 16 | USB | USBDN | USBDN |
| 16 | 17 | power | 3V3OUT | 3V3OUT |
| 17 | 18 | power | GND | GND |
| 18 | 19 | control | RESET# | RESET# |
| 19 | 20 | power | VCC | VCC |
| 20 | 21 | power | GND | GND |
| 21 | 22 | IO-CBUS | CBUS1 | TXE# |
| 22 | 23 | IO-CBUS | CBUS0 | RXF# |
| 23 | 24 | NC? | - | - |
| 24 | 25 | power | AGND | AGND |
| 25 | - | NC | - | - |
| 26 | 26 | control | TEST | TEST |
| 27 | 27 | clock | OSCI | OSCI |
| 28 | 28 | clock | OSCO | OSCO |
| 29 | - | NC | - | - |
| 30 | 1 | IO-DBUS | TXD | D0 |
| 31 | 2 | IO-DBUS | DTR# | D4 |
| 32 | 3 | IO-DBUS | RTS# | D2 |
TODO: FT245R datasheet and FT_PROG claim that CBUS pins are not programmable on the FT245R and perform fixed functions. This is most likely to be a lie.
CBUS pins
The device has 5 CBUS pins. They can be configured through the EEPROM to do the following functions:
| EEPROM value | valid on pins | function |
|---|---|---|
0x0 | all | UART TXDEN |
0x1 | all | PWREN# |
0x2 | all | UART RXLED# |
0x3 | all | UART TXLED# |
0x4 | all | UART TXRXLED# |
0x5 | all | SLEEP# |
0x6 | all | CLK48 |
0x7 | all | CLK24 |
0x8 | all | CLK12 |
0x9 | all | CLK6 |
0xa | CBUS0-CBUS3 | I/O (for CBUS bitbang mode) |
0xb | CBUS0-CBUS3 | bitbang WR# |
0xc | CBUS0-CBUS3 | bitbang RD# |
0xd | CBUS0 | FIFO RXF# |
0xd | CBUS1 | FIFO TXE# |
0xd | CBUS2 | FIFO RD# |
0xd | CBUS3 | FIFO WR |
TODO: this list (particularly "valid on pins" and everything relating to FT245R) should be deemed extremely suspicious, as it seems to differ a lot between the datasheet, FT_PROG, and libftd2xx, and also doesn't seem to make all that much sense. The above is merely a least-squares approximation assembled from multiple lying sources.
The factory-programmed defaults are as follows:
| pin | FT232R | FT245R |
|---|---|---|
| CBUS0 | TXLED# | RXF# |
| CBUS1 | RXLED# | TXE# |
| CBUS2 | TXDEN | RD# |
| CBUS3 | PWREN# | WR |
| CBUS4 | SLEEP# | PWREN# |
The TXDEN, TXLED#, RXLED#, PWREN# and SLEEP# functions perform the same role as corresponding FT232B pins. TXRXLED# is a composite LED output, showing both TX and RX activity. CLK* functions provide a clock output of the selected frequency (6 to 48MHz).
EEPROM format
The device has a 40×32-bit internal EEPROM. However, it pretends to be a 80×16-bit word EEPROM on the USB interface. Words 0x00..0x40 are user-programmable, while words 0x40..0x50 contain factory-programmed data and are (allegedly) immutable. Note that the factory area is not covered by the checksum (or maybe has its own checksum).
The device introduces a simple "EEPROM write lock" mechanism: the EEPROM can only be programmed when the current latency timer is set to 0x77.
The "erase EEPROM" request is not supported on FT2xxR (presumably because, if supported, it'd erase the entire EEPROM along with factory data).
The 32-bit dword internal organization of the EEPROM is completely transparent on reads: the device will read the whole dword and reply to the USB request with just the relevant half of it. However, writes need to be handled specially:
- when the device receives a "write EEPROM word" request for an even-address word, the data is stored in an internal register, but EEPROM is not modified
- when the device receives a "write EEPROM word" request for an odd-address word, the data is combined together with the last data word previously stored in the register by an even-address write, and the whole 32-bit dword is written into EEPROM
This effectively means that EEPROM writes always have to be issued in aligned word pairs to work properly. In an infamous incident, FTDI Windows drivers abused this subtle behavior (which FT2xxR clones generally didn't replicate) to selectively brick clone devices.
The EEPROM format is:
- word 0x00:
- bit 0: device kind
- 0: FT232R
- 1: FT245R
- NOTE: the vendor programming tools go out of their way to preserve the value of this bit. However, using the raw control requests, it can be modified just fine, turning an FT232R device into an FT245R or vice-versa.
- bit 1: use external oscillator
- bit 2: high-current IO
- bit 3: enable bind to VCP driver
- bit 4: regulator on during suspend
- bit 8-15: bulk endpoint max packet size (0x40 by default)
- note: badly-programmed devices exist with this field set to 0; this needs to be worked around in the driver
- TODO: it is unclear whether this applies to IN, OUT, or both
- bit 0: device kind
- word 0x01: idVendor (USB VID)
- word 0x02: idProduct (USB PID)
- word 0x03: bcdDevice (0x600)
- 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 8: invert TXD (FT232R only)
- bit 9: invert RXD (FT232R only)
- bit 10: invert RTS (FT232R only)
- bit 11: invert CTS (FT232R only)
- bit 12: invert DTR (FT232R only)
- bit 13: invert DSR (FT232R only)
- bit 14: invert DCD (FT232R only)
- bit 15: invert RI (FT232R only)
- word 0x06: bcdUSB (always 2.0?)
- word 0x07: manufacturer string pointer
- word 0x08: product description string pointer
- word 0x09: serial number string pointer
- word 0x0a:
- bits 0-3: CBUS0 function (see table above)
- bits 4-7: CBUS1 function
- bits 8-11: CBUS2 function
- bits 12-15: CBUS3 function
- word 0x0b:
- bits 0-3: CBUS4 function
- words 0x0c..0x3f: string / user area
- word 0x3f: checksum
- words 0x40..0x50: factory data (mostly unknown)
- word 0x42:
- bit 1: is FT2xxRN
- word 0x43: low word of unscrambled chipid (unique per-device ID)
- word 0x44: high word of unscrambled chipid
- word 0x42:
String pointers are formatted as follows:
- bits 0-6: pointer to descriptor within EEPROM (counted in bytes)
- bit 7: always set to 1
- bits 8-15: total length of descriptor in bytes
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; 0x50]) -> u16 { let mut res: u16 = 0xaaaa; for pos in 0..0x3f { // checksum word is NOT included — we're calculating it res ^= eeprom[pos]; res = res.rotate_left(1); } res } }
For unknown reasons, the libftchipid library returns the chipid in scrambled form, computed as follows:
#![allow(unused)] fn main() { fn scramble_byte(b: u8) -> u8 { (b & 1) << 1 | (b & 2) << 5 | (b & 4) >> 2 | (b & 8) << 4 | (b & 0x10) >> 1 | (b & 0x20) >> 1 | (b & 0x40) >> 4 | (b & 0x80) >> 2 } fn scramble_chipid(eeprom_chipid: u32) -> u32 { let scrambled_b0 = scramble_byte((unscrambled_chipid & 0xff) as u8); let scrambled_b1 = scramble_byte((unscrambled_chipid >> 8 & 0xff) as u8); let scrambled_b2 = scramble_byte((unscrambled_chipid >> 16 & 0xff) as u8); let scrambled_b3 = scramble_byte((unscrambled_chipid >> 24 & 0xff) as u8); // note the byte reversal let word = (scrambled_b0 as u32) << 24 | (scrambled_b1 as u32) << 16 | (scrambled_b2 as u32) << 8 | (scrambled_b3 as u32); word ^ 0xa5f0f7d1 } }
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 } }
FT232H
The sixth generation of fixed-function D2xx devices. This is essentially half of an FT2232H with some improvements.
The base device is FT232H. However, just like FT2232H, it also has two USB-PD variants:
- FT233HP: two USB-PD ports
- FT232HP: one USB-PD port (actually identical to FT233HP with the extra port unbonded)
Both USB-PD variants are the same silicon (which is distinct from the "base" FT232H silicon).
Features:
- is a high-speed USB 2.0 peripherial
- integrated D+ pullup resistor
- single-channel D2xx device
- can be configured to one of several supported modes:
- FT232R-like UART mode (default)
- FT245R-like FIFO mode (selected in EEPROM)
- FT2232H-like synchronous FIFO mode (dynamically selected variant of FIFO mode)
- FT2232D-like CPU FIFO mode (selected in EEPROM)
- FT2xxB-like async bitbang mode (dynamically selected)
- FT2232C-like sync bitbang mode (dynamically selected)
- FT232R-like CBUS bitbang mode (dynamically selected, but has to be pre-configured in EEPROM)
- FT2232C-like MPSSE mode (dynamically selected)
- FT2232C-like fast opto-isolated serial mode (selected in EEPROM)
- new FT1248 mode (selected in EEPROM)
- 1kiB IN FIFO and 1kiB out FIFO
- 120MHz internal base clock, generated from 12MHz crystal or external oscillator
- internal 5V to 3.3V
- internal 5V/3.3V to 1.8V LDO
- 1.8V VCORE power supply for internal logic from 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
- decoupling capacitor for internal LDO
- 12MHz crystal or oscillator
- optionally, a 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 | USB-PD ports | default VID:PID | bcdDevice | package |
|---|---|---|---|---|
| FT232HL | - | 0403:6014 | 0x0900 | 48-pin LQFP |
| FT232HQ | - | 0403:6014 | 0x0900 | 48-pin QFN |
| FT233HPQ | 2 | 0403:6044 | 0x3200 | 64-pin QFN |
| FT232HPQ | 1 | 0403:6045 | 0x3300 | 56-pin QFN |
Pinout — base device
| LQFP48 and QFN48 | category | function |
|---|---|---|
| 1 | clock | XCSI |
| 2 | clock | XCSO |
| 3 | power | VPHY |
| 4 | power | AGND |
| 5 | reference | REF |
| 6 | USB | DM |
| 7 | USB | DP |
| 8 | power | VPLL |
| 9 | power | AGND |
| 10 | power | GND |
| 11 | power | GND |
| 12 | power | VCCIO |
| 13 | IO-DBUS | ADBUS0 |
| 14 | IO-DBUS | ADBUS1 |
| 15 | IO-DBUS | ADBUS2 |
| 16 | IO-DBUS | ADBUS3 |
| 17 | IO-DBUS | ADBUS4 |
| 18 | IO-DBUS | ADBUS5 |
| 19 | IO-DBUS | ADBUS6 |
| 20 | IO-DBUS | ADBUS7 |
| 21 | IO-CBUS | ACBUS0 |
| 22 | power | GND |
| 23 | power | GND |
| 24 | power | VCCIO |
| 25 | IO-CBUS | ACBUS1 |
| 26 | IO-CBUS | ACBUS2 |
| 27 | IO-CBUS | ACBUS3 |
| 28 | IO-CBUS | ACBUS4 |
| 29 | IO-CBUS | ACBUS5 |
| 30 | IO-CBUS | ACBUS6 |
| 31 | IO-CBUS | ACBUS7 |
| 32 | IO-CBUS | ACBUS8 |
| 33 | IO-CBUS | ACBUS9 |
| 34 | control | RESET# |
| 35 | power | GND |
| 36 | power | GND |
| 37 | power | VCCA |
| 38 | power | VCCCORE |
| 39 | power | VCCD |
| 40 | power | VREGIN |
| 41 | power | AGND |
| 42 | control | TEST |
| 43 | EEPROM | EEDATA |
| 44 | EEPROM | EECLK |
| 45 | EEPROM | EECS |
| 46 | power | VCCIO |
| 47 | power | GND |
| 48 | power | GND |
Pinout — USB-PD devices
| QFN64 | QFN56 | category | function |
|---|---|---|---|
| 1 | 1 | EEPROM | EECS |
| 2 | 2 | EEPROM | EECLK |
| 3 | 3 | EEPROM | EEDATA |
| 4 | 4 | control | TEST |
| 5 | 5 | power | VCCIO |
| 6 | 6 | control | RESET# |
| 7 | 7 | IO-PD | GPIO0 |
| 8 | 8 | IO-PD | GPIO1 |
| 9 | 9 | IO-PD | GPIO2 |
| 10 | 10 | IO-PD | GPIO3 |
| 11 | - | IO-PD | GPIO4 |
| 12 | - | IO-PD | GPIO5 |
| 13 | 11 | power | VCORE |
| 14 | 12 | power | GND |
| 15 | 13 | power | VCCIO |
| 16 | - | IO-PD | GPIO6 |
| 17 | - | IO-PD | GPIO7 |
| 18 | 14 | power | VCCIO |
| 19 | 15 | clock | OSCI |
| 20 | 16 | clock | OSCO |
| 21 | 17 | power | GND |
| 22 | 18 | power | VREGIN |
| 23 | 19 | power | VREGOUT |
| 24 | 20 | power | FSOURCE |
| 25 | 21 | power | VPP |
| 26 | 22 | power | VCORE |
| 27 | - | NC | - |
| 28 | 23 | IO-DBUS | ADBUS0 |
| 29 | 24 | IO-DBUS | ADBUS1 |
| 30 | 25 | IO-DBUS | ADBUS2 |
| 31 | 26 | IO-DBUS | ADBUS3 |
| 32 | 27 | IO-DBUS | ADBUS4 |
| 33 | 28 | power | VCCIO |
| 34 | 29 | IO-DBUS | ADBUS5 |
| 35 | 30 | IO-DBUS | ADBUS6 |
| 36 | 31 | IO-DBUS | ADBUS7 |
| 37 | 32 | IO-CBUS | ACBUS0 |
| 38 | 33 | IO-CBUS | ACBUS1 |
| 39 | 34 | IO-CBUS | ACBUS2 |
| 40 | 35 | IO-CBUS | ACBUS3 |
| 41 | 36 | power | VCORE |
| 42 | 37 | IO-CBUS | ACBUS4 |
| 43 | 38 | IO-CBUS | ACBUS5 |
| 44 | 39 | IO-CBUS | ACBUS6 |
| 45 | 40 | power | VCCIO |
| 46 | 41 | power | GND |
| 47 | 42 | IO-CBUS | ACBUS7 |
| 48 | 43 | IO-CBUS | ACBUS8 |
| 49 | 44 | IO-CBUS | ACBUS9 |
| 50 | 45 | NC? | - |
| 51 | 46 | power | VCORE |
| 52 | 47 | power | VCC_USB |
| 53 | 48 | USB | DM |
| 54 | 49 | USB | DP |
| 55 | 50 | reference | REF |
| 56 | 51 | power | VCC_PD |
| 57 | 52 | PD | PD1_CC2 |
| 58 | 53 | PD | PD1_SVBUS |
| 59 | 54 | PD | PD1_VCONN |
| 60 | 55 | PD | PD1_CC1 |
| 61 | - | PD | PD2_CC1 |
| 62 | - | PD | PD2_SVBUS |
| 63 | - | PD | PD2_CC2 |
| 64 | 56 | power | VCORE |
Pin functions per mode
| pin | UART | FIFO | sync FIFO | CPU FIFO | bitbang | MPSSE | opto-isolated | FT1248 |
|---|---|---|---|---|---|---|---|---|
| ADBUS0 | TXD | D0 | D0 | D0 | D0 | TCK/SK | FSDI | CIOPIO0 |
| ADBUS1 | RXD | D1 | D1 | D1 | D1 | TDI/DO | FSCLK | CIOPIO1 |
| ADBUS2 | RTS# | D2 | D2 | D2 | D2 | TDO/DI | FSDO | CIOPIO2 |
| ADBUS3 | CTS# | D3 | D3 | D3 | D3 | TMS/CS | FSCTS | CIOPIO3 |
| ADBUS4 | DTR# | D4 | D4 | D4 | D4 | GPIOL0 | - | CIOPIO4 |
| ADBUS5 | DSR# | D5 | D5 | D5 | D5 | GPIOL1 | - | CIOPIO5 |
| ADBUS6 | DCD# | D6 | D6 | D6 | D6 | GPIOL2 | - | CIOPIO6 |
| ADBUS7 | RI# | D7 | D7 | D7 | D7 | GPIOL3 | - | CIOPIO7 |
| ACBUS0 | [CBUS0] | RXF# | RXF# | CS# | [CBUS0] | GPIOH0 | [CBUS0] | SCLK |
| ACBUS1 | [CBUS1] | TXE# | TXE# | A0 | WR# | GPIOH1 | [CBUS1] | CS# |
| ACBUS2 | [CBUS2] | RD# | RD# | RD# | RD# | GPIOH2 | [CBUS2] | CIPO |
| ACBUS3 | [CBUS3] | WR | WR | WR# | [CBUS3] | GPIOH3 | [CBUS3] | [CBUS3] |
| ACBUS4 | [CBUS4] | SIWU# | SIWU# | SIWU# | SIWU# | GPIOH4 | SIWU# | [CBUS4] |
| ACBUS5 | [CBUS5] | [CBUS5] | CLKOUT | [CBUS5] | [CBUS5] | GPIOH5 | [CBUS5] | [CBUS5] |
| ACBUS6 | [CBUS6] | [CBUS6] | OE# | [CBUS6] | [CBUS6] | GPIOH6 | [CBUS6] | [CBUS6] |
| ACBUS7 | PWRSAV# | PWRSAV# | PWRSAV# | PWRSAV# | PWRSAV# | GPIOH7 | PWRSAV# | PWRSAV# |
| ACBUS8 | [CBUS8] | [CBUS8] | [CBUS8] | [CBUS8] | [CBUS8] | [CBUS8] | [CBUS8] | [CBUS8] |
| ACBUS9 | [CBUS9] | [CBUS9] | [CBUS9] | [CBUS9] | [CBUS9] | [CBUS9] | [CBUS9] | [CBUS9] |
Note: the function of the pins labeled with square brackets is determined by the configuration in EEPROM when the relevant mode is active.
CBUS pins
The device has 10 CBUS pins. They can be configured through the EEPROM to do the following functions:
| EEPROM value | valid on pins | function |
|---|---|---|
0x0 | all | tristate |
0x1 | all but CBUS7 | UART TXLED# |
0x2 | all but CBUS7 | UART RXLED# |
0x3 | all but CBUS7 | UART TXRXLED# |
0x4 | all but CBUS7 | PWREN# |
0x5 | all but CBUS7 | SLEEP# |
0x6 | all but CBUS7 | const-0 output |
0x7 | CBUS[05689] | const-1 output |
0x8 | CBUS[5689] | I/O (for CBUS bitbang mode) |
0x9 | all but CBUS7 | UART TXDEN |
0xa | CBUS[05689] | CLK30 |
0xb | CBUS[05689] | CLK15 |
0xc | CBUS[05689] | CLK7.5 |
TODO: valid pin set far from certain.
Note that the EEPROM-configured CBUS pin function may be overriden by whatever mode is currently active.
EEPROM data format
The device will accept 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.
Note that 64-word EEPROMs are not supported for unknown reasons. This may be related to the funny fixed word at address 0x45. Since this is in the same address range as the FT232R uses for factory-programmed data, it is somewhat likely that it is an accidental bit of leftover FT232R circuitry.
The EEPROM format is:
- word 0x00:
- bits 0-3: mode
- 0: UART
- 1: 245-style FIFO
- 2: CPUFIFO
- 4: opto-isolated
- 8: FT1248
- bit 4: enable bind to VCP driver
- 0: low
- bit 9: FT1248 bit order
- 0: MSB first
- 1: LSB first
- bit 10: FT1248 flow control enable
- TODO: the polarity of this bit is not clear, it might be a disable
- bit 15: enable PWRSAV# function on ACBUS7
- bits 0-3: mode
- 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
- word 0x06:
- bits 0-1: ADBUS drive strength
- 0: 4mA
- 1: 8mA
- 2: 12mA
- 3: 16mA
- bit 2: ADBUS slow slew rate
- bit 3: ADBUS schmitt trigger
- bits 4-5: ACBUS drive strength
- bit 6: ACBUS slow slew rate
- bit 7: ACBUS schmitt trigger
- bits 0-1: ADBUS 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: always 0
- word 0x0c:
- bits 0-3: CBUS0 function (see table above)
- bits 4-7: CBUS1 function
- bits 8-11: CBUS2 function
- bits 12-15: CBUS3 function
- word 0x0d:
- bits 0-3: CBUS4 function
- bits 4-7: CBUS5 function
- bits 8-11: CBUS6 function
- bits 12-15: CBUS7 function (lol has to be 0?)
- word 0x0e:
- bits 0-3: CBUS8 function
- bits 4-7: CBUS9 function
- word 0x0f: EEPROM type
- 0x56: 93LC56 (128-word)
- 0x66: 93LC66 (256-word)
- words 0x10..0x40: user area
- word 0x2e: set to 0x302 by default (concidentally or not, this corresponds to a header of an empty string descriptor)
- words 0x40..0x50: reserved area for unclear reason (stuff copied over from FT232R?)
- word 0x45: always set to 0x48
- words 0x50..0x7f: string / user area
- word 0x7f: checksum
String pointers are formatted as follows:
- 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 0x50, 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 mut res: u16 = 0xaaaa; for pos in 0..0x7f { // checksum word is NOT included — we're calculating it res ^= eeprom[pos]; res = res.rotate_left(1); } res } }
FT-X series
The seventh generation of fixed-function D2xx devices, an upgrade to FT232R and FT245R. There are four kinds of FT-X series devices:
- the FT20xX series, USB to I2C peripherial bridges (effectively a new mode of operation)
- the FT22xX series, USB to FT1248 bridges (based on the FT1248 mode introduced in FT232H)
- the FT23xX series, USB to UART bridges (a sequel to FT232R)
- the FT240X, USB to FIFO bridge (a sequel to FT245R)
Note: FT22xX claims to be an "FT1248/SPI bridge". In reality, it has nothing to do with SPI. It could at most be charitably described as "SPI fanfic with little regard for canon".
All FT-X series devices are actually the same silicon, differentiated through mode selection in the factory-programmed area of its EEPROM memory and packaging.
Features:
- is a full-speed USB 1.1 peripherial
- single channel D2xx device
- set to one of four base modes depending on factory configuration:
- FT200X and FT201X: a new I2C peripherial mode
- FT220X and FT221X: FT232H-like FT1248 mode
- FT230X, FT231X, FT234X: FT232R-like UART mode
- FT240X: FT245R-like FIFO mode
- dynamically-selectable alternate modes include:
- FT2xxB-like async bitbang
- FT2232-like sync bitbang
- FT2xxR-like CBUS bitbang
- 512-byte IN FIFO, 512-byte OUT FIFO
- internal 2048-byte EEPROM
- pre-programmed factory area in EEPROM
- in FT1248 and I2C peripherial modes, the EEPROM can be accessed from the business end too
- USB battery charger detection
- 48MHZ internal base clock, generated from an internal 12MHz oscillator
- 3.3V or 5V VCC supply for internal circuitry
- separate 1.8V to 3.3V VCCIO supply for business-end IO
- internal 5V-to-3.3V LDO
- internal 3.3V/5V-to-1.8V LDO
- internal D+ pullup resistor
- internal power-on reset circuit
- required external support circuitry:
- just the decoupling capacitors
The default VID:PID of the device is 0403:6015, unless configured otherwise by the EEPROM. The bcdDevice value is 0x1000.
The devices are:
| device | package | business end | business end pins |
|---|---|---|---|
| FT200XD | 10-pin DFN | I2C peripherial | 2×I2C + 1×CBUS |
| FT201XS | 16-pin SSOP | I2C peripherial | 2×I2C + 6×CBUS |
| FT201XQ | 16-pin QFN | I2C peripherial | 2×I2C + 6×CBUS |
| FT220XS | 16-pin SSOP | 4-bit FT1248 | 7×FT1248 + 1×CBUS |
| FT220XQ | 16-pin QFN | 4-bit FT1248 | 7×FT1248 + 1×CBUS |
| FT221XS | 20-pin SSOP | 8-bit FT1248 | 11×FT1248 + 1×CBUS |
| FT221XQ | 20-pin QFN | 8-bit FT1248 | 11×FT1248 + 1×CBUS |
| FT230XS | 16-pin SSOP | basic UART | 4×UART + 4×CBUS |
| FT230XQ | 16-pin QFN | basic UART | 4×UART + 4×CBUS |
| FT231XS | 20-pin SSOP | full UART | 8×UART + 4×CBUS |
| FT231XQ | 20-pin QFN | full UART | 8×UART + 4×CBUS |
| FT234XD | 12-pin DFN | basic UART | 4×UART + 1×CBUS |
| FT240XS | 24-pin SSOP | FIFO | 13×FIFO + 2×CBUS |
| FT240XQ | 24-pin QFN | FIFO | 13×FIFO + 2×CBUS |
Pinout — FT20xX, FT22xX, FT23xX
| QFN20 | SSOP20 | QFN16 | SSOP16 | DFN12 | DFN10 | FT20xX | FT22xX | FT23xX |
|---|---|---|---|---|---|---|---|---|
| 1 | 4 | 2 | 4 | 10 | 8 | SDA | MIOSI1 | RXD |
| 2 | 5 | - | - | - | - | - | MIOSI7 | RI# |
| 3 | 6 | 3 | 5 | - | 9 | GND | GND | GND |
| 4 | 7 | - | - | - | - | - | MIOSI5 | DSR# |
| 5 | 8 | - | - | - | - | - | MIOSI6 | DCD# |
| 6 | 9 | 4 | 6 | 11 | - | CBUS4 | MIOSI3 | CTS# |
| 7 | 10 | 5 | 7 | - | - | CBUS2 | MISO | CBUS2 |
| 8 | 11 | 6 | 8 | 12 | 10 | USBDP | USBDP | USBDP |
| 9 | 12 | 7 | 9 | 1 | 1 | USBDM | USBDM | USBDM |
| 10 | 13 | 8 | 10 | 3 | 3 | 3V3OUT | 3V3OUT | 3V3OUT |
| 11 | 14 | 9 | 11 | 2 | 2 | RESET# | RESET# | RESET# |
| 12 | 15 | 10 | 12 | 4 | 4 | VCC | VCC | VCC |
| 13 | 16 | 13 | 13 | 5 | - | GND | GND | GND |
| 14 | 17 | 11 | 14 | - | - | CBUS1 | CS# | CBUS1 |
| 15 | 18 | 12 | 15 | 6 | 5 | CBUS0 | CLK | CBUS0 |
| 16 | 19 | 14 | 16 | - | - | CBUS3 | CBUS3 | CBUS3 |
| 17 | 20 | 15 | 1 | 7 | - | CBUS5 | MIOSI0 | TXD |
| 18 | 1 | - | - | - | - | - | MIOSI4 | DTR# |
| 19 | 2 | 16 | 2 | 8 | 6 | SCL | MIOSI2 | RTS# |
| 20 | 3 | 1 | 3 | 9 | 7 | VCCIO | VCCIO | VCCIO |
| [pad] | [pad] | - | [pad] | [pad] | GND | GND | GND |
Pinout — FT240X
| QFN24 | SSOP24 | FT240X |
|---|---|---|
| 1 | 4 | DATA1 |
| 2 | 5 | DATA7 |
| 3 | 6 | GND |
| 4 | 7 | DATA5 |
| 5 | 8 | DATA6 |
| 6 | 9 | DATA3 |
| 7 | 10 | SI/WU# |
| 8 | 11 | RD# |
| 9 | 12 | WR |
| 10 | 13 | USBDP |
| 11 | 14 | USBDM |
| 12 | 15 | 3V3OUT |
| 13 | 16 | RESET# |
| 14 | 17 | VCORE |
| 15 | 18 | VCC |
| 16 | 19 | GND |
| 17 | 20 | TXE# |
| 18 | 21 | RXF# |
| 19 | 22 | CBUS6 |
| 20 | 23 | CBUS5 |
| 21 | 24 | DATA0 |
| 22 | 1 | DATA4 |
| 23 | 2 | DATA2 |
| 24 | 3 | VCCIO |
CBUS pins
The device has up to 6 CBUS pins. They can be configured through the EEPROM to do the following functions:
| EEPROM value | valid on pins | function |
|---|---|---|
0x00 | all | tristate |
0x01 | all | UART TXLED# |
0x02 | all | UART RXLED# |
0x03 | all | UART TXRXLED# |
0x04 | all | PWREN# |
0x05 | all | SLEEP# |
0x06 | all | const-0 output |
0x07 | all | const-1 output |
0x08 | all (everything but FT20xX), CBUS[0-3] (FT20xX) | I/O (for CBUS bitbang mode) |
0x09 | all | UART TXDEN |
0x0a | all | CLK24 |
0x0b | all | CLK12 |
0x0c | all | CLK6 |
0x0d | all | BCD_CHARGER |
0x0e | all | BCD_CHARGER# |
0x0f | all | I2C TXE# |
0x10 | all | I2C RXF# |
0x11 | all | VBUS_SENSE (previously known as PWRSAV#) |
0x12 | all | bitbang WR# |
0x13 | all | bitbang RD# |
0x14 | all | TIMESTAMP |
0x15 | all | KEEP_AWAKE |
The two new functions are:
- TIMESTAMP (device output, toggles on every USB SOF frame)
- KEEP_AWAKE (device input, prevents device from entering suspend state when unplugged)
EEPROM format
The FT-X series has an internal EEPROM of 2048 bytes. It can be accessed from the USB host side like on previous devices, where it is instead viewed as an array of 1024 16-bit words. On the FT20xX and FT22xX, it can also be accessed from the I2C/FT1248 side through special requests, where it is viewed as a 2048-byte array.
Note that the vendor calls the EEPROM "MTP memory" on this device. The difference, if any, is unknown.
The EEPROM format is (viewed as 1024×16-bit words, like from the host):
- word 0x00:
- bit 0: battery charge detect: enable
- bit 1: battery charge detect: force PWREN# low when charger detected
- bit 2: battery charge detect: disable sleep mode when charger detected
- bit 3: RS485 echo suppression (FT23xX only)
- bit 4: use external oscillator (?!? how? unbonded pads?)
- bit 5: external oscillator feedback resistor enable
- bit 6: USB suspend VBUS (set if one of CBUS is allocated as VBUS sense)
- bit 7: enable bind to VCP driver
- word 0x01: idVendor (USB VID)
- word 0x02: idProduct (USB PID)
- word 0x03: bcdDevice (0x1000)
- 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 4: FT1248 clock polarity (CPOL) (FT22xX only)
- 0: low
- 1: high
- bit 5: FT1248 bit order (FT22xX only)
- 0: MSB
- 1: LSB
- bit 6: FT1248 flow control enable (FT22xX only)
- bit 7: I2C disable schmitt trigger (FT20xX only)
- bit 8: invert TXD (FT23xX only)
- bit 9: invert RXD (FT23xX only)
- bit 10: invert RTS (FT23xX only)
- bit 11: invert CTS (FT23xX only)
- bit 12: invert DTR (FT23xX only)
- bit 13: invert DSR (FT23xX only)
- bit 14: invert DCD (FT23xX only)
- bit 15: invert RI (FT23xX only)
- word 0x06:
- bits 0-1: DBUS drive strength
- 0: 4mA
- 1: 8mA
- 2: 12mA
- 3: 16mA
- bit 2: DBUS slow slew rate
- bit 3: DBUS schmitt trigger
- bits 4-5: CBUS drive strength
- bit 6: CBUS slow slew rate
- bit 7: CBUS schmitt trigger
- bits 0-1: DBUS drive strength
- word 0x07: manufacturer string pointer
- word 0x08: product description string pointer
- word 0x09: serial number string pointer
- word 0x0a: I2C slave address (FT20xX only)
- word 0x0b: I2C device ID low word (FT20xX only)
- word 0x0c: I2C device ID high word (FT20xX only)
- word 0x0d:
- bits 0-7: CBUS0 function
- bits 8-15: CBUS1 function
- word 0x0e:
- bits 0-7: CBUS2 function
- bits 8-15: CBUS3 function
- word 0x0f:
- bits 0-7: CBUS4 function
- bits 8-15: CBUS5 function
- word 0x10:
- bits 0-7: CBUS6 function
- words 0x12..0x40: user area (not checksummed)
- words 0x40..0x50: factory configuration area
- word 0x49:
- bits 8-15: device type
- 0: UART (FT23xX)
- 1: FIFO (FT24xX)
- 2: FT1248 (FT22xX)
- 3: I2C (FT20xX)
- bits 8-15: device type
- word 0x49:
- words 0x50..0x7f: string area
- word 0x7f: checksum
- word 0x80..0x400: user area (not checksummed)
String pointers are formatted as follows:
- bits 0-7: pointer to descriptor within EEPROM (counted in bytes)
- bits 8-15: total length of descriptor in bytes
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; 0x400]) -> u16 { let mut res: u16 = 0xaaaa; for pos in 0..0x12 { res ^= eeprom[pos]; res = res.rotate_left(1); } for pos in 0x40..0x7f { // checksum word is NOT included — we're calculating it res ^= eeprom[pos]; res = res.rotate_left(1); } res } }
FT4222H
TODO
USB-PD devices
The FT2232H, FT4232H, and FT232H devices have variants with USB-PD support. They essentially consist of the base device and a USB-PD controller core put together with some super glue. The USB-PD part is described here.
The devices are:
- FT2233HP: FT2232H with two USB-PD ports
- FT4233HP: FT4232H with two USB-PD ports
- FT2232HP: FT2232H with one USB-PD port
- FT4232HP: FT4232H with one USB-PD port
- FT233HP: FT232H with two USB-PD ports
- FT232HP: FT232H with one USB-PD port
TODO
EEPROM data format
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.
TODO