diff options
author | Vic Yang <victoryang@chromium.org> | 2012-07-18 13:25:26 +0800 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2012-07-18 22:36:42 -0700 |
commit | c51466d0d07aa065ae8eaeb9f271e8838cddd534 (patch) | |
tree | 8b1c90cf1f0ea8aacd5df52182a03f5ba122824d | |
parent | 35c349cca3a53d30cdc98839ece6decd0a001f8a (diff) | |
download | chrome-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.c | 18 | ||||
-rw-r--r-- | include/ec_commands.h | 4 | ||||
-rw-r--r-- | util/ectool.c | 22 |
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; } |