// 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->manufacturer)
{
// Decode manufacturer
- i = buf[0x0E]; // offset
+ i = buf[0x0E] & (eeprom_size -1); // offset
for (j=0;j<manufacturer_size-1;j++)
{
eeprom->manufacturer[j] = buf[2*j+i+2];
if(eeprom->product)
{
// Decode product name
- i = buf[0x10]; // offset
+ i = buf[0x10] & (eeprom_size -1); // offset
for (j=0;j<product_size-1;j++)
{
eeprom->product[j] = buf[2*j+i+2];
if(eeprom->serial)
{
// Decode serial
- i = buf[0x12]; // offset
+ i = buf[0x12] & (eeprom_size -1); // offset
for (j=0;j<serial_size-1;j++)
{
eeprom->serial[j] = buf[2*j+i+2];
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)
{
- if(ftdi->type == TYPE_R)
+ eeprom->chip = buf[14];
+ }
+ 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);
}