diff options
author | Diana Z <dzigterman@chromium.org> | 2019-12-09 14:58:34 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-12-23 15:07:29 +0000 |
commit | f1a74b88a60303d7035a3c489ee0b69e70ff1b31 (patch) | |
tree | 36e51ef227484ef14b87987b87b76c2b892490a9 | |
parent | 4fa1e8a89d8cba341389440c7d7b257334443a71 (diff) | |
download | chrome-ec-f1a74b88a60303d7035a3c489ee0b69e70ff1b31.tar.gz |
Charge state v2: Only shutdown on cold discharge
Currently, the discharge minimum temperature is always checked when
determining if the system should shut down, even if the system is not
discharging. This change allows the system to run below the discharging
minimum temperature as long as AC is present.
BRANCH=octopus
BUG=b:145494158
TEST=loaded onto octopus unit, faked low battery temperature and
verified the system did shut down when discharging and did not with AC
Change-Id: I4f6549b04dc1e7b55e410d3ae4f67dc6126f9c7c
Signed-off-by: Diana Z <dzigterman@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1958853
Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1979574
Tested-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Commit-Queue: Tim Wawrzynczak <twawrzynczak@chromium.org>
-rw-r--r-- | common/charge_state_v2.c | 18 | ||||
-rw-r--r-- | test/sbs_charging_v2.c | 34 |
2 files changed, 47 insertions, 5 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index c13a56c0ea..2cbeea7edc 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -1269,12 +1269,16 @@ static int set_chg_ctrl_mode(enum ec_charge_control_mode mode) return EC_SUCCESS; } -/* True if we know the battery temp is too high or too low */ static inline int battery_too_hot(int batt_temp_c) { return (!(curr.batt.flags & BATT_FLAG_BAD_TEMPERATURE) && - (batt_temp_c > batt_info->discharging_max_c || - batt_temp_c < batt_info->discharging_min_c)); + (batt_temp_c > batt_info->discharging_max_c)); +} + +static inline int battery_too_cold_for_discharge(int batt_temp_c) +{ + return (!(curr.batt.flags & BATT_FLAG_BAD_TEMPERATURE) && + (batt_temp_c < batt_info->discharging_min_c)); } __attribute__((weak)) uint8_t board_set_battery_level_shutdown(void) @@ -1313,7 +1317,13 @@ static int is_battery_critical(void) * temp, so it can turn fans on. */ if (battery_too_hot(batt_temp_c)) { - CPRINTS("Batt temp out of range: %dC", batt_temp_c); + CPRINTS("Batt too hot: %dC", batt_temp_c); + return 1; + } + + /* Note: the battery may run on AC without discharging when too cold */ + if (!curr.ac && battery_too_cold_for_discharge(batt_temp_c)) { + CPRINTS("Batt too cold: %dC", batt_temp_c); return 1; } diff --git a/test/sbs_charging_v2.c b/test/sbs_charging_v2.c index 2e69beaf6e..1460af3502 100644 --- a/test/sbs_charging_v2.c +++ b/test/sbs_charging_v2.c @@ -2,7 +2,7 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * - * Test lid switch. + * Test charge_state_v2 behavior */ #include "battery_smart.h" @@ -350,6 +350,36 @@ static int test_high_temp_battery(void) return EC_SUCCESS; } +static int test_cold_battery_with_ac(void) +{ + test_setup(1); + + ccprintf("[CHARGING TEST] Cold battery no shutdown with AC\n"); + ev_clear(EC_HOST_EVENT_BATTERY_SHUTDOWN); + sb_write(SB_TEMPERATURE, CELSIUS_TO_DECI_KELVIN(-90)); + wait_charging_state(); + sleep(CONFIG_BATTERY_CRITICAL_SHUTDOWN_TIMEOUT); + TEST_ASSERT(!is_shutdown); + + return EC_SUCCESS; +} + +static int test_cold_battery_no_ac(void) +{ + test_setup(0); + + ccprintf("[CHARGING TEST] Cold battery shutdown when discharging\n"); + ev_clear(EC_HOST_EVENT_BATTERY_SHUTDOWN); + sb_write(SB_TEMPERATURE, CELSIUS_TO_DECI_KELVIN(-90)); + wait_charging_state(); + TEST_ASSERT(ev_is_set(EC_HOST_EVENT_BATTERY_SHUTDOWN)); + TEST_ASSERT(!is_shutdown); + sleep(CONFIG_BATTERY_CRITICAL_SHUTDOWN_TIMEOUT); + TEST_ASSERT(is_shutdown); + + return EC_SUCCESS; +} + static int test_external_funcs(void) { int rv, temp; @@ -688,6 +718,8 @@ void run_test(void) RUN_TEST(test_charge_state); RUN_TEST(test_low_battery); RUN_TEST(test_high_temp_battery); + RUN_TEST(test_cold_battery_with_ac); + RUN_TEST(test_cold_battery_no_ac); RUN_TEST(test_external_funcs); RUN_TEST(test_hc_charge_state); RUN_TEST(test_hc_current_limit); |