libftdi Archives

Subject: [PATCH] ftdi_eeprom: support channel configuration

From: Stephan Linz <linz@xxxxxxxxxx>
To: libftdi@xxxxxxxxxxxxxxxxxxxxxxx
Cc: Stephan Linz <linz@xxxxxxxxxx>, thomas.jarosch@xxxxxxxxxxxxx, haberkorn@xxxxxxxxxxxx
Date: Thu, 13 Aug 2015 12:03:29 +0200
Previously, the channels could not be configured and were
hard set to type UART and driver VCP and further to no RS485
functionality on chips with support for this feature.

With the new 'chX_*' config file options the ftdi_eeprom tool
is now abel to change the channel type, set the driver autoload
decision (VCP od D2XX) and enable or disable RS485.

The new config file options are:

 * ch[a,b]_type      - string of: UART, FIFO, OPTO, CPU, FT1284
 * ch[a,b,c,d]_vcp   - bool: true for VCP, false for D2XX
 * ch[a,b,c,d]_rs485 - bool: true for RS485 enabled

Signed-off-by: Stephan Linz <linz@xxxxxxxxxx>
---
 ftdi_eeprom/main.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 57 insertions(+), 8 deletions(-)

diff --git a/ftdi_eeprom/main.c b/ftdi_eeprom/main.c
index b279223..edcfad7 100644
--- a/ftdi_eeprom/main.c
+++ b/ftdi_eeprom/main.c
@@ -109,6 +109,35 @@ static int parse_cbusx(cfg_t *cfg, cfg_opt_t *opt, const 
char *value, void *resu
     return -1;
 }
 
+static int parse_chtype(cfg_t *cfg, cfg_opt_t *opt, const char *value, void 
*result)
+{
+    static const struct
+    {
+        char* key;
+       int   opt;
+    } options[] =
+    {
+        { "UART",   CHANNEL_IS_UART },
+        { "FIFO",   CHANNEL_IS_FIFO },
+        { "OPTO",   CHANNEL_IS_OPTO },
+        { "CPU",    CHANNEL_IS_CPU },
+        { "FT1284", CHANNEL_IS_FT1284}
+    };
+
+    int i;
+    for (i=0; i<sizeof(options)/sizeof(*options); i++)
+    {
+        if (!(strcmp(options[i].key, value)))
+        {
+            *(int *)result = options[i].opt;
+            return 0;
+        }
+    }
+
+    cfg_error(cfg, "Invalid %s option '%s'", cfg_opt_name(opt), value);
+    return -1;
+}
+
 /**
  * @brief Set eeprom value
  *
@@ -212,6 +241,16 @@ int main(int argc, char *argv[])
         CFG_BOOL("invert_dsr", cfg_false, 0),
         CFG_BOOL("invert_dcd", cfg_false, 0),
         CFG_BOOL("invert_ri", cfg_false, 0),
+        CFG_INT_CB("cha_type", -1, 0, parse_chtype),
+        CFG_INT_CB("chb_type", -1, 0, parse_chtype),
+        CFG_BOOL("cha_vcp", cfg_true, 0),
+        CFG_BOOL("chb_vcp", cfg_true, 0),
+        CFG_BOOL("chc_vcp", cfg_true, 0),
+        CFG_BOOL("chd_vcp", cfg_true, 0),
+        CFG_BOOL("cha_rs485", cfg_false, 0),
+        CFG_BOOL("chb_rs485", cfg_false, 0),
+        CFG_BOOL("chc_rs485", cfg_false, 0),
+        CFG_BOOL("chd_rs485", cfg_false, 0),
         CFG_END()
     };
     cfg_t *cfg;
@@ -446,14 +485,24 @@ int main(int argc, char *argv[])
     if (cfg_getbool(cfg, "invert_ri")) invert |= INVERT_RI;
     eeprom_set_value(ftdi, INVERT, invert);
 
-    eeprom_set_value(ftdi, CHANNEL_A_DRIVER, DRIVER_VCP);
-    eeprom_set_value(ftdi, CHANNEL_B_DRIVER, DRIVER_VCP);
-    eeprom_set_value(ftdi, CHANNEL_C_DRIVER, DRIVER_VCP);
-    eeprom_set_value(ftdi, CHANNEL_D_DRIVER, DRIVER_VCP);
-    eeprom_set_value(ftdi, CHANNEL_A_RS485, 0);
-    eeprom_set_value(ftdi, CHANNEL_B_RS485, 0);
-    eeprom_set_value(ftdi, CHANNEL_C_RS485, 0);
-    eeprom_set_value(ftdi, CHANNEL_D_RS485, 0);
+    if (cfg_getint(cfg, "cha_type") != -1)
+        eeprom_set_value(ftdi, CHANNEL_A_TYPE, cfg_getint(cfg, "cha_type"));
+    if (cfg_getint(cfg, "chb_type") != -1)
+        eeprom_set_value(ftdi, CHANNEL_B_TYPE, cfg_getint(cfg, "chb_type"));
+
+    eeprom_set_value(ftdi, CHANNEL_A_DRIVER,
+                     cfg_getbool(cfg, "cha_vcp") ? DRIVER_VCP : 0);
+    eeprom_set_value(ftdi, CHANNEL_B_DRIVER,
+                     cfg_getbool(cfg, "chb_vcp") ? DRIVER_VCP : 0);
+    eeprom_set_value(ftdi, CHANNEL_C_DRIVER,
+                     cfg_getbool(cfg, "chc_vcp") ? DRIVER_VCP : 0);
+    eeprom_set_value(ftdi, CHANNEL_D_DRIVER,
+                     cfg_getbool(cfg, "chd_vcp") ? DRIVER_VCP : 0);
+
+    eeprom_set_value(ftdi, CHANNEL_A_RS485, cfg_getbool(cfg, "cha_rs485"));
+    eeprom_set_value(ftdi, CHANNEL_B_RS485, cfg_getbool(cfg, "chb_rs485"));
+    eeprom_set_value(ftdi, CHANNEL_C_RS485, cfg_getbool(cfg, "chc_rs485"));
+    eeprom_set_value(ftdi, CHANNEL_D_RS485, cfg_getbool(cfg, "chd_rs485"));
 
     if (command == COMMAND_ERASE)
     {
-- 
2.5.0


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

Current Thread