libftdi Archives

Subject: [WIP PATCH v3 2/2] Rework user area handling

From: yegorslists@xxxxxxxxxxxxxx
To: libftdi@xxxxxxxxxxxxxxxxxxxxxxx
Cc: thomas.jarosch@xxxxxxxxxxxxx, Yegor Yefremov <yegorslists@xxxxxxxxxxxxxx>
Date: Tue, 29 Aug 2023 11:04:43 +0200
From: Yegor Yefremov <yegorslists@xxxxxxxxxxxxxx>

User area begins after the serial number string. Hence, use free_end
to specify the end of the necessary data like producer, serial number
strings as also PNP bits.

For FT230X chips, use the fixed user area as described in the datasheet.

Treat both generated data area and strings area violations as errors.
---
Changes v2 -> v3:
  - also handle FT230X as they have different EEPROM layout

 src/ftdi.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/ftdi.c b/src/ftdi.c
index 5b09647..58377a2 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -3074,7 +3074,6 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
     }
     /* Wrap around 0x80 for 128 byte EEPROMS (Internale and 93x46) */
     eeprom_size_mask = eeprom->size -1;
-    free_end = i & eeprom_size_mask;

     // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
     // Addr 0F: Length of manufacturer string
@@ -3476,15 +3475,30 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             free_start += 0x14;
     }

+    if (ftdi->type != TYPE_230X)
+    {
+        free_start = i & eeprom_size_mask;
+        free_end = eeprom->size - 2;
+    }
+    else
+    {
+        free_start = 0x24;
+        free_end = 0x80;
+    }
+
+    user_area_size = free_end - free_start;
+
     /* Arbitrary user data */
     if (eeprom->user_data_size > 0)
     {
-        if (eeprom->user_data_addr < free_start)
-            fprintf(stderr,"Warning, user data starts inside the generated 
data!\n");
+        if (!eeprom->user_data_addr)
+            eeprom->user_data_addr = free_start;
+        if (eeprom->user_data_addr < free_start || eeprom->user_data_addr >= 
free_end)
+            ftdi_error_return(-1, "user data starts outside of the user area 
bounds");
+        if (eeprom->user_data_size > user_area_size)
+            ftdi_error_return(-1 , "user data size exceeds the user area 
size");
         if (eeprom->user_data_addr + eeprom->user_data_size >= free_end)
-            fprintf(stderr,"Warning, user data overlaps the strings area!\n");
-        if (eeprom->user_data_addr + eeprom->user_data_size > eeprom->size)
-            ftdi_error_return(-1,"eeprom size exceeded");
+            ftdi_error_return(-1, "user ares size exceeded");
         memcpy(output + eeprom->user_data_addr, eeprom->user_data, 
eeprom->user_data_size);
     }

--
2.34.1


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

Current Thread