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