if (eeprom->serial != NULL)
serial_size = strlen(eeprom->serial);
- // eeprom size exceeded?
- user_area_size = (48 - (manufacturer_size + product_size + serial_size)) * 2;
+ // eeprom size check
+ switch (ftdi->type)
+ {
+ case TYPE_AM:
+ case TYPE_BM:
+ user_area_size = 96; // base size for strings (total of 48 characters)
+ break;
+ case TYPE_2232C:
+ user_area_size = 90; // two extra config bytes and 4 bytes PnP stuff
+ break;
+ case TYPE_R:
+ user_area_size = 88; // four extra config bytes + 4 bytes PnP stuff
+ break;
+ case TYPE_2232H: // six extra config bytes + 4 bytes PnP stuff
+ case TYPE_4232H:
+ user_area_size = 86;
+ break;
+ }
+ user_area_size -= (manufacturer_size + product_size + serial_size) * 2;
+
if (user_area_size < 0)
ftdi_error_return(-1,"eeprom size exceeded");
// Addr 06: Device release number (0400h for BM features)
output[0x06] = 0x00;
- switch (ftdi->type) {
+ switch (ftdi->type)
+ {
case TYPE_AM:
output[0x07] = 0x02;
break;
output[i & eeprom_size_mask] = eeprom->serial[j], i++;
output[i & eeprom_size_mask] = 0x00, i++;
}
- output[i & eeprom_size_mask] = 0x02; /* as seen when written with FTD2XX */
- i++;
- output[i & eeprom_size_mask] = 0x03; /* as seen when written with FTD2XX */
- i++;
- output[i & eeprom_size_mask] = eeprom->is_not_pnp; /* as seen when written with FTD2XX */
- i++;
+
+ // Legacy port name and PnP fields for FT2232 and newer chips
+ if (ftdi->type > TYPE_BM)
+ {
+ output[i & eeprom_size_mask] = 0x02; /* as seen when written with FTD2XX */
+ i++;
+ output[i & eeprom_size_mask] = 0x03; /* as seen when written with FTD2XX */
+ i++;
+ output[i & eeprom_size_mask] = eeprom->is_not_pnp; /* as seen when written with FTD2XX */
+ i++;
+ }
output[0x13] = serial_size*2 + 2;
- if(ftdi->type > TYPE_AM) /*use_serial not used in AM devices*/
+ if(ftdi->type > TYPE_AM) /* use_serial not used in AM devices */
{
if (eeprom->use_serial == USE_SERIAL_NUM )
output[0x0A] |= USE_SERIAL_NUM;
else
output[0x0A] &= ~USE_SERIAL_NUM;
}
- /* Fixme: ftd2xx seems to append 0x02, 0x03 and 0x01 for PnP = 0 or 0x00 else */
- // calculate checksum
/* Bytes and Bits specific to (some) types
Write linear, as this allows easier fixing*/
case TYPE_BM:
output[0x0C] = eeprom->usb_version & 0xff;
output[0x0D] = (eeprom->usb_version>>8) & 0xff;
- output[0x14] = eeprom->chip;
break;
case TYPE_2232C:
// Bit 6: 1 if this device is self powered, 0 if bus powered
// Bit 5: 1 if this device uses remote wakeup
eeprom->self_powered = buf[0x08] & 0x40;
- eeprom->remote_wakeup = buf[0x08] & 0x20;;
+ eeprom->remote_wakeup = buf[0x08] & 0x20;
// Addr 09: Max power consumption: max power = value * 2 mA
eeprom->max_power = buf[0x09];