summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2012-07-18 13:25:26 +0800
committerGerrit <chrome-bot@google.com>2012-07-18 22:36:42 -0700
commitc51466d0d07aa065ae8eaeb9f271e8838cddd534 (patch)
tree8b1c90cf1f0ea8aacd5df52182a03f5ba122824d
parent35c349cca3a53d30cdc98839ece6decd0a001f8a (diff)
downloadchrome-ec-c51466d0d07aa065ae8eaeb9f271e8838cddd534.tar.gz
Add host command to exit force idle charge state
Currently the only way to exit force idle state is to unplug AC power. Let's add a host command to do so. Signed-off-by: Vic Yang <victoryang@chromium.org> BUG=chrome-os-partner:9716 TEST=# ectool chargeforceidle 0 - Check nothing happened # ectool chargeforceidle 1 - Power LED blinking green. Check current = 0. # ectool chargeforceidle 0 - Power LED back to yellow. Check charging. Change-Id: Ia8f504b6cf9f42b7d57af3ce2d240f3b00a095f1 Reviewed-on: https://gerrit.chromium.org/gerrit/27768 Reviewed-by: Randall Spangler <rspangler@chromium.org> Tested-by: Vic Yang <victoryang@chromium.org> Commit-Ready: Vic Yang <victoryang@chromium.org>
-rw-r--r--common/charge_state.c18
-rw-r--r--include/ec_commands.h4
-rw-r--r--util/ectool.c22
3 files changed, 41 insertions, 3 deletions
diff --git a/common/charge_state.c b/common/charge_state.c
index ef54d71b70..62b8d399f6 100644
--- a/common/charge_state.c
+++ b/common/charge_state.c
@@ -519,6 +519,12 @@ static int enter_force_idle_mode(void)
return EC_SUCCESS;
}
+static int exit_force_idle_mode(void)
+{
+ state_machine_force_idle = 0;
+ return EC_SUCCESS;
+}
+
/* Battery charging task */
void charge_state_machine_task(void)
{
@@ -642,9 +648,19 @@ void charge_state_machine_task(void)
static int charge_command_force_idle(struct host_cmd_handler_args *args)
{
+ const struct ec_params_force_idle *p =
+ (const struct ec_params_force_idle *)args->params;
+ int rv;
+
if (system_is_locked())
return EC_RES_ACCESS_DENIED;
- if (enter_force_idle_mode() != EC_SUCCESS)
+
+ if (p->enabled)
+ rv = enter_force_idle_mode();
+ else
+ rv = exit_force_idle_mode();
+
+ if (rv != EC_SUCCESS)
return EC_RES_ERROR;
return EC_RES_SUCCESS;
}
diff --git a/include/ec_commands.h b/include/ec_commands.h
index 819151aa14..6c64aeef1d 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -863,6 +863,10 @@ struct ec_params_i2c_write {
/* Force charge state machine to stop in idle mode */
#define EC_CMD_CHARGE_FORCE_IDLE 0x96
+struct ec_params_force_idle {
+ uint8_t enabled;
+} __packed;
+
/*****************************************************************************/
/* System commands */
diff --git a/util/ectool.c b/util/ectool.c
index 0cb9825c06..fc43c94fd0 100644
--- a/util/ectool.c
+++ b/util/ectool.c
@@ -1743,13 +1743,31 @@ int cmd_lcd_backlight(int argc, char *argv[])
int cmd_charge_force_idle(int argc, char *argv[])
{
- int rv = ec_command(EC_CMD_CHARGE_FORCE_IDLE, 0, NULL, 0, NULL, 0);
+ struct ec_params_force_idle p;
+ int rv;
+ char *e;
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s <0|1>\n", argv[0]);
+ return -1;
+ }
+
+ p.enabled = strtol(argv[1], &e, 0);
+ if (e && *e) {
+ fprintf(stderr, "Bad value.\n");
+ return -1;
+ }
+
+ rv = ec_command(EC_CMD_CHARGE_FORCE_IDLE, 0, &p, sizeof(p), NULL, 0);
if (rv < 0) {
fprintf(stderr, "Is AC connected?\n");
return rv;
}
- printf("Charge state machine force idle.\n");
+ if (p.enabled)
+ printf("Charge state machine force idle.\n");
+ else
+ printf("Charge state machine normal mode.\n");
return 0;
}