From: Martin Devera Date: Tue, 1 Oct 2019 12:54:10 +0000 (+0200) Subject: Add support for battery charger detection on FT-X devices X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=refs%2Fheads%2Fstaging Add support for battery charger detection on FT-X devices Based upon FTDI Application Note AN_175. --- diff --git a/ftdi_eeprom/main.c b/ftdi_eeprom/main.c index d1c4794..ab9b126 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..4c6d862 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -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"); 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;