summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2012-08-06 22:12:38 +0800
committerVic Yang <victoryang@chromium.org>2012-08-07 19:16:10 -0700
commit31141f2218540e87d01d5834a29ffff3b3c76255 (patch)
tree3c61d5556c6f34f437c6a246a60a894160337ce2
parent94052196a38c1079c4bd9d1297bc04e67ec360a4 (diff)
downloadchrome-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.c17
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 */