libftdi Archives

Subject: [PATCH] Save device release number. Allow writing of eeprom buffer, that was read from device.

From: Jarkko Sonninen <kasper@xxxxxx>
To: libftdi@xxxxxxxxxxxxxxxxxxxxxxx
Date: Sun, 24 Mar 2013 10:14:18 +0200
---
 src/ftdi.c   |   70 ++++++++++++++++++++++++++++++++--------------------------
 src/ftdi.h   |    1 +
 src/ftdi_i.h |    3 +++
 3 files changed, 43 insertions(+), 31 deletions(-)

diff --git a/src/ftdi.c b/src/ftdi.c
index 5570bd4..6d4a64b 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -2392,7 +2392,32 @@ int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, 
char * manufacturer,
         }
         eeprom->size = -1;
     }
-    eeprom->initialized_for_connected_device = 1;
+    switch (ftdi->type)
+    {
+        case TYPE_AM:
+            eeprom->release_number = 0x0200;
+            break;
+        case TYPE_BM:
+            eeprom->release_number = 0x0400;
+            break;
+        case TYPE_2232C:
+            eeprom->release_number = 0x0500;
+            break;
+        case TYPE_R:
+            eeprom->release_number = 0x0600;
+            break;
+        case TYPE_2232H:
+            eeprom->release_number = 0x0700;
+            break;
+        case TYPE_4232H:
+            eeprom->release_number = 0x0800;
+            break;
+        case TYPE_232H:
+            eeprom->release_number = 0x0900;
+            break;
+        default:
+            eeprom->release_number = 0x00;
+    }
     return 0;
 }
 /*FTD2XX doesn't check for values not fitting in the ACBUS Signal oprtions*/
@@ -2539,33 +2564,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
     output[0x05] = eeprom->product_id >> 8;
 
     // Addr 06: Device release number (0400h for BM features)
-    output[0x06] = 0x00;
-    switch (ftdi->type)
-    {
-        case TYPE_AM:
-            output[0x07] = 0x02;
-            break;
-        case TYPE_BM:
-            output[0x07] = 0x04;
-            break;
-        case TYPE_2232C:
-            output[0x07] = 0x05;
-            break;
-        case TYPE_R:
-            output[0x07] = 0x06;
-            break;
-        case TYPE_2232H:
-            output[0x07] = 0x07;
-            break;
-        case TYPE_4232H:
-            output[0x07] = 0x08;
-            break;
-        case TYPE_232H:
-            output[0x07] = 0x09;
-            break;
-        default:
-            output[0x07] = 0x00;
-    }
+    output[0x06] = eeprom->release_number;
+    output[0x07] = eeprom->release_number >> 8;
 
     // Addr 08: Config descriptor
     // Bit 7: always 1
@@ -2983,6 +2983,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
     output[eeprom->size-2] = checksum;
     output[eeprom->size-1] = checksum >> 8;
 
+    eeprom->initialized_for_connected_device = 1;
     return user_area_size;
 }
 /* Decode the encoded EEPROM field for the FTDI Mode into a value for the 
abstracted 
@@ -3025,7 +3026,6 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
     int eeprom_size;
     struct ftdi_eeprom *eeprom;
     unsigned char *buf = ftdi->eeprom->buf;
-    int release;
 
     if (ftdi == NULL)
         ftdi_error_return(-1,"No context");
@@ -3041,7 +3041,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
     // Addr 04: Product ID
     eeprom->product_id = buf[0x04] + (buf[0x05] << 8);
 
-    release = buf[0x06] + (buf[0x07]<<8);
+    // Addr 06: Device release number
+    eeprom->release_number = buf[0x06] + (buf[0x07]<<8);
 
     // Addr 08: Config descriptor
     // Bit 7: always 1
@@ -3262,7 +3263,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
         char *channel_mode[] = {"UART", "FIFO", "CPU", "OPTO", "FT1284"};
         fprintf(stdout, "VID:     0x%04x\n",eeprom->vendor_id);
         fprintf(stdout, "PID:     0x%04x\n",eeprom->product_id);
-        fprintf(stdout, "Release: 0x%04x\n",release);
+        fprintf(stdout, "Release: 0x%04x\n",eeprom->release_number);
 
         if (eeprom->self_powered)
             fprintf(stdout, "Self-Powered%s", (eeprom->remote_wakeup)?", USB 
Remote Wake Up\n":"\n");
@@ -3417,6 +3418,9 @@ int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum 
ftdi_eeprom_value valu
         case PRODUCT_ID:
             *value = ftdi->eeprom->product_id;
             break;
+        case RELEASE_NUMBER:
+            *value = ftdi->eeprom->release_number;
+            break;
         case SELF_POWERED:
             *value = ftdi->eeprom->self_powered;
             break;
@@ -3604,6 +3608,9 @@ int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum 
ftdi_eeprom_value valu
         case PRODUCT_ID:
             ftdi->eeprom->product_id = value;
             break;
+        case RELEASE_NUMBER:
+            ftdi->eeprom->release_number = value;
+            break;
         case SELF_POWERED:
             ftdi->eeprom->self_powered = value;
             break;
@@ -3765,6 +3772,7 @@ int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum 
ftdi_eeprom_value valu
         default :
             ftdi_error_return(-1, "Request to unknown EEPROM value");
     }
+    eeprom->initialized_for_connected_device = 0;
     return 0;
 }
 
diff --git a/src/ftdi.h b/src/ftdi.h
index 141a795..c1d74f1 100644
--- a/src/ftdi.h
+++ b/src/ftdi.h
@@ -309,6 +309,7 @@ enum ftdi_eeprom_value
     CHANNEL_B_RS485    = 52,
     CHANNEL_C_RS485    = 53,
     CHANNEL_D_RS485    = 54,
+    RELEASE_NUMBER     = 55,
 };
 
 /**
diff --git a/src/ftdi_i.h b/src/ftdi_i.h
index 1d52df1..b973680 100644
--- a/src/ftdi_i.h
+++ b/src/ftdi_i.h
@@ -129,5 +129,8 @@ struct ftdi_eeprom
     /* EEPROM Type 0x46 for 93xx46, 0x56 for 93xx56 and 0x66 for 93xx66*/
     int chip;
     unsigned char buf[FTDI_MAX_EEPROM_SIZE];
+
+    /** device release number */
+    int release_number;
 };
 
-- 
1.7.9.5


--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx   

Current Thread