summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2013-02-12 16:48:00 -0800
committerRandall Spangler <rspangler@chromium.org>2013-03-05 15:15:56 -0800
commitd1d639d97092fc02fe8402596efc9fdea1399ad2 (patch)
treedda842ef1b6048517d514e5fb06b96f790145036
parent0046e5fcd3bf7586aec78ec60818b356c79ed4ac (diff)
downloadchrome-ec-d1d639d97092fc02fe8402596efc9fdea1399ad2.tar.gz
Add console command to fake battery state of charge
The new 'battfake' command is really handy for testing low-battery shutdown logic. BUG=chrome-os-partner:17124 BRANCH=link TEST=from EC console: reboot battfake -> using real battery level power on system -> lightbar should be blue battfake 5 lightbar turns red after a few seconds UI shows battery is very low (shows <5% due to different kernel math) 'ectool battery' from root shell shows present capacity ~5% of design capacity remove AC power battfake 4 UI shows low-battery screen and shuts down (may take a minute) battfake 50 power on system UI shows battery at 45-55% battfake 2 -> system shuts down immediately battfake -1 power on system UI shows actual battery level Original-Change-Id: I3180e321241c0f586f3baad2150fb6a2b2d2e242 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/43151 Reviewed-by: Bill Richardson <wfrichar@chromium.org> (cherry picked from commit 695289cfe6724ad349a96d1f36ddf036b3df5daa) Conflicts: common/charge_state.c Change-Id: I95b020d1a747bafed0351d982eac1d314ea22301 Reviewed-on: https://gerrit.chromium.org/gerrit/44688 Commit-Queue: Randall Spangler <rspangler@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org> Tested-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--common/charge_state.c74
-rw-r--r--include/charge_state.h7
2 files changed, 60 insertions, 21 deletions
diff --git a/common/charge_state.c b/common/charge_state.c
index ddf11f6c7e..da5f19c6ed 100644
--- a/common/charge_state.c
+++ b/common/charge_state.c
@@ -41,6 +41,8 @@ static int state_machine_force_idle = 0;
static unsigned user_current_limit = -1U;
+static int fake_state_of_charge = -1;
+
/* Current power state context */
static struct power_state_context task_ctx;
@@ -217,16 +219,15 @@ static int state_common(struct power_state_context *ctx)
*ctx->memmap_batt_rate = batt->current < 0 ?
-batt->current : batt->current;
- rv = battery_desired_voltage(&batt->desired_voltage);
- if (rv)
+ if (battery_desired_voltage(&batt->desired_voltage))
curr->error |= F_DESIRED_VOLTAGE;
- rv = battery_desired_current(&batt->desired_current);
- if (rv)
+ if (battery_desired_current(&batt->desired_current))
curr->error |= F_DESIRED_CURRENT;
- rv = battery_state_of_charge(&batt->state_of_charge);
- if (rv)
+ if (fake_state_of_charge >= 0)
+ batt->state_of_charge = fake_state_of_charge;
+ else if (battery_state_of_charge(&batt->state_of_charge))
curr->error |= F_BATTERY_STATE_OF_CHARGE;
if (batt->state_of_charge != prev->batt.state_of_charge) {
@@ -281,22 +282,21 @@ static int state_common(struct power_state_context *ctx)
if (batt->desired_current > user_current_limit)
batt->desired_current = user_current_limit;
- rv = battery_get_battery_mode(&d);
- if (rv) {
+ if (battery_get_battery_mode(&d)) {
curr->error |= F_BATTERY_MODE;
- } else {
- if (d & MODE_CAPACITY) {
- /* Battery capacity mode was set to mW
- * reset it back to mAh
- */
- d &= ~MODE_CAPACITY;
- rv = battery_set_battery_mode(d);
- if (rv)
- ctx->curr.error |= F_BATTERY_MODE;
- }
+ } else if (d & MODE_CAPACITY) {
+ /* Battery capacity mode was set to mW reset it back to mAh */
+ d &= ~MODE_CAPACITY;
+ rv = battery_set_battery_mode(d);
+ if (rv)
+ ctx->curr.error |= F_BATTERY_MODE;
}
- rv = battery_remaining_capacity(&d);
- if (rv)
+
+ if (fake_state_of_charge >= 0)
+ *ctx->memmap_batt_cap =
+ fake_state_of_charge *
+ *(int *)host_get_memmap(EC_MEMMAP_BATT_LFCC) / 100;
+ else if (battery_remaining_capacity(&d))
ctx->curr.error |= F_BATTERY_CAPACITY;
else
*ctx->memmap_batt_cap = d;
@@ -568,6 +568,12 @@ int charge_get_percent(void)
return task_ctx.curr.batt.state_of_charge;
}
+int charge_want_shutdown(void)
+{
+ return (charge_get_state() == PWR_STATE_DISCHARGE) &&
+ charge_get_percent() < BATTERY_LEVEL_SHUTDOWN;
+}
+
static int enter_force_idle_mode(void)
{
if (!power_ac_present())
@@ -860,3 +866,31 @@ static int charge_command_current_limit(struct host_cmd_handler_args *args)
}
DECLARE_HOST_COMMAND(EC_CMD_CHARGE_CURRENT_LIMIT, charge_command_current_limit,
EC_VER_MASK(0));
+
+/*****************************************************************************/
+/* Console commands */
+
+static int command_battfake(int argc, char **argv)
+{
+ char *e;
+ int v;
+
+ if (argc == 2) {
+ v = strtoi(argv[1], &e, 0);
+ if (*e || v < -1 || v > 100)
+ return EC_ERROR_PARAM1;
+
+ fake_state_of_charge = v;
+ }
+
+ if (fake_state_of_charge < 0)
+ ccprintf("Reporting real battery level\n");
+ else
+ ccprintf("Reporting fake battery level %d%%\n",
+ fake_state_of_charge);
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(battfake, command_battfake,
+ "percent (-1 = use real level)",
+ "Set fake battery level",
+ NULL);
diff --git a/include/charge_state.h b/include/charge_state.h
index eda78abfd9..455426f1ed 100644
--- a/include/charge_state.h
+++ b/include/charge_state.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+/* Copyright (c) 2013 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.
*
@@ -134,5 +134,10 @@ enum power_state charge_get_state(void);
*/
int charge_get_percent(void);
+/**
+ * Return non-zero if discharging and battery so low we should shut down.
+ */
+int charge_want_shutdown(void);
+
#endif /* __CROS_EC_CHARGE_STATE_H */