diff options
author | Bill Richardson <wfrichar@chromium.org> | 2014-03-26 16:56:38 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-04-01 21:37:32 +0000 |
commit | 9f40d3f90e7373b96256033b3ec7b4b8e5140881 (patch) | |
tree | bb2f4dc8742f869667938f8ee7a2ad4fb9cb38f8 /test/battery_get_params_smart.c | |
parent | 71766a39262b6ed4fec51cba19f10c6bec7e9f19 (diff) | |
download | chrome-ec-9f40d3f90e7373b96256033b3ec7b4b8e5140881.tar.gz |
Add charge_state_v2 algorithm for use by Samus
This is a complete rewrite of the charge_state task used by x86 platforms.
Rather than having a bunch of state-specific functions, each with their own
error handling and special cases, this is organized like so:
Forever:
1. Read everything we can from the battery and charger.
2. Figure out what we'd like to do (including error handling).
3. Allow for customization to override that.
4. Do it.
Things I need to file bugs for are marked with "TODO(wfrichar)". I'll file
the bugs after this CL goes in, so that they'll have something relevant to
refer to.
BUG=chrome-os-partner:20881
BRANCH=ToT
TEST=manual
make buildall -j
Try it on Samus, watch it charge from nearly empty to full, both with and
without fastcharge enabled.
Also undefine CONFIG_BATTERY_PRESENT_CUSTOM, plug and unplug the battery to
be sure the trickle charging logic is correct when it can't tell if the
battery is present.
Change-Id: I3935cd3b87f322eb52178f8a675a886c16b75d58
Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/191767
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'test/battery_get_params_smart.c')
-rw-r--r-- | test/battery_get_params_smart.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/test/battery_get_params_smart.c b/test/battery_get_params_smart.c new file mode 100644 index 0000000000..7c86252b23 --- /dev/null +++ b/test/battery_get_params_smart.c @@ -0,0 +1,87 @@ +/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * Test the logic of battery_get_params() to be sure it sets the correct flags + * when i2c reads fail. + */ + +#include "battery.h" +#include "battery_smart.h" +#include "common.h" +#include "console.h" +#include "i2c.h" +#include "test_util.h" +#include "util.h" + +/* Test state */ +static int fail_on_first, fail_on_last; +static int read_count, write_count; +struct batt_params batt; + +static void reset_and_fail_on(int first, int last) +{ + /* We're not initializing the fake battery, so everything reads zero */ + memset(&batt, 0, sizeof(typeof(batt))); + read_count = write_count = 0; + fail_on_first = first; + fail_on_last = last; +} + +/* Mocked functions */ +int sb_read(int cmd, int *param) +{ + read_count++; + if (read_count >= fail_on_first && read_count <= fail_on_last) + return EC_ERROR_UNKNOWN; + + return i2c_read16(I2C_PORT_BATTERY, BATTERY_ADDR, cmd, param); +} +int sb_write(int cmd, int param) +{ + write_count++; + return i2c_write16(I2C_PORT_BATTERY, BATTERY_ADDR, cmd, param); +} + + +/* Tests */ +static int test_param_failures(void) +{ + int i, num_reads; + + /* No failures */ + reset_and_fail_on(0, 0); + battery_get_params(&batt); + TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE); + TEST_ASSERT(!(batt.flags & BATT_FLAG_BAD_ANY)); + num_reads = read_count; + + /* Just a single failure */ + for (i = 1; i <= num_reads; i++) { + reset_and_fail_on(i, i); + battery_get_params(&batt); + TEST_ASSERT(batt.flags & BATT_FLAG_BAD_ANY); + TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE); + } + + /* Once it fails, it keeps failing */ + for (i = 1; i <= num_reads; i++) { + reset_and_fail_on(i, num_reads); + battery_get_params(&batt); + TEST_ASSERT(batt.flags & BATT_FLAG_BAD_ANY); + if (i == 1) + /* If every read fails, it's not responsive */ + TEST_ASSERT(!(batt.flags & BATT_FLAG_RESPONSIVE)); + else + TEST_ASSERT(batt.flags & BATT_FLAG_RESPONSIVE); + } + + return EC_SUCCESS; +} + +void run_test(void) +{ + RUN_TEST(test_param_failures); + + test_print_result(); +} |