libftdi Archives

Subject: [PATCH] ftdi_eeprom: add group0/group1 schmitt, slew, and drive options

From: Vincent Jardin <vjardin@xxxxxxx>
To: libftdi@xxxxxxxxxxxxxxxxxxxxxxx
Cc: thomas.jarosch@xxxxxxxxxxxxx, Vincent Jardin <vjardin@xxxxxxx>
Date: Fri, 6 Mar 2026 22:35:51 +0100
The libftdi library already supports GROUP0_SCHMITT, GROUP0_SLEW,
GROUP1_DRIVE, GROUP1_SCHMITT, and GROUP1_SLEW via eeprom_set_value(),
but the ftdi_eeprom config file parser only exposed group0_drive.

Add config file options:
  group0_schmitt=true/false  - Schmitt trigger on ADBUS (group 0)
  group0_slew=slow/fast      - slew rate on ADBUS (group 0)
  group1_drive=4MA/8MA/12MA/16MA - drive strength on ACBUS (group 1)
  group1_schmitt=true/false  - Schmitt trigger on ACBUS (group 1)
  group1_slew=slow/fast      - slew rate on ACBUS (group 1)

These are needed to properly configure I2C (slow slew + Schmitt for
open-drain with pull-ups) and SPI (fast slew for high-frequency clock)
electrical characteristics via the EEPROM.
---
 ftdi_eeprom/main.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/ftdi_eeprom/main.c b/ftdi_eeprom/main.c
index 614d51e..b9c4c6e 100644
--- a/ftdi_eeprom/main.c
+++ b/ftdi_eeprom/main.c
@@ -87,6 +87,23 @@ static int parse_group0_drive(cfg_t *cfg, cfg_opt_t *opt, 
const char *value, voi
     return -1;
 }
 
+static int parse_slew(cfg_t *cfg, cfg_opt_t *opt, const char *value, void 
*result)
+{
+    if (!(strcasecmp(value, "slow")))
+    {
+        *(int *)result = 1;
+        return 0;
+    }
+    if (!(strcasecmp(value, "fast")))
+    {
+        *(int *)result = 0;
+        return 0;
+    }
+
+    cfg_error(cfg, "Invalid %s option '%s'", cfg_opt_name(opt), value);
+    return -1;
+}
+
 static int parse_cbush(cfg_t *cfg, cfg_opt_t *opt, const char *value, void 
*result)
 {
     static const char* options[] =
@@ -261,6 +278,11 @@ int main(int argc, char *argv[])
         CFG_INT_CB("cbusx2", -1, 0, parse_cbusx),
         CFG_INT_CB("cbusx3", -1, 0, parse_cbusx),
         CFG_INT_CB("group0_drive", -1, 0, parse_group0_drive),
+        CFG_BOOL("group0_schmitt", cfg_false, 0),
+        CFG_INT_CB("group0_slew", -1, 0, parse_slew),
+        CFG_INT_CB("group1_drive", -1, 0, parse_group0_drive),
+        CFG_BOOL("group1_schmitt", cfg_false, 0),
+        CFG_INT_CB("group1_slew", -1, 0, parse_slew),
         CFG_BOOL("invert_txd", cfg_false, 0),
         CFG_BOOL("invert_rxd", cfg_false, 0),
         CFG_BOOL("invert_rts", cfg_false, 0),
@@ -516,6 +538,16 @@ int main(int argc, char *argv[])
             eeprom_set_value(ftdi, CBUS_FUNCTION_9, cfg_getint(cfg, "cbush9"));
         if (cfg_getint(cfg, "group0_drive") != -1)
             eeprom_set_value(ftdi, GROUP0_DRIVE, cfg_getint(cfg, 
"group0_drive"));
+        if (cfg_getbool(cfg, "group0_schmitt"))
+            eeprom_set_value(ftdi, GROUP0_SCHMITT, 1);
+        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"));
+        if (cfg_getbool(cfg, "group1_schmitt"))
+            eeprom_set_value(ftdi, GROUP1_SCHMITT, 1);
+        if (cfg_getint(cfg, "group1_slew") != -1)
+            eeprom_set_value(ftdi, GROUP1_SLEW, cfg_getint(cfg, 
"group1_slew"));
     }
     else if (ftdi->type == TYPE_230X)
     {
-- 
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