Quantcast

[PATCH] ftdi_eeprom: support channel configuration

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PATCH] ftdi_eeprom: support channel configuration

Stephan Linz
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 <[hidden email]>
---
 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 [hidden email]  

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [PATCH] ftdi_eeprom: support channel configuration

Thomas Jarosch
Hi Stephan,

Am 13.08.2015 um 12:03 schrieb Stephan Linz:

> 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 <[hidden email]>

the patch looks sound to me. Especially as it keeps
the default values of the previous behavior.

If nobody else objects, I'll apply it.

Not sure if I manage to do that tomorrow,
otherwise I'll apply it in about three weeks.

Cheers,
Thomas


--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to [hidden email]  

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [PATCH] ftdi_eeprom: support channel configuration

Thomas Jarosch
In reply to this post by Stephan Linz
On Thursday, 13. August 2015 12:03:29 Stephan Linz wrote:
> ..
> 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 <[hidden email]>

Patch applied, thanks.

I've also double checked the pointer size calculations in
"sizeof(options)/sizeof(*options)". Such stuff is easy to get wrong.

Cheers,
Thomas


--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to [hidden email]  

Loading...