diff options
author | Dave Parker <dparker@chromium.org> | 2013-06-21 18:31:08 -0700 |
---|---|---|
committer | ChromeBot <chrome-bot@google.com> | 2013-06-24 14:04:04 -0700 |
commit | 3c7ad4f267964b64edebb627099bda7327871591 (patch) | |
tree | 0fafa7226909dcb6c4bc55c442519a2f4ae0ae0f | |
parent | 8a66ae3182268d51fe616a71148ccf0091f8005d (diff) | |
download | chrome-ec-3c7ad4f267964b64edebb627099bda7327871591.tar.gz |
Power and battery LED control for Peppy.
BUG=chrome-os-partner:20328
BRANCH=peppy
TEST=manual and constrained by hw issues.
Change-Id: I7df19ad410ef2a85c170980150bf226a7407642e
Signed-off-by: Dave Parker <dparker@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/59663
Reviewed-by: Shawn Nematbakhsh <shawnn@chromium.org>
-rw-r--r-- | board/peppy/board.h | 1 | ||||
-rw-r--r-- | common/build.mk | 1 | ||||
-rw-r--r-- | common/led_peppy.c | 97 |
3 files changed, 99 insertions, 0 deletions
diff --git a/board/peppy/board.h b/board/peppy/board.h index d77f2d3990..56af4a08a9 100644 --- a/board/peppy/board.h +++ b/board/peppy/board.h @@ -27,6 +27,7 @@ #ifdef HAS_TASK_KEYPROTO #define CONFIG_KEYBOARD_PROTOCOL_8042 #endif +#define CONFIG_LED_PEPPY #define CONFIG_LID_SWITCH #define CONFIG_LPC #define CONFIG_PECI diff --git a/common/build.mk b/common/build.mk index f4dc6e95aa..694dbdafa3 100644 --- a/common/build.mk +++ b/common/build.mk @@ -37,6 +37,7 @@ common-$(CONFIG_KEYBOARD_PROTOCOL_8042)+=keyboard_8042.o common-$(CONFIG_KEYBOARD_PROTOCOL_MKBP)+=keyboard_mkbp.o common-$(CONFIG_KEYBOARD_TEST)+=keyboard_test.o common-$(CONFIG_LED_FALCO)+=led_falco.o +common-$(CONFIG_LED_PEPPY)+=led_peppy.o common-$(CONFIG_LID_SWITCH)+=lid_switch.o common-$(CONFIG_LP5562)+=lp5562.o lp5562_battery_led.o common-$(CONFIG_LPC)+=port80.o diff --git a/common/led_peppy.c b/common/led_peppy.c new file mode 100644 index 0000000000..b6d3afd906 --- /dev/null +++ b/common/led_peppy.c @@ -0,0 +1,97 @@ +/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * Power and battery LED control for Peppy. + */ + +#include "battery.h" +#include "board.h" +#include "charge_state.h" +#include "chipset.h" +#include "gpio.h" +#include "hooks.h" + +#define LED_TOTAL_TICKS 16 +#define LED_ON_TICKS 4 + +enum led_color { + LED_OFF = 0, + LED_BLUE, + LED_AMBER, + LED_COLOR_COUNT /* Number of colors, not a color itself */ +}; + +static int led_set_color(enum led_color color, enum gpio_signal gpio_led_blue_l, + enum gpio_signal gpio_led_amber_l) +{ + switch (color) { + case LED_OFF: + gpio_set_level(gpio_led_blue_l, 1); + gpio_set_level(gpio_led_amber_l, 1); + break; + case LED_BLUE: + gpio_set_level(gpio_led_blue_l, 0); + gpio_set_level(gpio_led_amber_l, 1); + break; + case LED_AMBER: + gpio_set_level(gpio_led_blue_l, 1); + gpio_set_level(gpio_led_amber_l, 0); + break; + default: + return EC_ERROR_UNKNOWN; + } + return EC_SUCCESS; +} + +static int bat_led_set_color(enum led_color color) +{ + return led_set_color(color, GPIO_BAT_LED0_L, GPIO_BAT_LED1_L); +} + +static int pwr_led_set_color(enum led_color color) +{ + return led_set_color(color, GPIO_PWR_LED0_L, GPIO_PWR_LED1_L); +} + +/* Called by hook task every 250mSec */ +static void led_tick(void) +{ + static int ticks; + uint32_t chflags = charge_get_flags(); + + ticks++; + + if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) + pwr_led_set_color(LED_OFF); + else if (chipset_in_state(CHIPSET_STATE_ON)) + pwr_led_set_color(LED_BLUE); + else if (chipset_in_state(CHIPSET_STATE_SUSPEND)) + /* Blink once every four seconds. */ + pwr_led_set_color((ticks % LED_TOTAL_TICKS < LED_ON_TICKS) ? + LED_AMBER : LED_OFF); + + switch (charge_get_state()) { + case PWR_STATE_CHARGE: + case PWR_STATE_CHARGE_NEAR_FULL: + bat_led_set_color(LED_AMBER); + break; + case PWR_STATE_DISCHARGE: + bat_led_set_color(LED_OFF); + break; + case PWR_STATE_ERROR: + bat_led_set_color((ticks & 0x2) ? LED_AMBER : LED_OFF); + break; + case PWR_STATE_IDLE: /* External power connected in IDLE state. */ + if (chflags & CHARGE_FLAG_FORCE_IDLE) + bat_led_set_color((ticks & 0x4) ? LED_BLUE : LED_OFF); + else + bat_led_set_color(LED_BLUE); + break; + default: + /* Other states don't alter LED behavior */ + break; + } +} +DECLARE_HOOK(HOOK_TICK, led_tick, HOOK_PRIO_DEFAULT); + |