libftdi-git Archives

Subject: A library to talk to FTDI chips branch, master, updated. v1.4-40-gc0182e6

From: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
To: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
Date: Wed, 27 May 2020 20:24:20 +0200 (CEST)
The branch, master has been updated
       via  c0182e62d7c607205652d7860e92618181b667de (commit)
       via  37388ecee483f0facac38486741d4e1680ddc51b (commit)
      from  0f683bb574ff665aeabd1db8f1c0cc1cc8dc87b8 (commit)


- Log -----------------------------------------------------------------
commit c0182e62d7c607205652d7860e92618181b667de
Author: Thomas Jarosch <thomas.jarosch@xxxxxxxxxxxxx>
Date:   Thu May 14 23:00:24 2020 +0200

    ftdi_eeprom_build(): Fix inverted handling of VCP driver field for TYPE_R 
chips
    
    From doc/EEPROM-structure:
    
        On TYPE_R 00.3 set means D2XX, on other devices VCP
    
    -> invert the field for TYPE_R so "eeprom->channel_a_driver"
       set to 1 always means VCP driver for all chips.

commit 37388ecee483f0facac38486741d4e1680ddc51b
Author: Thomas Jarosch <thomas.jarosch@xxxxxxxxxxxxx>
Date:   Thu May 14 22:38:37 2020 +0200

    eeprom handling: Unify handling of boolean bit flags
    
    Boolean bit flags should be zero or one in memory,
    not the actual eeprom value FTDI assigned to them.
    
    Example of the code change in ftdi_eeprom_build():
    
    ftdi_eeprom_build():
    -            if (eeprom->suspend_dbus7 == SUSPEND_DBUS7_BIT)
    +            if (eeprom->suspend_dbus7)
    
    The changes should not break any backward compatibility
    in ftdi_build_eeprom().
    
    The function ftdi_decode_eeprom() will return slightly different values
    for boolean fields, but callers should test using "if (flag_enabled)"
    instead of "if (flag_enabled == specific_value)" anyway.
    
    Test done: Decoded eeprom of a FT232 serial cable stayed the same.
    $ diff -u dump-old.txt dump-new.txt
    -> no change

-----------------------------------------------------------------------

Summary of changes:
 doc/EEPROM-structure |    2 +-
 src/ftdi.c           |  178 ++++++++++++++++++++++++++------------------------
 2 files changed, 94 insertions(+), 86 deletions(-)

diff --git a/doc/EEPROM-structure b/doc/EEPROM-structure
index 08abe62..4a590b6 100644
--- a/doc/EEPROM-structure
+++ b/doc/EEPROM-structure
@@ -19,7 +19,7 @@ Byte.BIT| TYPE_AM TYPE_BM   TYPE_2232C       TYPE_R          
TYPE_2232H       TY
 00.7    |      0       0   0                0                SUSPEND_DBUS7    
channel_c_driver
 
 On TYPE_R 00.0 is set for the FT245R and cleared for the FT232R
-On TYPE_R 00.3 set mean D2XX, on other devices VCP
+On TYPE_R 00.3 set means D2XX, on other devices VCP
 
 01.0    |      0       0   channel_b_type                    channel_b_type   0
 01.1    |      0       0   channel_b_type                    channel_b_type   0
diff --git a/src/ftdi.c b/src/ftdi.c
index e82514e..d527d6f 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -3136,7 +3136,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
         case TYPE_2232C:
 
             output[0x00] = type2bit(eeprom->channel_a_type, TYPE_2232C);
-            if (eeprom->channel_a_driver == DRIVER_VCP)
+            if (eeprom->channel_a_driver)
                 output[0x00] |= DRIVER_VCP;
             else
                 output[0x00] &= ~DRIVER_VCP;
@@ -3147,7 +3147,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
                 output[0x00] &= ~HIGH_CURRENT_DRIVE;
 
             output[0x01] = type2bit(eeprom->channel_b_type, TYPE_2232C);
-            if (eeprom->channel_b_driver == DRIVER_VCP)
+            if (eeprom->channel_b_driver)
                 output[0x01] |= DRIVER_VCP;
             else
                 output[0x01] &= ~DRIVER_VCP;
@@ -3182,8 +3182,13 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             output[0x00] = type2bit(eeprom->channel_a_type, TYPE_R);
             if (eeprom->high_current)
                 output[0x00] |= HIGH_CURRENT_DRIVE_R;
-            if (eeprom->channel_a_driver == DRIVER_VCP)
+
+            /* Field is inverted for TYPE_R: Bit 00.3 set to 1 is D2XX, VCP is 
0 */
+            if (eeprom->channel_a_driver)
+                output[0x00] &= ~DRIVER_VCP;
+            else
                 output[0x00] |= DRIVER_VCP;
+
             if (eeprom->external_oscillator)
                 output[0x00] |= 0x02;
             output[0x01] = 0x40; /* Hard coded Endpoint Size*/
@@ -3223,17 +3228,18 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             break;
         case TYPE_2232H:
             output[0x00] = type2bit(eeprom->channel_a_type, TYPE_2232H);
-            if ( eeprom->channel_a_driver == DRIVER_VCP)
+            if (eeprom->channel_a_driver)
                 output[0x00] |= DRIVER_VCP;
             else
                 output[0x00] &= ~DRIVER_VCP;
 
             output[0x01] = type2bit(eeprom->channel_b_type, TYPE_2232H);
-            if ( eeprom->channel_b_driver == DRIVER_VCP)
+            if (eeprom->channel_b_driver)
                 output[0x01] |= DRIVER_VCP;
             else
                 output[0x01] &= ~DRIVER_VCP;
-            if (eeprom->suspend_dbus7 == SUSPEND_DBUS7_BIT)
+
+            if (eeprom->suspend_dbus7)
                 output[0x01] |= SUSPEND_DBUS7_BIT;
             else
                 output[0x01] &= ~SUSPEND_DBUS7_BIT;
@@ -3247,55 +3253,55 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
                 output[0x0c] |= DRIVE_16MA;
             else
                 output[0x0c] |= eeprom->group0_drive;
-            if (eeprom->group0_schmitt == IS_SCHMITT)
+            if (eeprom->group0_schmitt)
                 output[0x0c] |= IS_SCHMITT;
-            if (eeprom->group0_slew == SLOW_SLEW)
+            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 == IS_SCHMITT)
+            if (eeprom->group1_schmitt)
                 output[0x0c] |= IS_SCHMITT<<4;
-            if (eeprom->group1_slew == SLOW_SLEW)
+            if (eeprom->group1_slew)
                 output[0x0c] |= SLOW_SLEW<<4;
 
             if (eeprom->group2_drive > DRIVE_16MA)
                 output[0x0d] |= DRIVE_16MA;
             else
                 output[0x0d] |= eeprom->group2_drive;
-            if (eeprom->group2_schmitt == IS_SCHMITT)
+            if (eeprom->group2_schmitt)
                 output[0x0d] |= IS_SCHMITT;
-            if (eeprom->group2_slew == SLOW_SLEW)
+            if (eeprom->group2_slew)
                 output[0x0d] |= SLOW_SLEW;
 
             if (eeprom->group3_drive > DRIVE_16MA)
                 output[0x0d] |= DRIVE_16MA<<4;
             else
                 output[0x0d] |= eeprom->group3_drive<<4;
-            if (eeprom->group3_schmitt == IS_SCHMITT)
+            if (eeprom->group3_schmitt)
                 output[0x0d] |= IS_SCHMITT<<4;
-            if (eeprom->group3_slew == SLOW_SLEW)
+            if (eeprom->group3_slew)
                 output[0x0d] |= SLOW_SLEW<<4;
 
             output[0x18] = eeprom->chip;
 
             break;
         case TYPE_4232H:
-            if (eeprom->channel_a_driver == DRIVER_VCP)
+            if (eeprom->channel_a_driver)
                 output[0x00] |= DRIVER_VCP;
             else
                 output[0x00] &= ~DRIVER_VCP;
-            if (eeprom->channel_b_driver == DRIVER_VCP)
+            if (eeprom->channel_b_driver)
                 output[0x01] |= DRIVER_VCP;
             else
                 output[0x01] &= ~DRIVER_VCP;
-            if (eeprom->channel_c_driver == DRIVER_VCP)
+            if (eeprom->channel_c_driver)
                 output[0x00] |= (DRIVER_VCP << 4);
             else
                 output[0x00] &= ~(DRIVER_VCP << 4);
-            if (eeprom->channel_d_driver == DRIVER_VCP)
+            if (eeprom->channel_d_driver)
                 output[0x01] |= (DRIVER_VCP << 4);
             else
                 output[0x01] &= ~(DRIVER_VCP << 4);
@@ -3326,36 +3332,36 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
                 output[0x0c] |= DRIVE_16MA;
             else
                 output[0x0c] |= eeprom->group0_drive;
-            if (eeprom->group0_schmitt == IS_SCHMITT)
+            if (eeprom->group0_schmitt)
                 output[0x0c] |= IS_SCHMITT;
-            if (eeprom->group0_slew == SLOW_SLEW)
+            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 == IS_SCHMITT)
+            if (eeprom->group1_schmitt)
                 output[0x0c] |= IS_SCHMITT<<4;
-            if (eeprom->group1_slew == SLOW_SLEW)
+            if (eeprom->group1_slew)
                 output[0x0c] |= SLOW_SLEW<<4;
 
             if (eeprom->group2_drive > DRIVE_16MA)
                 output[0x0d] |= DRIVE_16MA;
             else
                 output[0x0d] |= eeprom->group2_drive;
-            if (eeprom->group2_schmitt == IS_SCHMITT)
+            if (eeprom->group2_schmitt)
                 output[0x0d] |= IS_SCHMITT;
-            if (eeprom->group2_slew == SLOW_SLEW)
+            if (eeprom->group2_slew)
                 output[0x0d] |= SLOW_SLEW;
 
             if (eeprom->group3_drive > DRIVE_16MA)
                 output[0x0d] |= DRIVE_16MA<<4;
             else
                 output[0x0d] |= eeprom->group3_drive<<4;
-            if (eeprom->group3_schmitt == IS_SCHMITT)
+            if (eeprom->group3_schmitt)
                 output[0x0d] |= IS_SCHMITT<<4;
-            if (eeprom->group3_slew == SLOW_SLEW)
+            if (eeprom->group3_slew)
                 output[0x0d] |= SLOW_SLEW<<4;
 
             output[0x18] = eeprom->chip;
@@ -3363,10 +3369,11 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             break;
         case TYPE_232H:
             output[0x00] = type2bit(eeprom->channel_a_type, TYPE_232H);
-            if ( eeprom->channel_a_driver == DRIVER_VCP)
+            if (eeprom->channel_a_driver)
                 output[0x00] |= DRIVER_VCPH;
             else
                 output[0x00] &= ~DRIVER_VCPH;
+
             if (eeprom->powersave)
                 output[0x01] |= POWER_SAVE_DISABLE_H;
             else
@@ -3389,22 +3396,23 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
                 output[0x01] |= FT1284_FLOW_CONTROL;
             else
                 output[0x01] &= ~FT1284_FLOW_CONTROL;
+
             if (eeprom->group0_drive > DRIVE_16MA)
                 output[0x0c] |= DRIVE_16MA;
             else
                 output[0x0c] |= eeprom->group0_drive;
-            if (eeprom->group0_schmitt == IS_SCHMITT)
+            if (eeprom->group0_schmitt)
                 output[0x0c] |= IS_SCHMITT;
-            if (eeprom->group0_slew == SLOW_SLEW)
+            if (eeprom->group0_slew)
                 output[0x0c] |= SLOW_SLEW;
 
             if (eeprom->group1_drive > DRIVE_16MA)
                 output[0x0d] |= DRIVE_16MA;
             else
                 output[0x0d] |= eeprom->group1_drive;
-            if (eeprom->group1_schmitt == IS_SCHMITT)
+            if (eeprom->group1_schmitt)
                 output[0x0d] |= IS_SCHMITT;
-            if (eeprom->group1_slew == SLOW_SLEW)
+            if (eeprom->group1_slew)
                 output[0x0d] |= SLOW_SLEW;
 
             set_ft232h_cbus(eeprom, output);
@@ -3568,8 +3576,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
     // Bit 7: always 1
     // Bit 6: 1 if this device is self powered, 0 if bus powered
     // Bit 5: 1 if this device uses remote wakeup
-    eeprom->self_powered = buf[0x08] & 0x40;
-    eeprom->remote_wakeup = buf[0x08] & 0x20;
+    eeprom->self_powered = !!(buf[0x08] & 0x40);
+    eeprom->remote_wakeup = !!(buf[0x08] & 0x20);
 
     // Addr 09: Max power consumption: max power = value * 2 mA
     eeprom->max_power = MAX_POWER_MILLIAMP_PER_UNIT * buf[0x09];
@@ -3584,9 +3592,9 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
     // Bit 1: 1 - Out EndPoint is Isochronous
     // Bit 0: 1 - In EndPoint is Isochronous
     //
-    eeprom->in_is_isochronous  = buf[0x0A]&0x01;
-    eeprom->out_is_isochronous = buf[0x0A]&0x02;
-    eeprom->suspend_pull_downs = buf[0x0A]&0x04;
+    eeprom->in_is_isochronous  = !!(buf[0x0A]&0x01);
+    eeprom->out_is_isochronous = !!(buf[0x0A]&0x02);
+    eeprom->suspend_pull_downs = !!(buf[0x0A]&0x04);
     eeprom->use_serial         = !!(buf[0x0A] & USE_SERIAL_NUM);
     eeprom->use_usb_version    = !!(buf[0x0A] & USE_USB_VERSION_BIT);
 
@@ -3690,19 +3698,19 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
     else if (ftdi->type == TYPE_2232C)
     {
         eeprom->channel_a_type   = bit2type(buf[0x00] & 0x7);
-        eeprom->channel_a_driver = buf[0x00] & DRIVER_VCP;
-        eeprom->high_current_a   = buf[0x00] & HIGH_CURRENT_DRIVE;
+        eeprom->channel_a_driver = !!(buf[0x00] & DRIVER_VCP);
+        eeprom->high_current_a   = !!(buf[0x00] & HIGH_CURRENT_DRIVE);
         eeprom->channel_b_type   = buf[0x01] & 0x7;
-        eeprom->channel_b_driver = buf[0x01] & DRIVER_VCP;
-        eeprom->high_current_b   = buf[0x01] & HIGH_CURRENT_DRIVE;
+        eeprom->channel_b_driver = !!(buf[0x01] & DRIVER_VCP);
+        eeprom->high_current_b   = !!(buf[0x01] & HIGH_CURRENT_DRIVE);
         eeprom->chip = buf[0x14];
     }
     else if (ftdi->type == TYPE_R)
     {
-        /* TYPE_R flags D2XX, not VCP as all others*/
-        eeprom->channel_a_driver = ~buf[0x00] & DRIVER_VCP;
-        eeprom->high_current     = buf[0x00] & HIGH_CURRENT_DRIVE_R;
-        eeprom->external_oscillator = buf[0x00] & 0x02;
+        /* TYPE_R flags D2XX, not VCP as all others */
+        eeprom->channel_a_driver = !(buf[0x00] & DRIVER_VCP);               /* 
note: inverted flag, use a single NOT */
+        eeprom->high_current     = !!(buf[0x00] & HIGH_CURRENT_DRIVE_R);
+        eeprom->external_oscillator = !!(buf[0x00] & 0x02);
         if ( (buf[0x01]&0x40) != 0x40)
             fprintf(stderr,
                     "TYPE_R EEPROM byte[0x01] Bit 6 unexpected Endpoint size."
@@ -3713,7 +3721,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
         eeprom->chip = buf[0x16];
         // Addr 0B: Invert data lines
         // Works only on FT232R, not FT245R, but no way to distinguish
-        eeprom->invert = buf[0x0B];
+        eeprom->invert = buf[0x0B];                                         /* 
note: not a bitflag */
         // Addr 14: CBUS function: CBUS0, CBUS1
         // Addr 15: CBUS function: CBUS2, CBUS3
         // Addr 16: CBUS function: CBUS5
@@ -3725,53 +3733,53 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
     }
     else if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H))
     {
-        eeprom->channel_a_driver = buf[0x00] & DRIVER_VCP;
-        eeprom->channel_b_driver = buf[0x01] & DRIVER_VCP;
+        eeprom->channel_a_driver = !!(buf[0x00] & DRIVER_VCP);
+        eeprom->channel_b_driver = !!(buf[0x01] & DRIVER_VCP);
 
         if (ftdi->type == TYPE_2232H)
         {
             eeprom->channel_a_type   = bit2type(buf[0x00] & 0x7);
             eeprom->channel_b_type   = bit2type(buf[0x01] & 0x7);
-            eeprom->suspend_dbus7    = buf[0x01] & SUSPEND_DBUS7_BIT;
+            eeprom->suspend_dbus7    = !!(buf[0x01] & SUSPEND_DBUS7_BIT);
         }
         else
         {
-            eeprom->channel_c_driver = (buf[0x00] >> 4) & DRIVER_VCP;
-            eeprom->channel_d_driver = (buf[0x01] >> 4) & DRIVER_VCP;
-            eeprom->channel_a_rs485enable = buf[0x0b] & (CHANNEL_IS_RS485 << 
0);
-            eeprom->channel_b_rs485enable = buf[0x0b] & (CHANNEL_IS_RS485 << 
1);
-            eeprom->channel_c_rs485enable = buf[0x0b] & (CHANNEL_IS_RS485 << 
2);
-            eeprom->channel_d_rs485enable = buf[0x0b] & (CHANNEL_IS_RS485 << 
3);
+            eeprom->channel_c_driver = !!((buf[0x00] >> 4) & DRIVER_VCP);
+            eeprom->channel_d_driver = !!((buf[0x01] >> 4) & DRIVER_VCP);
+            eeprom->channel_a_rs485enable = !!(buf[0x0b] & (CHANNEL_IS_RS485 
<< 0));
+            eeprom->channel_b_rs485enable = !!(buf[0x0b] & (CHANNEL_IS_RS485 
<< 1));
+            eeprom->channel_c_rs485enable = !!(buf[0x0b] & (CHANNEL_IS_RS485 
<< 2));
+            eeprom->channel_d_rs485enable = !!(buf[0x0b] & (CHANNEL_IS_RS485 
<< 3));
         }
 
         eeprom->chip = buf[0x18];
-        eeprom->group0_drive   =  buf[0x0c]       & DRIVE_16MA;
-        eeprom->group0_schmitt =  buf[0x0c]       & IS_SCHMITT;
-        eeprom->group0_slew    =  buf[0x0c]       & SLOW_SLEW;
-        eeprom->group1_drive   = (buf[0x0c] >> 4) & 0x3;
-        eeprom->group1_schmitt = (buf[0x0c] >> 4) & IS_SCHMITT;
-        eeprom->group1_slew    = (buf[0x0c] >> 4) & SLOW_SLEW;
-        eeprom->group2_drive   =  buf[0x0d]       & DRIVE_16MA;
-        eeprom->group2_schmitt =  buf[0x0d]       & IS_SCHMITT;
-        eeprom->group2_slew    =  buf[0x0d]       & SLOW_SLEW;
-        eeprom->group3_drive   = (buf[0x0d] >> 4) & DRIVE_16MA;
-        eeprom->group3_schmitt = (buf[0x0d] >> 4) & IS_SCHMITT;
-        eeprom->group3_slew    = (buf[0x0d] >> 4) & SLOW_SLEW;
+        eeprom->group0_drive   = buf[0x0c]       & DRIVE_16MA;              /* 
not a bitflag */
+        eeprom->group0_schmitt = !!(buf[0x0c]       & IS_SCHMITT);
+        eeprom->group0_slew    = !!(buf[0x0c]       & SLOW_SLEW);
+        eeprom->group1_drive   = (buf[0x0c] >> 4) & DRIVE_16MA;             /* 
not a bitflag */
+        eeprom->group1_schmitt = !!((buf[0x0c] >> 4) & IS_SCHMITT);
+        eeprom->group1_slew    = !!((buf[0x0c] >> 4) & SLOW_SLEW);
+        eeprom->group2_drive   = buf[0x0d]       & DRIVE_16MA;              /* 
not a bitflag */
+        eeprom->group2_schmitt = !!(buf[0x0d]       & IS_SCHMITT);
+        eeprom->group2_slew    = !!(buf[0x0d]       & SLOW_SLEW);
+        eeprom->group3_drive   = (buf[0x0d] >> 4) & DRIVE_16MA;             /* 
not a bitflag */
+        eeprom->group3_schmitt = !!((buf[0x0d] >> 4) & IS_SCHMITT);
+        eeprom->group3_slew    = !!((buf[0x0d] >> 4) & SLOW_SLEW);
     }
     else if (ftdi->type == TYPE_232H)
     {
         eeprom->channel_a_type   = buf[0x00] & 0xf;
-        eeprom->channel_a_driver = (buf[0x00] & DRIVER_VCPH)?DRIVER_VCP:0;
-        eeprom->clock_polarity =  buf[0x01]       & FT1284_CLK_IDLE_STATE;
-        eeprom->data_order     =  buf[0x01]       & FT1284_DATA_LSB;
-        eeprom->flow_control   =  buf[0x01]       & FT1284_FLOW_CONTROL;
-        eeprom->powersave      =  buf[0x01]       & POWER_SAVE_DISABLE_H;
-        eeprom->group0_drive   =  buf[0x0c]       & DRIVE_16MA;
-        eeprom->group0_schmitt =  buf[0x0c]       & IS_SCHMITT;
-        eeprom->group0_slew    =  buf[0x0c]       & SLOW_SLEW;
-        eeprom->group1_drive   =  buf[0x0d]       & DRIVE_16MA;
-        eeprom->group1_schmitt =  buf[0x0d]       & IS_SCHMITT;
-        eeprom->group1_slew    =  buf[0x0d]       & SLOW_SLEW;
+        eeprom->channel_a_driver = !!(buf[0x00] & DRIVER_VCPH);
+        eeprom->clock_polarity =  !!(buf[0x01]       & FT1284_CLK_IDLE_STATE);
+        eeprom->data_order     =  !!(buf[0x01]       & FT1284_DATA_LSB);
+        eeprom->flow_control   =  !!(buf[0x01]       & FT1284_FLOW_CONTROL);
+        eeprom->powersave      =  !!(buf[0x01]       & POWER_SAVE_DISABLE_H);
+        eeprom->group0_drive   =  buf[0x0c]       & DRIVE_16MA;             /* 
not a bitflag */
+        eeprom->group0_schmitt =  !!(buf[0x0c]       & IS_SCHMITT);
+        eeprom->group0_slew    =  !!(buf[0x0c]       & SLOW_SLEW);
+        eeprom->group1_drive   =  buf[0x0d]       & DRIVE_16MA;             /* 
not a bitflag */
+        eeprom->group1_schmitt =  !!(buf[0x0d]       & IS_SCHMITT);
+        eeprom->group1_slew    =  !!(buf[0x0d]       & SLOW_SLEW);
 
         for(i=0; i<5; i++)
         {
@@ -3787,14 +3795,14 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
         {
             eeprom->cbus_function[i] =  buf[0x1a + i] & 0xFF;
         }
-        eeprom->group0_drive   =  buf[0x0c]       & 0x03;
-        eeprom->group0_schmitt =  buf[0x0c]       & IS_SCHMITT;
-        eeprom->group0_slew    =  buf[0x0c]       & SLOW_SLEW;
-        eeprom->group1_drive   = (buf[0x0c] >> 4) & 0x03;
-        eeprom->group1_schmitt = (buf[0x0c] >> 4) & IS_SCHMITT;
-        eeprom->group1_slew    = (buf[0x0c] >> 4) & SLOW_SLEW;
-
-        eeprom->invert = buf[0xb];
+        eeprom->group0_drive   = buf[0x0c]       & DRIVE_16MA;              /* 
not a bitflag */
+        eeprom->group0_schmitt = !!(buf[0x0c]       & IS_SCHMITT);
+        eeprom->group0_slew    = !!(buf[0x0c]       & SLOW_SLEW);
+        eeprom->group1_drive   = (buf[0x0c] >> 4) & DRIVE_16MA;             /* 
not a bitflag */
+        eeprom->group1_schmitt = !!((buf[0x0c] >> 4) & IS_SCHMITT);
+        eeprom->group1_slew    = !!((buf[0x0c] >> 4) & SLOW_SLEW);
+
+        eeprom->invert = buf[0xb];                                          /* 
not a bitflag */
     }
 
     if (verbose)


hooks/post-receive
-- 
A library to talk to FTDI chips

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

Current Thread
  • A library to talk to FTDI chips branch, master, updated. v1.4-40-gc0182e6, libftdi-git <=