Hello again,

I have some more patches to push upstream, this time they might be more
worthy merging.

0001 & 0002 are the same patches as sent previously, just slightly
reformatted.

0003 fixes a bug when reading USB devices with unset serial number.

0004 & 0005 fix inconsistency against what official FT_Prog tool writes to
EEPROM.

Please take a look and hopefully get them included in the next release.

Thanks,
Tomasz Wasilczyk

On Tue, 30 Mar 2021 at 09:02, Tomasz Wasilczyk <tomki...@gmail.com> wrote:

> Hello,
>
> I have two changes I made to libftdi fork I'm using internally in my
> project. It's nothing huge, but still worth sharing and definitely easier
> for me if merged upstream. Please take a look at the attached patches.
>
> libftdi-constargs.patch fixes warnings when I try to pass `const char*`
> to ftdi_eeprom_initdefaults.
> libftdi-nologspam.patch removes a printf that spams stderr when trying to
> flash FT232H eeprom.
>
> Thanks for supporting this library,
> Tomasz Wasilczyk
>


--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscr...@developer.intra2net.com   
From fb4288a2ce2532a3f8f1598ab06cce4b4d25545e Mon Sep 17 00:00:00 2001
From: Tomasz Wasilczyk <twasilc...@google.com>
Date: Wed, 21 Apr 2021 12:43:34 -0700
Subject: [PATCH 5/5] Don't set EEPROM serial when it's not used.

This makes a difference in USB enumeration -- if serial is missing,
its string is not present in string descriptor list.
---
 src/ftdi.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/src/ftdi.c b/src/ftdi.c
index 2f77ac3..92c5fae 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -2606,7 +2606,7 @@ int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, const char * manufacture
         ftdi_error_return(-3, "No connected device or device not yet opened");
 
     eeprom->vendor_id = 0x0403;
-    eeprom->use_serial = 1;
+    eeprom->use_serial = (serial != NULL);
     if ((ftdi->type == TYPE_AM) || (ftdi->type == TYPE_BM) ||
             (ftdi->type == TYPE_R))
         eeprom->product_id = 0x6001;
@@ -3101,15 +3101,18 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
     }
     output[0x11] = product_size*2 + 2;
 
-    // Addr 12: Offset of the serial string + 0x80, calculated later
-    // Addr 13: Length of serial string
-    output[0x12] = i | 0x80; // calculate offset
-    output[i & eeprom_size_mask] = serial_size*2 + 2, i++;
-    output[i & eeprom_size_mask] = 0x03, i++;
-    for (j = 0; j < serial_size; j++)
-    {
-        output[i & eeprom_size_mask] = eeprom->serial[j], i++;
-        output[i & eeprom_size_mask] = 0x00, i++;
+    if (eeprom->use_serial) {
+        // Addr 12: Offset of the serial string + 0x80, calculated later
+         // Addr 13: Length of serial string
+         output[0x12] = i | 0x80; // calculate offset
+         output[i & eeprom_size_mask] = serial_size*2 + 2, i++;
+         output[i & eeprom_size_mask] = 0x03, i++;
+         for (j = 0; j < serial_size; j++)
+         {
+             output[i & eeprom_size_mask] = eeprom->serial[j], i++;
+             output[i & eeprom_size_mask] = 0x00, i++;
+         }
+         output[0x13] = serial_size*2 + 2;
     }
 
     // Legacy port name and PnP fields for FT2232 and newer chips
@@ -3124,8 +3127,6 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
         i++;
     }
 
-    output[0x13] = serial_size*2 + 2;
-
     if (ftdi->type > TYPE_AM) /* use_serial not used in AM devices */
     {
         if (eeprom->use_serial)
-- 
2.31.1.368.gbe11c130af-goog

From 8e7fbe7dc53482c9baa730bffd8ee09c79e14b52 Mon Sep 17 00:00:00 2001
From: Tomasz Wasilczyk <twasilc...@google.com>
Date: Wed, 21 Apr 2021 12:42:08 -0700
Subject: [PATCH 4/5] Remove legacy EEPROM fields from FT4232H.

These are not present when flashed with FT_Prog tool.
---
 src/ftdi.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/ftdi.c b/src/ftdi.c
index 5ec3e2c..2f77ac3 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -3113,7 +3113,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
     }
 
     // Legacy port name and PnP fields for FT2232 and newer chips
-    if (ftdi->type > TYPE_BM)
+    // It doesn't appear when written with FT_Prog for FT4232H chip.
+    if (ftdi->type > TYPE_BM && ftdi->type != TYPE_4232H)
     {
         output[i & eeprom_size_mask] = 0x02; /* as seen when written with FTD2XX */
         i++;
-- 
2.31.1.368.gbe11c130af-goog

From 2864ad3273dde0b4389fd2b75266ab36aa05dab3 Mon Sep 17 00:00:00 2001
From: Tomasz Wasilczyk <tomki...@gmail.com>
Date: Thu, 11 Mar 2021 15:43:12 -0800
Subject: [PATCH 1/5] Don't spam stderr when flashing FT232H eeprom

---
 src/ftdi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/ftdi.c b/src/ftdi.c
index 03d7b07..db66b87 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -3421,7 +3421,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             set_ft232h_cbus(eeprom, output);
 
             output[0x1e] = eeprom->chip;
-            fprintf(stderr,"FIXME: Build FT232H specific EEPROM settings\n");
+            /* FIXME: Build FT232H specific EEPROM settings */
             break;
         case TYPE_230X:
             output[0x00] = 0x80; /* Actually, leave the default value */
-- 
2.31.1.368.gbe11c130af-goog

From 97b11c79244dc67163fb9503a45a3ce677f87b25 Mon Sep 17 00:00:00 2001
From: Tomasz Wasilczyk <tomki...@gmail.com>
Date: Thu, 11 Mar 2021 15:47:06 -0800
Subject: [PATCH 2/5] ftdi_eeprom_initdefaults const arguments

This function don't need to modify its arguments.
---
 src/ftdi.c | 4 ++--
 src/ftdi.h | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/ftdi.c b/src/ftdi.c
index db66b87..88216bf 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -2576,8 +2576,8 @@ int ftdi_set_error_char(struct ftdi_context *ftdi,
     \retval -2: No struct ftdi_eeprom
     \retval -3: No connected device or device not yet opened
 */
-int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, char * manufacturer,
-                             char * product, char * serial)
+int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, const char * manufacturer,
+                             const char * product, const char * serial)
 {
     struct ftdi_eeprom *eeprom;
 
diff --git a/src/ftdi.h b/src/ftdi.h
index fb45008..0603335 100644
--- a/src/ftdi.h
+++ b/src/ftdi.h
@@ -609,8 +609,8 @@ extern "C"
 
     /* init eeprom for the given FTDI type */
     int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi,
-                                 char * manufacturer, char *product,
-                                 char * serial);
+                                 const char * manufacturer, const char *product,
+                                 const char * serial);
     int ftdi_eeprom_build(struct ftdi_context *ftdi);
     int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose);
 
-- 
2.31.1.368.gbe11c130af-goog

From 5425c3487db568b17b9dee01e33dcd441718d5b9 Mon Sep 17 00:00:00 2001
From: Tomasz Wasilczyk <twasilc...@google.com>
Date: Wed, 21 Apr 2021 12:39:52 -0700
Subject: [PATCH 3/5] Don't fail reading missing strings.

This happens i.e. when serial number is not set -- in such case the
string is missing from string descriptor list.
---
 src/ftdi.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/ftdi.c b/src/ftdi.c
index 88216bf..5ec3e2c 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -485,27 +485,39 @@ int ftdi_usb_get_strings2(struct ftdi_context *ftdi, struct libusb_device *dev,
     if (libusb_get_device_descriptor(dev, &desc) < 0)
         ftdi_error_return(-11, "libusb_get_device_descriptor() failed");
 
-    if (manufacturer != NULL)
+    if (manufacturer != NULL && mnf_len > 0)
     {
-        if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iManufacturer, (unsigned char *)manufacturer, mnf_len) < 0)
+        if (desc.iManufacturer == 0)
+        {
+            manufacturer[0] = '\0';
+        }
+        else if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iManufacturer, (unsigned char *)manufacturer, mnf_len) < 0)
         {
             ftdi_usb_close_internal (ftdi);
             ftdi_error_return(-7, "libusb_get_string_descriptor_ascii() failed");
         }
     }
 
-    if (description != NULL)
+    if (description != NULL && desc_len > 0)
     {
-        if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)description, desc_len) < 0)
+        if (desc.iProduct == 0)
+        {
+            description[0] = '\0';
+        }
+        else if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)description, desc_len) < 0)
         {
             ftdi_usb_close_internal (ftdi);
             ftdi_error_return(-8, "libusb_get_string_descriptor_ascii() failed");
         }
     }
 
-    if (serial != NULL)
+    if (serial != NULL && serial_len > 0)
     {
-        if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char *)serial, serial_len) < 0)
+        if (desc.iSerialNumber == 0)
+        {
+            serial[0] = '\0';
+        }
+        else if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char *)serial, serial_len) < 0)
         {
             ftdi_usb_close_internal (ftdi);
             ftdi_error_return(-9, "libusb_get_string_descriptor_ascii() failed");
-- 
2.31.1.368.gbe11c130af-goog

Reply via email to