libftdi Archives

Subject: [PATCH 2/4] ftdi: make FT230X DBUS/CBUS drive settings configurable

From: Vincent Jardin <vjardin@xxxxxxx>
To: libftdi@xxxxxxxxxxxxxxxxxxxxxxx
Cc: thomas.jarosch@xxxxxxxxxxxxx, Vincent Jardin <vjardin@xxxxxxx>
Date: Sat, 7 Mar 2026 00:15:47 +0100
The FT230X EEPROM decode path already reads group0 (DBUS) and group1
(CBUS) drive/schmitt/slew settings from byte 0x0C, but the build path
hardcodes the byte to 0:

    output[0x0c] = 0;  /* DBUS drive 4mA, CBUS drive 4mA like factory default */

And the ftdi_eeprom config parser has no FT230X branch for group
settings, so they are silently ignored.

Fix both:
- ftdi.c: replace the hardcoded 0 with proper nibble packing from
  eeprom->group0_* (low nibble) and eeprom->group1_* (high nibble),
  matching the existing decode logic and the other chip types.
- main.c: add group0 and group1 drive/schmitt/slew handling in the
  TYPE_230X config section.

The default behavior is unchanged (all fields default to 0 = 4mA, fast
slew, no schmitt), but users can now configure these settings for FT230X
devices just like FT232H/FT2232H/FT4232H.

Fixes: 519bbce ("ft230x: Include Factory Configuration Data when building new 
eeprom data.")
---
 ftdi_eeprom/main.c | 10 ++++++++++
 src/ftdi.c         | 20 ++++++++++++++++++--
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/ftdi_eeprom/main.c b/ftdi_eeprom/main.c
index 7d589c1..566d9e6 100644
--- a/ftdi_eeprom/main.c
+++ b/ftdi_eeprom/main.c
@@ -629,6 +629,16 @@ int main(int argc, char *argv[])
             eeprom_set_value(ftdi, CBUS_FUNCTION_2, cfg_getint(cfg, "cbusx2"));
         if (cfg_getint(cfg, "cbusx3") != -1)
             eeprom_set_value(ftdi, CBUS_FUNCTION_3, cfg_getint(cfg, "cbusx3"));
+        if (cfg_getint(cfg, "group0_drive") != -1)
+            eeprom_set_value(ftdi, GROUP0_DRIVE, cfg_getint(cfg, 
"group0_drive"));
+        eeprom_set_value(ftdi, GROUP0_SCHMITT, cfg_getbool(cfg, 
"group0_schmitt"));
+        if (cfg_getint(cfg, "group0_slew") != -1)
+            eeprom_set_value(ftdi, GROUP0_SLEW, cfg_getint(cfg, 
"group0_slew"));
+        if (cfg_getint(cfg, "group1_drive") != -1)
+            eeprom_set_value(ftdi, GROUP1_DRIVE, cfg_getint(cfg, 
"group1_drive"));
+        eeprom_set_value(ftdi, GROUP1_SCHMITT, cfg_getbool(cfg, 
"group1_schmitt"));
+        if (cfg_getint(cfg, "group1_slew") != -1)
+            eeprom_set_value(ftdi, GROUP1_SLEW, cfg_getint(cfg, 
"group1_slew"));
     }
 
     int invert = 0;
diff --git a/src/ftdi.c b/src/ftdi.c
index 811f801..2922bf6 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -3463,8 +3463,24 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             break;
         case TYPE_230X:
             output[0x00] = 0x80; /* Actually, leave the default value */
-            /*FIXME: Make DBUS & CBUS Control configurable*/
-            output[0x0c] = 0;    /* DBUS drive 4mA, CBUS drive 4mA like 
factory default */
+            if (eeprom->group0_drive > DRIVE_16MA)
+                output[0x0c] |= DRIVE_16MA;
+            else
+                output[0x0c] |= eeprom->group0_drive;
+            if (eeprom->group0_schmitt)
+                output[0x0c] |= IS_SCHMITT;
+            if (eeprom->group0_slew)
+                output[0x0c] |= SLOW_SLEW;
+
+            if (eeprom->group1_drive > DRIVE_16MA)
+                output[0x0c] |= DRIVE_16MA<<4;
+            else
+                output[0x0c] |= eeprom->group1_drive<<4;
+            if (eeprom->group1_schmitt)
+                output[0x0c] |= IS_SCHMITT<<4;
+            if (eeprom->group1_slew)
+                output[0x0c] |= SLOW_SLEW<<4;
+
             for (j = 0; j <= 6; j++)
             {
                 output[0x1a + j] = eeprom->cbus_function[j];
-- 
2.51.0


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

Current Thread