diff options
Diffstat (limited to 'board/kukui/battery.c')
-rw-r--r-- | board/kukui/battery.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/board/kukui/battery.c b/board/kukui/battery.c index c24109f966..17d15256dc 100644 --- a/board/kukui/battery.c +++ b/board/kukui/battery.c @@ -33,10 +33,13 @@ #endif #define BAT_LEVEL_PD_LIMIT 85 +#define IBAT_PD_LIMIT 1000 #define BATTERY_SIMPLO_CHARGE_MIN_TEMP 0 #define BATTERY_SIMPLO_CHARGE_MAX_TEMP 60 +#define CPRINTS(format, args...) cprints(CC_CHARGER, format, ## args) + enum battery_type { BATTERY_SIMPLO = 0, BATTERY_MITSUMI, @@ -131,6 +134,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void) int charger_profile_override(struct charge_state_data *curr) { + static int previous_chg_limit_mv; + int chg_limit_mv; #ifdef CONFIG_BATTERY_MAX17055 /* battery temp in 0.1 deg C */ int bat_temp_c = curr->batt.temperature - 2731; @@ -202,6 +207,22 @@ int charger_profile_override(struct charge_state_data *curr) } #endif /* CONFIG_BATTERY_MAX17055 */ + /* Limit input (=VBUS) to 5V when soc > 85% and charge current < 1A. */ + if (!(curr->batt.flags & BATT_FLAG_BAD_CURRENT) && + charge_get_percent() > BAT_LEVEL_PD_LIMIT && + curr->batt.current < 1000) + chg_limit_mv = 5500; + else + chg_limit_mv = PD_MAX_VOLTAGE_MV; + + if (chg_limit_mv != previous_chg_limit_mv) + CPRINTS("VBUS limited to %dmV", chg_limit_mv); + previous_chg_limit_mv = chg_limit_mv; + + /* Pull down VBUS */ + if (pd_get_max_voltage() != chg_limit_mv) + pd_set_external_voltage_limit(0, chg_limit_mv); + /* * When the charger says it's done charging, even if fuel gauge says * SOC < BATTERY_LEVEL_NEAR_FULL, we'll overwrite SOC with @@ -229,23 +250,6 @@ DECLARE_HOOK(HOOK_BATTERY_SOC_CHANGE, board_charge_termination, HOOK_PRIO_DEFAULT); -static void pd_limit_5v(uint8_t en) -{ - int wanted_pd_voltage; - - wanted_pd_voltage = en ? 5500 : PD_MAX_VOLTAGE_MV; - - if (pd_get_max_voltage() != wanted_pd_voltage) - pd_set_external_voltage_limit(0, wanted_pd_voltage); -} - -/* When battery level > BAT_LEVEL_PD_LIMIT, we limit PD voltage to 5V. */ -static void board_pd_voltage(void) -{ - pd_limit_5v(charge_get_percent() > BAT_LEVEL_PD_LIMIT); -} -DECLARE_HOOK(HOOK_BATTERY_SOC_CHANGE, board_pd_voltage, HOOK_PRIO_DEFAULT); - /* Customs options controllable by host command. */ #define PARAM_FASTCHARGE (CS_PARAM_CUSTOM_PROFILE_MIN + 0) |