| 1 | Here we try to document what we know about the EEPROM Structure. |
| 2 | |
| 3 | Even with a 93xx66 EEPROM, at maximum 256 Bytes are used |
| 4 | |
| 5 | All important things happen in the first |
| 6 | 0x14(FT232/245), 0x16(FT2232CD), 0x18(FT232/245R) or 0x1a (FT2232H/4432H) bytes |
| 7 | |
| 8 | Type | Use extra EEPROM space |
| 9 | FT2XXB | No |
| 10 | |
| 11 | Byte.BIT| TYPE_AM TYPE_BM TYPE_2232C TYPE_R TYPE_2232H TYPE_4232H |
| 12 | 00.0 | 0 0 channel_a_type 232R/245R channel_a_type 0 |
| 13 | 00.1 | 0 0 channel_a_type channel_a_type 0 |
| 14 | 00.2 | 0 0 channel_a_type high_current channel_a_type 0 |
| 15 | 00.3 | 0 0 channel_a_driver channel_a_driver channel_a_driver channel_a_driver |
| 16 | 00.4 | 0 0 high_current_a 0 0 0 |
| 17 | 00.5 | 0 0 0 0 0 0 |
| 18 | 00.6 | 0 0 0 0 0 0 |
| 19 | 00.7 | 0 0 0 0 SUSPEND_DBUS7 channel_c_driver |
| 20 | |
| 21 | On TYPE_R 00.0 is set for the FT245R and cleared for the FT232R |
| 22 | On TYPE_R 00.3 set mean D2XX, on other devices VCP |
| 23 | |
| 24 | 01.0 | 0 0 channel_b_type channel_b_type 0 |
| 25 | 01.1 | 0 0 channel_b_type channel_b_type 0 |
| 26 | 01.2 | 0 0 channel_b_type 0 channel_b_type 0 |
| 27 | 01.3 | 0 0 channel_b_driver 0 channel_b_driver channel_b_driver |
| 28 | 01.4 | 0 0 high_current_b 0 0 0 |
| 29 | 01.5 | 0 0 0 0 0 0 |
| 30 | 01.6 | 0 0 0 0 0 |
| 31 | 01.7 | 0 0 0 0 0 channel_d_driver |
| 32 | |
| 33 | Fixme: Missing 4232H validation |
| 34 | |
| 35 | 02 | Vendor ID (VID) LSB (all) |
| 36 | 03 | Vendor ID (VID) MSB (all) |
| 37 | 04 | Product ID (PID) LSB (all) |
| 38 | 05 | Product ID (PID) MSB (all) |
| 39 | 06 | Device release number LSB (not tested on TYPE_4232H) |
| 40 | 07 | Device release number MSB (not tested on TYPE_4232H) |
| 41 | | |
| 42 | 08.4 | Battery powered |
| 43 | 08.5 | Remote wakeup |
| 44 | 08.6 | Self powered: 1, bus powered: 0 |
| 45 | 08.7 | Always 1 |
| 46 | | |
| 47 | 09 | Max power (mA/2) |
| 48 | | |
| 49 | Byte.BIT| TYPE_AM TYPE_BM TYPE_2232C TYPE_R TYPE_2232H TYPE_4232H |
| 50 | 0a.0 | 0 IsoIn IsoIn part A 0 0 0 |
| 51 | 0a.1 | 0 IsoOut IsoOut part A 0 0 0 |
| 52 | 0a.2 | 0 suspend_pull_down suspend_pull_down suspend_pull_down suspend_pull_down |
| 53 | 0a.3 | 0 use_serial use_serial use_serial |
| 54 | 0a.4 | 0 change_usb_version change_usb_version |
| 55 | 0a.5 | 0 0 IsoIn part B 0 0 0 |
| 56 | 0a.6 | 0 0 IsoOut part B 0 0 0 |
| 57 | 0a.7 | 0 - reserved |
| 58 | |
| 59 | 0b | TYPE_R Bitmask Invert, 0 else |
| 60 | Byte.BIT| TYPE_4232H |
| 61 | 0b.4 | channel_a_rs485enable |
| 62 | 0b.5 | channel_b_rs485enable |
| 63 | 0b.6 | channel_c_rs485enable |
| 64 | 0b.7 | channel_d_rs485enable |
| 65 | |
| 66 | Byte | TYPE_AM TYPE_BM TYPE_2232C TYPE_R TYPE_2232H TYPE_4232H |
| 67 | 0c | 0 USB-VER-LSB USB-VER-LSB 0 ? ? |
| 68 | 0d | 0 USB-VER-MSB USB-VER-MSB 0 ? ? |
| 69 | (On several FT2232H different values were observed -> The value is unused |
| 70 | if change USB version is not set, so it might contain garbage) |
| 71 | |
| 72 | 0e | OFFSET Vendor |
| 73 | 0f | Len VENDOR |
| 74 | |
| 75 | 10 | Offset Product |
| 76 | 11 | Length Product |
| 77 | |
| 78 | 12 | Offset Serial |
| 79 | 13 | Length Serial |
| 80 | |
| 81 | Byte.BIT| TYPE_AM TYPE_BM TYPE_2232C TYPE_R TYPE_2232H TYPE_4232H |
| 82 | 14.3:0 | UA UA CHIP CBUS[0] AL A |
| 83 | 14.7:0 | UA UA CHIP CBUS[1] AH B |
| 84 | 15.3:0 | UA UA 0 CBUS[2] BL C |
| 85 | 15.7:0 | UA UA 0 CBUS[3] BH D |
| 86 | 16.3:0 | UA UA UA CBUS[4] 0 0 |
| 87 | 16.7:0 | UA UA UA 0 0 0 |
| 88 | |
| 89 | CHIP values: |
| 90 | 0x46: EEPROM is a 93xx46 |
| 91 | 0x56: EEPROM is a 93xx56 |
| 92 | 0x66: EEPROM is a 93xx66 |
| 93 | |
| 94 | 17 UA UA UA 0 0 0 |
| 95 | 18 UA UA UA VENDOR CHIP CHIP |
| 96 | 19 UA UA UA VENDOR 0 0 |
| 97 | |
| 98 | 1a UA (all) |
| 99 | |
| 100 | |
| 101 | Additional fields after the serial string: |
| 102 | 0x00, 0x00 - reserved for "legacy port name prefix" |
| 103 | 0x00, 0x00 - reserved for plug and play options |
| 104 | (Observed values with PnP == 0: |
| 105 | 0x02 0x03 0x01 0x00) |
| 106 | |
| 107 | Note: The additional fields after the serial number string |
| 108 | collide with the official FTDI formula from AN_121 regarding |
| 109 | the start of the user area: |
| 110 | "Start Address = the address following the last byte of SerialNumber string." |