diff options
author | Vic Yang <victoryang@chromium.org> | 2012-08-06 22:12:38 +0800 |
---|---|---|
committer | Vic Yang <victoryang@chromium.org> | 2012-08-07 19:16:10 -0700 |
commit | 31141f2218540e87d01d5834a29ffff3b3c76255 (patch) | |
tree | 3c61d5556c6f34f437c6a246a60a894160337ce2 | |
parent | 94052196a38c1079c4bd9d1297bc04e67ec360a4 (diff) | |
download | chrome-ec-31141f2218540e87d01d5834a29ffff3b3c76255.tar.gz |
Periodically set power LED
It is possible that power LED goes off while AC still connected. Let's
set power LED periodically to aviod this problem.
BUG=chrome-os-partner:10386
TEST=Disconnect power LED while leave AC connected. Check LED goes off.
Connect LED again and check it comes back after few seconds.
Original-Change-Id: I2a199446be5da772af8027b735b9f431f697bacd
Reviewed-on: https://gerrit.chromium.org/gerrit/29403
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Commit-Ready: Vic Yang <victoryang@chromium.org>
Tested-by: Vic Yang <victoryang@chromium.org>
(cherry picked from commit 687bd2cf395023e63e251a81ea21984671f31146)
Change-Id: I73d6ed05f26a958b6870f340c75548b3063551c8
Reviewed-on: https://gerrit.chromium.org/gerrit/29567
Reviewed-by: Vic Yang <victoryang@chromium.org>
Tested-by: Vic Yang <victoryang@chromium.org>
-rw-r--r-- | common/charge_state.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/common/charge_state.c b/common/charge_state.c index df00470484..d43e5a9fa5 100644 --- a/common/charge_state.c +++ b/common/charge_state.c @@ -30,6 +30,9 @@ /* Voltage debounce time */ #define DEBOUNCE_TIME (10 * SECOND) +/* Time period between setting power LED */ +#define SET_LED_PERIOD (10 * SECOND) + static const char * const state_name[] = POWER_STATE_NAME_TABLE; static int state_machine_force_idle = 0; @@ -549,6 +552,7 @@ void charge_state_machine_task(void) uint8_t batt_flags; enum powerled_color led_color = POWERLED_OFF; int rv_setled = 0; + uint64_t last_setled_time = 0; ctx->prev.state = PWR_STATE_INIT; ctx->curr.state = PWR_STATE_INIT; @@ -615,6 +619,7 @@ void charge_state_machine_task(void) /* Charge done */ led_color = POWERLED_GREEN; rv_setled = powerled_set(POWERLED_GREEN); + last_setled_time = get_time().val; sleep_usec = POLL_PERIOD_LONG; break; @@ -634,6 +639,7 @@ void charge_state_machine_task(void) /* Charging */ led_color = POWERLED_YELLOW; rv_setled = powerled_set(POWERLED_YELLOW); + last_setled_time = get_time().val; sleep_usec = POLL_PERIOD_CHARGE; break; @@ -641,6 +647,7 @@ void charge_state_machine_task(void) /* Error */ led_color = POWERLED_RED; rv_setled = powerled_set(POWERLED_RED); + last_setled_time = get_time().val; sleep_usec = POLL_PERIOD_CHARGE; break; @@ -648,8 +655,16 @@ void charge_state_machine_task(void) /* Don't change sleep duration */ if (state_machine_force_idle) powerled_set(force_idle_led_blink()); - else if (rv_setled) + else if (rv_setled || get_time().val - last_setled_time + > SET_LED_PERIOD) { + /* + * It is possible to make power LED go off + * without disconnecting AC. Therefore we + * need to reset power LED periodically. + */ rv_setled = powerled_set(led_color); + last_setled_time = get_time().val; + } break; default: /* Other state; poll quickly and hope it goes away */ |