EEPROM High current bit is byte 0 Bit 4 for a and Byte 1 bit 4 for b
[libftdi] / src / ftdi.c
index 9d5be1b..701cc65 100644 (file)
@@ -2314,7 +2314,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi, unsigned char *output)
     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;
@@ -2506,6 +2506,10 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size,
         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);
 
@@ -2530,6 +2534,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size,
     // 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
@@ -2544,7 +2549,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size,
 
     // 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);
     }