Update eeprom map as we work in word sizes
[libftdi] / src / ftdi.c
index 2d10e72..0ebb925 100644 (file)
@@ -2308,7 +2308,24 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
         serial_size = strlen(eeprom->serial);
 
     // eeprom size exceeded?
-    user_area_size = (48 - (manufacturer_size + product_size + serial_size)) * 2;
+
+    switch (ftdi->type) {
+    case TYPE_AM:
+    case TYPE_BM:
+       user_area_size = 96;
+       break;
+    case TYPE_2232C:
+       user_area_size = 94;
+       break;
+    case TYPE_R:
+       user_area_size = 92;
+       break;
+    case TYPE_2232H:
+    case TYPE_4232H:
+       user_area_size = 90;
+       break;
+    }
+    user_area_size  -= (manufacturer_size + product_size + serial_size) * 2;
     if (user_area_size < 0)
         ftdi_error_return(-1,"eeprom size exceeded");
 
@@ -2440,24 +2457,27 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
         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*/