Hello,
I added bits needed for battery charger detection (see FTDI AN 175).
Successfully tested with FT230X.
Patch against latest git attached.
--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to [email protected]
diff --git a/ftdi_eeprom/main.c b/ftdi_eeprom/main.c
index d1c4794..55c4b80 100644
--- a/ftdi_eeprom/main.c
+++ b/ftdi_eeprom/main.c
@@ -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;
diff --git a/src/ftdi.c b/src/ftdi.c
index 9414c2d..433f1d6 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -3411,6 +3411,10 @@ 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 +3788,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 +4342,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");
diff --git a/src/ftdi.h b/src/ftdi.h
index 832fa0b..7e67c60 100644
--- a/src/ftdi.h
+++ b/src/ftdi.h
@@ -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,
};
/**
diff --git a/src/ftdi_i.h b/src/ftdi_i.h
index 18f5725..ab913b6 100644
--- a/src/ftdi_i.h
+++ b/src/ftdi_i.h
@@ -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;