Add support for battery charger detection on FT-X devices staging
authorMartin Devera <devik@eaxlabs.cz>
Tue, 1 Oct 2019 12:54:10 +0000 (14:54 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Tue, 1 Oct 2019 12:57:31 +0000 (14:57 +0200)
Based upon FTDI Application Note AN_175.

ftdi_eeprom/main.c
src/ftdi.c
src/ftdi.h
src/ftdi_i.h

index d1c4794..ab9b126 100644 (file)
@@ -257,6 +257,9 @@ int main(int argc, char *argv[])
         CFG_FUNC("include", &cfg_include),
         CFG_INT("user_data_addr", 0x18, 0),
         CFG_STR("user_data_file", "", 0),
+        CFG_BOOL("bcd_enable", cfg_false, 0),
+        CFG_BOOL("bcd_pwr_enable", cfg_false, 0),
+        CFG_BOOL("bcd_no_sleep", cfg_false, 0),
         CFG_END()
     };
     cfg_t *cfg;
@@ -490,6 +493,10 @@ int main(int argc, char *argv[])
             eeprom_set_value(ftdi, CBUS_FUNCTION_2, cfg_getint(cfg, "cbusx2"));
         if (cfg_getint(cfg, "cbusx3") != -1)
             eeprom_set_value(ftdi, CBUS_FUNCTION_3, cfg_getint(cfg, "cbusx3"));
+
+        eeprom_set_value(ftdi, BCD_ENABLE, cfg_getbool(cfg, "bcd_enable"));
+        eeprom_set_value(ftdi, BCD_PWR_ENABLE, cfg_getbool(cfg, "bcd_pwr_enable"));
+        eeprom_set_value(ftdi, BCD_NO_SLEEP, cfg_getbool(cfg, "bcd_no_sleep"));
     }
 
     int invert = 0;
index 9414c2d..4c6d862 100644 (file)
@@ -3411,6 +3411,14 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             break;
         case TYPE_230X:
             output[0x00] = 0x80; /* Actually, leave the default value */
+
+            if (eeprom->bcd_enable)
+                output[0x00] |= 1;
+            if (eeprom->bcd_pwr_enable)
+                output[0x00] |= 2;
+            if (eeprom->bcd_deactivate_sleep)
+                output[0x00] |= 4;
+
             /*FIXME: Make DBUS & CBUS Control configurable*/
             output[0x0c] = 0;    /* DBUS drive 4mA, CBUS drive 4 mA like factory default */
             for (j = 0; j <= 6; j++)
@@ -3784,6 +3792,9 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose)
         {
             eeprom->cbus_function[i] =  buf[0x1a + i] & 0xFF;
         }
+        eeprom->bcd_enable     =  buf[0x00]       & 0x1;
+        eeprom->bcd_pwr_enable =  buf[0x00]       & 0x2;
+        eeprom->bcd_deactivate_sleep = buf[0x00]  & 0x4;
         eeprom->group0_drive   =  buf[0x0c]       & 0x03;
         eeprom->group0_schmitt =  buf[0x0c]       & IS_SCHMITT;
         eeprom->group0_slew    =  buf[0x0c]       & SLOW_SLEW;
@@ -4335,6 +4346,15 @@ int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value valu
         case USER_DATA_ADDR:
             ftdi->eeprom->user_data_addr = value;
             break;
+        case BCD_ENABLE:
+            ftdi->eeprom->bcd_enable = value;
+            break;
+        case BCD_PWR_ENABLE:
+            ftdi->eeprom->bcd_pwr_enable = value;
+            break;
+        case BCD_NO_SLEEP:
+            ftdi->eeprom->bcd_deactivate_sleep = value;
+            break;
 
         default :
             ftdi_error_return(-1, "Request to unknown EEPROM value");
index 832fa0b..7e67c60 100644 (file)
@@ -385,6 +385,9 @@ enum ftdi_eeprom_value
     RELEASE_NUMBER     = 55,
     EXTERNAL_OSCILLATOR= 56,
     USER_DATA_ADDR     = 57,
+    BCD_ENABLE         = 58,
+    BCD_PWR_ENABLE     = 59,
+    BCD_NO_SLEEP       = 60,
 };
 
 /**
index 18f5725..ab913b6 100644 (file)
@@ -125,6 +125,14 @@ struct ftdi_eeprom
     int data_order;
     int flow_control;
 
+    /* FT-X specific */
+    /** battery charger detector enable (see AN175) */
+    int bcd_enable;
+    /** battery charger power enable */
+    int bcd_pwr_enable;
+    /** battery charger deactivate sleep */
+    int bcd_deactivate_sleep;
+
     /** user data **/
     int user_data_addr;
     int user_data_size;