summaryrefslogtreecommitdiff
path: root/test/sbs_charging_v2.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/sbs_charging_v2.c')
-rw-r--r--test/sbs_charging_v2.c82
1 files changed, 81 insertions, 1 deletions
diff --git a/test/sbs_charging_v2.c b/test/sbs_charging_v2.c
index e266e59215..309624dd20 100644
--- a/test/sbs_charging_v2.c
+++ b/test/sbs_charging_v2.c
@@ -19,11 +19,14 @@
#define WAIT_CHARGER_TASK 600
#define BATTERY_DETACH_DELAY 35000
+enum ec_charge_control_mode get_chg_ctrl_mode(void);
+
static int mock_chipset_state = CHIPSET_STATE_ON;
static int is_shutdown;
static int is_force_discharge;
static int is_hibernated;
static int override_voltage, override_current, override_usec;
+static int display_soc;
/* The simulation doesn't really hibernate, so we must reset this ourselves */
extern timestamp_t shutdown_warning_time;
@@ -109,10 +112,15 @@ 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, &params,
+ return test_send_host_command(EC_CMD_CHARGE_CONTROL, 2, &params,
sizeof(params), NULL, 0);
}
+__override int charge_get_display_charge(void)
+{
+ return display_soc;
+}
+
/* Setup init condition */
static void test_setup(int on_ac)
{
@@ -676,7 +684,78 @@ static int test_low_battery_hostevents(void)
return EC_SUCCESS;
}
+static int test_battery_sustainer(void)
+{
+ struct ec_params_charge_control p;
+ struct ec_response_charge_control r;
+ int rv;
+
+ test_setup(1);
+
+ /* 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);
+
+ p.cmd = EC_CHARGE_CONTROL_CMD_GET;
+ rv = test_send_host_command(EC_CMD_CHARGE_CONTROL, 2,
+ &p, sizeof(p), &r, sizeof(r));
+ TEST_ASSERT(rv == EC_RES_SUCCESS);
+ TEST_ASSERT(r.sustain_soc.lower == 79);
+ TEST_ASSERT(r.sustain_soc.upper == 80);
+
+ /* Check mode transition as the SoC changes. */
+
+ /* SoC < lower < upper */
+ display_soc = 780;
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL);
+
+ /* lower < upper < SoC */
+ display_soc = 810;
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE);
+ /* Unplug AC. Sustainer gets deactivated. */
+ gpio_set_level(GPIO_AC_PRESENT, 0);
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL);
+
+ /* Replug AC. Sustainer gets re-activated. */
+ gpio_set_level(GPIO_AC_PRESENT, 1);
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE);
+
+ /* lower < SoC < upper */
+ display_soc = 799;
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_IDLE);
+
+ /* SoC < lower < upper */
+ display_soc = 789;
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL);
+
+ /* Disable sustainer */
+ p.cmd = EC_CHARGE_CONTROL_CMD_SET;
+ p.mode = CHARGE_CONTROL_NORMAL;
+ p.sustain_soc.lower = -1;
+ p.sustain_soc.upper = -1;
+ rv = test_send_host_command(EC_CMD_CHARGE_CONTROL, 2,
+ &p, sizeof(p), NULL, 0);
+ TEST_ASSERT(rv == EC_RES_SUCCESS);
+
+ /* This time, mode will stay in NORMAL even when upper < SoC. */
+ display_soc = 810;
+ wait_charging_state();
+ TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_NORMAL);
+
+ return EC_SUCCESS;
+}
void run_test(void)
{
@@ -687,6 +766,7 @@ void run_test(void)
RUN_TEST(test_hc_charge_state);
RUN_TEST(test_hc_current_limit);
RUN_TEST(test_low_battery_hostevents);
+ RUN_TEST(test_battery_sustainer);
test_print_result();
}