From 5e182ed5f641d42dc43fe2c897bf91d47f6470f8 Mon Sep 17 00:00:00 2001 From: Paul Fagerburg Date: Wed, 13 Nov 2019 14:00:37 -0700 Subject: chgstv2: stop charging when battery temp exceeds specs Add a check for the battery temperature in the safe range to charge the battery, and if it isn't, stop charging. The battery information defines minimum and maximum temperatures for discharge and for charge. The state machine already checks if the battery temperature is outside of the range for discharge (as part of is_battery_critical) and will shut down the system completely if the battery temperature is out of range. However, the temperature range for charging is usually tigheter than for discharging, and it can be safe to discharge, but unsafe to charge. For example, Kohaku specifies a maximum charge temperature of 55 C, and a maximum discharge temperature of 60 C. If the battery is at 57 C, we don't want to charge, but it's still OK to use the system. The check is enabled by CONFIG_BATTERY_CHECK_CHARGE_TEMP_LIMITS. BUG=b:140596424 BRANCH=None TEST=`make buildall -j` builds with no errors. No boards have enabled CONFIG_BATTERY_CHECK_CHARGE_TEMP_LIMITS, so no effect. Change-Id: I3b76eab942ca3ef3871f0909395e91634db5640e Signed-off-by: Paul Fagerburg Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1914510 Reviewed-by: Scott Collyer --- common/charge_state_v2.c | 29 +++++++++++++++++++++++++++++ include/config.h | 3 +++ 2 files changed, 32 insertions(+) diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index b02b6ca819..6e6cc6c7d7 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -1476,6 +1476,25 @@ const struct batt_params *charger_current_battery_params(void) return &curr.batt; } +#ifdef CONFIG_BATTERY_CHECK_CHARGE_TEMP_LIMITS +/* Determine if the battery is outside of allowable temperature range */ +static int battery_outside_charging_temperature(void) +{ + const struct battery_info *batt_info = battery_get_info(); + /* battery temp in 0.1 deg C */ + int batt_temp_c = DECI_KELVIN_TO_CELSIUS(curr.batt.temperature); + + if (curr.batt.flags & BATT_FLAG_BAD_TEMPERATURE) + return 0; + + if ((batt_temp_c > batt_info->charging_max_c) || + (batt_temp_c < batt_info->charging_min_c)) { + return 1; + } + return 0; +} +#endif + /*****************************************************************************/ /* Hooks */ void charger_init(void) @@ -1809,6 +1828,16 @@ wait_for_it: } #endif +#ifdef CONFIG_BATTERY_CHECK_CHARGE_TEMP_LIMITS + if (battery_outside_charging_temperature()) { + curr.requested_current = 0; + curr.requested_voltage = 0; + curr.batt.flags &= ~BATT_FLAG_WANT_CHARGE; + if (curr.state != ST_DISCHARGE) + curr.state = ST_IDLE; + } +#endif + #ifdef CONFIG_CHARGE_MANAGER if (curr.batt.state_of_charge >= CONFIG_CHARGE_MANAGER_BAT_PCT_SAFE_MODE_EXIT && diff --git a/include/config.h b/include/config.h index 921eb0f4c9..cc12e94673 100644 --- a/include/config.h +++ b/include/config.h @@ -496,6 +496,9 @@ /* Perform a battery cut-off when we reach the battery critical level */ #undef CONFIG_BATTERY_CRITICAL_SHUTDOWN_CUT_OFF +/* If the battery is too hot or too cold, stop charging */ +#undef CONFIG_BATTERY_CHECK_CHARGE_TEMP_LIMITS + /* * Support battery cut-off as host command and console command. * -- cgit v1.2.1