{
eeprom->cbus_function[i] = 0;
}
- eeprom->high_current = 0;
+ eeprom->high_current_a = 0;
eeprom->invert = 0;
eeprom->size = FTDI_MAX_EEPROM_SIZE;
if (ftdi->type != TYPE_R)
{
if (eeprom->invert) return -4;
- if (eeprom->high_current) return -5;
+ if (eeprom->high_current_a) return -5;
}
size_check = eeprom->size;
memset (output, 0, eeprom->size);
// Addr 00: High current IO
- output[0x00] = eeprom->high_current ? HIGH_CURRENT_DRIVE : 0;
+ output[0x00] = eeprom->high_current_a ? HIGH_CURRENT_DRIVE : 0;
// Addr 01: IN endpoint size (for R type devices, different for FT2232)
if (ftdi->type == TYPE_R) {
output[0x01] = 0x40;
eeprom_size = 0x80;
eeprom = ftdi->eeprom;
+ eeprom->high_current_a = buf[0x00] & HIGH_CURRENT_DRIVE;
+ eeprom->high_current_b = buf[0x01] & HIGH_CURRENT_DRIVE;
+
+
// Addr 02: Vendor ID
eeprom->vendor_id = buf[0x02] + (buf[0x03] << 8);
// Bit 6: 0 - reserved
// Bit 5: 0 - reserved
// Bit 4: 1 - Change USB version
+ // Not seen on FT2232(D)
// Bit 3: 1 - Use the serial number string
// Bit 2: 1 - Enable suspend pull downs for lower power
// Bit 1: 1 - Out EndPoint is Isochronous
// Bit 0: 1 - In EndPoint is Isochronous
//
- j = buf[0x0A];
- if (j&0x01) eeprom->in_is_isochronous = 1;
- if (j&0x02) eeprom->out_is_isochronous = 1;
- if (j&0x04) eeprom->suspend_pull_downs = 1;
- if (j&0x08) eeprom->use_serial = 1;
- if (j&0x10) eeprom->change_usb_version = 1;
+ eeprom->in_is_isochronous = buf[0x0A]&0x01;
+ eeprom->out_is_isochronous = buf[0x0A]&0x02;
+ eeprom->suspend_pull_downs = buf[0x0A]&0x04;
+ eeprom->use_serial = buf[0x0A]&0x08;
+ eeprom->change_usb_version = buf[0x0A]&0x10;
- // Addr 0B: Invert data lines
- eeprom->invert = buf[0x0B];
// Addr 0C: USB version low byte when 0x0A bit 4 is set
// Addr 0D: USB version high byte when 0x0A bit 4 is set
- if (eeprom->change_usb_version == 1)
+ if ((eeprom->change_usb_version == 1) || ftdi->type == TYPE_2232C)
{
eeprom->usb_version = buf[0x0C] + (buf[0x0D] << 8);
}
ftdi_error_return(-1,"EEPROM checksum error");
}
- if ((ftdi->type == TYPE_AM) || (ftdi->type == TYPE_BM) || (ftdi->type == TYPE_2232C))
+ else if ((ftdi->type == TYPE_AM) || (ftdi->type == TYPE_BM))
{
eeprom->chip = buf[14];
}
- if(ftdi->type == TYPE_2)
+ else if(ftdi->type == TYPE_2232C)
{
+ eeprom->chip = buf[14];
}
- if(ftdi->type == TYPE_R)
+ else if(ftdi->type == TYPE_R)
{
+ // Addr 0B: Invert data lines
+ // Works only on FT232R, not FT245R, but no way to distinguish
+ eeprom->invert = buf[0x0B];
// Addr 14: CBUS function: CBUS0, CBUS1
// Addr 15: CBUS function: CBUS2, CBUS3
// Addr 16: CBUS function: CBUS5
- if (ftdi->type == TYPE_R) {
- eeprom->cbus_function[0] = buf[0x14] & 0x0f;
- eeprom->cbus_function[1] = (buf[0x14] >> 4) & 0x0f;
- eeprom->cbus_function[2] = buf[0x15] & 0x0f;
- eeprom->cbus_function[3] = (buf[0x15] >> 4) & 0x0f;
- eeprom->cbus_function[4] = buf[0x16] & 0x0f;
- } else {
- for (j=0; j<5; j++) eeprom->cbus_function[j] = 0;
- }
+ eeprom->cbus_function[0] = buf[0x14] & 0x0f;
+ eeprom->cbus_function[1] = (buf[0x14] >> 4) & 0x0f;
+ eeprom->cbus_function[2] = buf[0x15] & 0x0f;
+ eeprom->cbus_function[3] = (buf[0x15] >> 4) & 0x0f;
+ eeprom->cbus_function[4] = buf[0x16] & 0x0f;
+ }
+ else if (ftdi->type == TYPE_2232H)
+ {
}
+ else if (ftdi->type == TYPE_4232H)
+ {
+ }
+
if(verbose)
{
fprintf(stdout, "VID: 0x%04x\n",eeprom->vendor_id);
fprintf(stdout, "Product: %s\n",eeprom->product);
if(eeprom->serial)
fprintf(stdout, "Serial: %s\n",eeprom->serial);
- fprintf(stderr, "Checksum : %04x %04x\n", checksum);
+ fprintf(stderr, "Checksum : %04x\n", checksum);
}