summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/charge_state_v2.c18
-rw-r--r--test/sbs_charging_v2.c34
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);