From 7abbab0eef31f7c12725e4ae77a96418c2ea807b Mon Sep 17 00:00:00 2001 From: Daisuke Nojiri Date: Fri, 6 Aug 2021 09:15:58 -0700 Subject: chgstv2/sustainer: Add tests for full battery and AC Currently, unit tests do not check whether the battery sustainer can be enabled when the battery is already full or when the AC is already present. This patch adds tests which check the battery sustainer can be enabled when the battery is already full or when the AC is already present. BUG=b:188457962 BRANCH=None TEST=run-sbs_charging_v2 Change-Id: I4ec9785554d126baca0b60e889c4a2dabbfb628a Signed-off-by: Daisuke Nojiri Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3078401 Reviewed-by: Jack Rosenthal Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3105742 --- common/charge_state_v2.c | 2 +- test/sbs_charging_v2.c | 78 ++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 64 insertions(+), 16 deletions(-) diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index 1a292d866d..104539e780 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -1189,7 +1189,7 @@ static void show_charging_progress(void) } /* Calculate if battery is full based on whether it is accepting charge */ -static int calc_is_full(void) +test_mockable int calc_is_full(void) { static int __bss_slow ret; diff --git a/test/sbs_charging_v2.c b/test/sbs_charging_v2.c index f8a425c5cd..6b7bf04ca4 100644 --- a/test/sbs_charging_v2.c +++ b/test/sbs_charging_v2.c @@ -27,6 +27,7 @@ static int is_force_discharge; static int is_hibernated; static int override_voltage, override_current, override_usec; static int display_soc; +static int is_full; /* The simulation doesn't really hibernate, so we must reset this ourselves */ extern timestamp_t shutdown_warning_time; @@ -37,6 +38,7 @@ static void reset_mocks(void) is_shutdown = is_force_discharge = is_hibernated = 0; override_voltage = override_current = override_usec = 0; shutdown_warning_time.val = 0ULL; + is_full = 0; } void chipset_force_shutdown(enum chipset_shutdown_reason reason) @@ -110,10 +112,14 @@ static int wait_charging_state(void) static int charge_control(enum ec_charge_control_mode mode) { - struct ec_params_charge_control params; - params.mode = mode; - return test_send_host_command(EC_CMD_CHARGE_CONTROL, 1, ¶ms, - sizeof(params), NULL, 0); + struct ec_params_charge_control p; + + p.cmd = EC_CHARGE_CONTROL_CMD_SET; + p.mode = mode; + p.sustain_soc.lower = -1; + p.sustain_soc.upper = -1; + return test_send_host_command(EC_CMD_CHARGE_CONTROL, 2, &p, sizeof(p), + NULL, 0); } __override int charge_get_display_charge(void) @@ -121,6 +127,11 @@ __override int charge_get_display_charge(void) return display_soc; } +__override int calc_is_full(void) +{ + return is_full; +} + /* Setup init condition */ static void test_setup(int on_ac) { @@ -710,49 +721,86 @@ static int test_battery_sustainer(void) /* Check mode transition as the SoC changes. */ - /* SoC < lower < upper */ + ccprintf("Test SoC < lower < upper.\n"); display_soc = 780; wait_charging_state(); TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL); + ccprintf("Pass.\n"); - /* lower < upper < SoC */ + ccprintf("Test lower < upper < SoC.\n"); display_soc = 810; wait_charging_state(); TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE); + ccprintf("Pass.\n"); - /* Unplug AC. Sustainer gets deactivated. */ + ccprintf("Test unplug AC.\n"); gpio_set_level(GPIO_AC_PRESENT, 0); wait_charging_state(); TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL); + ccprintf("Pass.\n"); - /* Replug AC. Sustainer gets re-activated. */ + ccprintf("Test replug AC.\n"); gpio_set_level(GPIO_AC_PRESENT, 1); wait_charging_state(); TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE); + ccprintf("Pass.\n"); - /* lower < SoC < upper */ + ccprintf("Test lower < SoC < upper.\n"); display_soc = 799; wait_charging_state(); TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_IDLE); + ccprintf("Pass.\n"); - /* SoC < lower < upper */ + ccprintf("Test SoC < lower < upper.\n"); display_soc = 789; wait_charging_state(); TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL); + ccprintf("Pass.\n"); + + ccprintf("Test disable sustainer.\n"); + charge_control(CHARGE_CONTROL_NORMAL); + display_soc = 810; + wait_charging_state(); + TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL); + ccprintf("Pass.\n"); - /* Disable sustainer */ + ccprintf("Test enable sustainer when battery is full.\n"); + display_soc = 1000; + is_full = 1; + wait_charging_state(); + /* Enable sustainer. */ p.cmd = EC_CHARGE_CONTROL_CMD_SET; p.mode = CHARGE_CONTROL_NORMAL; - p.sustain_soc.lower = -1; - p.sustain_soc.upper = -1; + p.sustain_soc.lower = 79; + p.sustain_soc.upper = 80; rv = test_send_host_command(EC_CMD_CHARGE_CONTROL, 2, &p, sizeof(p), NULL, 0); TEST_ASSERT(rv == EC_RES_SUCCESS); + wait_charging_state(); + TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE); + ccprintf("Pass.\n"); - /* This time, mode will stay in NORMAL even when upper < SoC. */ + /* Disable sustainer, unplug AC, upper < SoC < 100. */ + charge_control(CHARGE_CONTROL_NORMAL); display_soc = 810; + is_full = 0; + gpio_set_level(GPIO_AC_PRESENT, 0); wait_charging_state(); - TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL); + + ccprintf("Test enable sustainer when AC is present.\n"); + gpio_set_level(GPIO_AC_PRESENT, 1); + wait_charging_state(); + /* Enable sustainer. */ + p.cmd = EC_CHARGE_CONTROL_CMD_SET; + p.mode = CHARGE_CONTROL_NORMAL; + p.sustain_soc.lower = 79; + p.sustain_soc.upper = 80; + rv = test_send_host_command(EC_CMD_CHARGE_CONTROL, 2, + &p, sizeof(p), NULL, 0); + TEST_ASSERT(rv == EC_RES_SUCCESS); + wait_charging_state(); + TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE); + ccprintf("Pass.\n"); return EC_SUCCESS; } -- cgit v1.2.1