summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-08-30 22:13:15 +0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-09-04 20:32:33 +0000
commit4bdfc7eb7b427a77b21779933831fd5e66d4772a (patch)
tree93cf858e1732ecca6a34386d8dd12d9e88e225d2
parent2270f2bb03c2031bad455ba5f8179a9d99cc3999 (diff)
downloadchrome-ec-4bdfc7eb7b427a77b21779933831fd5e66d4772a.tar.gz
Add more charge state machine test
This includes: - Charge mode control host command - Low battery shutdown/hibernate Also, speed up the test by 20x since we now need to wait for more than 30 seconds for low battery state test. BUG=chrome-os-partner:19236 TEST=Pass the test BRANCH=None Change-Id: If2e91a33f3a80f58da01a6c3da128cb603101dea Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/167613 Reviewed-by: Rong Chang <rongchang@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--test/build.mk1
-rw-r--r--test/sbs_charging.c124
-rw-r--r--test/test_config.h2
3 files changed, 127 insertions, 0 deletions
diff --git a/test/build.mk b/test/build.mk
index 2013e9a68f..72071a478c 100644
--- a/test/build.mk
+++ b/test/build.mk
@@ -47,6 +47,7 @@ pingpong-y=pingpong.o
power_button-y=power_button.o
powerdemo-y=powerdemo.o
queue-y=queue.o
+sbs_charging-scale=20
sbs_charging-y=sbs_charging.o
stress-y=stress.o
system-y=system.o
diff --git a/test/sbs_charging.c b/test/sbs_charging.c
index ef2337997e..b9add7ee63 100644
--- a/test/sbs_charging.c
+++ b/test/sbs_charging.c
@@ -9,6 +9,9 @@
#include "charge_state.h"
#include "chipset.h"
#include "common.h"
+#include "ec_commands.h"
+#include "hooks.h"
+#include "host_command.h"
#include "smart_battery.h"
#include "task.h"
#include "test_util.h"
@@ -19,6 +22,8 @@
static int mock_ac_present = 1;
static int mock_chipset_state = CHIPSET_STATE_ON;
static int is_shutdown;
+static int is_force_discharge;
+static int is_hibernated;
/* Mock GPIOs */
int gpio_get_level(enum gpio_signal signal)
@@ -38,6 +43,17 @@ int chipset_in_state(int state_mask)
return state_mask & mock_chipset_state;
}
+int board_discharge_on_ac(int enabled)
+{
+ is_force_discharge = enabled;
+ return EC_SUCCESS;
+}
+
+void system_hibernate(int sec, int usec)
+{
+ is_hibernated = 1;
+}
+
/* Setup init condition */
static void test_setup(void)
{
@@ -68,6 +84,14 @@ static int wait_charging_state(void)
return state;
}
+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,
+ sizeof(params), NULL, 0);
+}
+
static int test_charge_state(void)
{
enum power_state state;
@@ -98,6 +122,104 @@ static int test_charge_state(void)
state = wait_charging_state();
TEST_ASSERT(is_shutdown);
TEST_ASSERT(state == PWR_STATE_DISCHARGE);
+ sb_write(SB_TEMPERATURE, CELSIUS_TO_DECI_KELVIN(40));
+
+ /* Force idle */
+ ccprintf("[CHARGING TEST] AC on, force idle\n");
+ mock_ac_present = 1;
+ sb_write(SB_CURRENT, 1000);
+ state = wait_charging_state();
+ TEST_ASSERT(state == PWR_STATE_CHARGE);
+ charge_control(CHARGE_CONTROL_IDLE);
+ state = wait_charging_state();
+ TEST_ASSERT(state == PWR_STATE_IDLE);
+ charge_control(CHARGE_CONTROL_NORMAL);
+ state = wait_charging_state();
+ TEST_ASSERT(state == PWR_STATE_CHARGE);
+
+ /* Force discharge */
+ ccprintf("[CHARGING TEST] AC on, force discharge\n");
+ mock_ac_present = 1;
+ sb_write(SB_CURRENT, 1000);
+ charge_control(CHARGE_CONTROL_DISCHARGE);
+ state = wait_charging_state();
+ TEST_ASSERT(state == PWR_STATE_IDLE);
+ TEST_ASSERT(is_force_discharge);
+ charge_control(CHARGE_CONTROL_NORMAL);
+ state = wait_charging_state();
+ TEST_ASSERT(state == PWR_STATE_CHARGE);
+ TEST_ASSERT(!is_force_discharge);
+
+ return EC_SUCCESS;
+}
+
+static int test_low_battery(void)
+{
+ ccprintf("[CHARGING TEST] Low battery with AC\n");
+ mock_ac_present = 1;
+ is_hibernated = 0;
+ sb_write(SB_CURRENT, 1000);
+ sb_write(SB_RELATIVE_STATE_OF_CHARGE, 2);
+ wait_charging_state();
+ mock_chipset_state = CHIPSET_STATE_SOFT_OFF;
+ hook_notify(HOOK_CHIPSET_SHUTDOWN);
+ TEST_ASSERT(!is_hibernated);
+
+ ccprintf("[CHARGING TEST] Low battery shutdown S0->S5\n");
+ mock_chipset_state = CHIPSET_STATE_ON;
+ hook_notify(HOOK_CHIPSET_PRE_INIT);
+ hook_notify(HOOK_CHIPSET_STARTUP);
+ mock_ac_present = 0;
+ is_hibernated = 0;
+ sb_write(SB_CURRENT, -1000);
+ sb_write(SB_RELATIVE_STATE_OF_CHARGE, 2);
+ wait_charging_state();
+ mock_chipset_state = CHIPSET_STATE_SOFT_OFF;
+ hook_notify(HOOK_CHIPSET_SHUTDOWN);
+ TEST_ASSERT(is_hibernated);
+
+ ccprintf("[CHARGING TEST] Low battery shutdown S5\n");
+ is_hibernated = 0;
+ sb_write(SB_RELATIVE_STATE_OF_CHARGE, 10);
+ wait_charging_state();
+ sb_write(SB_RELATIVE_STATE_OF_CHARGE, 2);
+ wait_charging_state();
+ TEST_ASSERT(is_hibernated);
+
+ ccprintf("[CHARGING TEST] Low battery AP shutdown\n");
+ is_shutdown = 0;
+ mock_chipset_state = CHIPSET_STATE_ON;
+ sb_write(SB_RELATIVE_STATE_OF_CHARGE, 10);
+ mock_ac_present = 1;
+ sb_write(SB_CURRENT, 1000);
+ wait_charging_state();
+ mock_ac_present = 0;
+ sb_write(SB_CURRENT, -1000);
+ sb_write(SB_RELATIVE_STATE_OF_CHARGE, 2);
+ wait_charging_state();
+ usleep(32 * SECOND);
+ wait_charging_state();
+ TEST_ASSERT(is_shutdown);
+
+ return EC_SUCCESS;
+}
+
+static int test_batt_fake(void)
+{
+ ccprintf("[CHARGING TEST] Fake battery command\n");
+ mock_chipset_state = CHIPSET_STATE_ON;
+ hook_notify(HOOK_CHIPSET_PRE_INIT);
+ hook_notify(HOOK_CHIPSET_STARTUP);
+ mock_ac_present = 0;
+ is_hibernated = 0;
+ sb_write(SB_CURRENT, -1000);
+ sb_write(SB_RELATIVE_STATE_OF_CHARGE, 30);
+ wait_charging_state();
+ UART_INJECT("battfake 2\n");
+ msleep(50);
+ mock_chipset_state = CHIPSET_STATE_SOFT_OFF;
+ hook_notify(HOOK_CHIPSET_SHUTDOWN);
+ TEST_ASSERT(is_hibernated);
return EC_SUCCESS;
}
@@ -107,6 +229,8 @@ void run_test(void)
test_setup();
RUN_TEST(test_charge_state);
+ RUN_TEST(test_low_battery);
+ RUN_TEST(test_batt_fake);
test_print_result();
}
diff --git a/test/test_config.h b/test/test_config.h
index 620a9dc096..21c4d64a57 100644
--- a/test/test_config.h
+++ b/test/test_config.h
@@ -17,6 +17,8 @@
#define CONFIG_BATTERY_MOCK
#define CONFIG_CHARGER
#define CONFIG_CHARGER_INPUT_CURRENT 4032
+#define CONFIG_CHARGER_DISCHARGE_ON_AC
+int board_discharge_on_ac(int enabled);
#endif
#ifdef TEST_adapter