diff options
-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 170680487d..cb225c7a3b 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -1295,12 +1295,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) @@ -1339,7 +1343,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); |