Allow include() directive for libconfuse formatted config
[libftdi] / ftdi_eeprom / main.c
index b279223..455f156 100644 (file)
@@ -35,6 +35,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <errno.h>
 
 #include <confuse.h>
 #include <libusb.h>
@@ -109,6 +110,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 +242,17 @@ 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_FUNC("include", &cfg_include),
         CFG_END()
     };
     cfg_t *cfg;
@@ -356,10 +397,15 @@ int main(int argc, char *argv[])
         }
         if (filename != NULL && strlen(filename) > 0)
         {
-
             FILE *fp = fopen (filename, "wb");
-            fwrite (eeprom_buf, 1, my_eeprom_size, fp);
-            fclose (fp);
+            
+            if(fp)
+            {
+                fwrite(eeprom_buf, 1, my_eeprom_size, fp);
+                fclose(fp);
+            }
+            else
+                fprintf(stderr, "Could not open output file %s: %s\n", filename, strerror(errno));
         }
         else
         {
@@ -446,14 +492,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)
     {