diff options
author | Henry Hsu <Henry.Hsu@quantatw.com> | 2014-02-17 15:36:31 +0800 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-02-20 05:39:23 +0000 |
commit | e1006840ab5de34eaf6016e462e6e4642aa418c7 (patch) | |
tree | 27604ec0f0718cde453ce7e292f707df976d7f24 | |
parent | 716be1dff2e6762e380d7a4eb54c06ac95352710 (diff) | |
download | chrome-ec-e1006840ab5de34eaf6016e462e6e4642aa418c7.tar.gz |
Glimmer: Implement the breathing led when suspend
The breathing led is gradual on in 1 second, gradual off in 1
second, and off for 3 seconds when system suspend.
BUG=chrome-os-partner:24647
BRANCH=glimmer
TEST=use command powerd_dbus_suspend, the led breathes normally.
Change-Id: I2c5d018ca2765eab4f86ddf7d1617edd4f955b5b
Signed-off-by: Henry Hsu <Henry.Hsu@quantatw.com>
Reviewed-on: https://chromium-review.googlesource.com/186850
Reviewed-by: Dave Parker <dparker@chromium.org>
-rw-r--r-- | board/glimmer/board.h | 1 | ||||
-rw-r--r-- | board/glimmer/led.c | 44 |
2 files changed, 43 insertions, 2 deletions
diff --git a/board/glimmer/board.h b/board/glimmer/board.h index dc2dfdda1f..c7897b5e18 100644 --- a/board/glimmer/board.h +++ b/board/glimmer/board.h @@ -39,6 +39,7 @@ #define CONFIG_POWER_BUTTON_IGNORE_LID #define CONFIG_POWER_BUTTON_X86 #define CONFIG_PWM +#define CONFIG_PWM_DSLEEP #define CONFIG_SCI_GPIO GPIO_PCH_SCI_L #define CONFIG_TEMP_SENSOR #define CONFIG_TEMP_SENSOR_TMP432 diff --git a/board/glimmer/led.c b/board/glimmer/led.c index e3414bc5ff..e28d9bdf69 100644 --- a/board/glimmer/led.c +++ b/board/glimmer/led.c @@ -14,9 +14,14 @@ #include "pwm.h" #include "util.h" +#define TICKS_STEP1_BRIGHTER 0 +#define TICKS_STEP2_DIMMER 20 +#define TICKS_STEP3_OFF 40 + const enum ec_led_id supported_led_ids[] = {EC_LED_ID_POWER_LED}; const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); static int ac_in_blink_times; +static int ticks; enum led_color { LED_OFF = 0, @@ -68,6 +73,41 @@ static void ac_in_blink(void) } DECLARE_HOOK(HOOK_AC_CHANGE, ac_in_blink, HOOK_PRIO_DEFAULT); +static void suspend_led_update(void) +{ + int delay = 50 * MSEC; + + ticks++; + + /* 1s gradual on, 1s gradual off, 3s off */ + if (ticks <= TICKS_STEP2_DIMMER) { + pwm_set_duty(PWM_CH_LED_RED, ticks*5); + } else if (ticks <= TICKS_STEP3_OFF) { + pwm_set_duty(PWM_CH_LED_RED, (TICKS_STEP3_OFF - ticks)*5); + } else { + ticks = TICKS_STEP1_BRIGHTER; + delay = 3000 * MSEC; + } + + hook_call_deferred(suspend_led_update, delay); +} +DECLARE_DEFERRED(suspend_led_update); + +static void suspend_led_init(void) +{ + ticks = TICKS_STEP2_DIMMER; + + hook_call_deferred(suspend_led_update, 0); +} +DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, suspend_led_init, HOOK_PRIO_DEFAULT); + +static void suspend_led_deinit(void) +{ + hook_call_deferred(suspend_led_update, -1); +} +DECLARE_HOOK(HOOK_CHIPSET_RESUME, suspend_led_deinit, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, suspend_led_deinit, HOOK_PRIO_DEFAULT); + /** * Called by hook task every 250 ms */ @@ -87,8 +127,8 @@ static void led_tick(void) /* If suspended, breathe the led */ if (chipset_in_state(CHIPSET_STATE_SUSPEND)) { - set_color(LED_OFF); - /* TODO keep led off now, will to be done in next CL */ + + /* Kept no function, use defered function instead. */ return; } |