summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Parker <dparker@chromium.org>2013-06-21 18:31:08 -0700
committerChromeBot <chrome-bot@google.com>2013-06-24 14:04:04 -0700
commit3c7ad4f267964b64edebb627099bda7327871591 (patch)
tree0fafa7226909dcb6c4bc55c442519a2f4ae0ae0f
parent8a66ae3182268d51fe616a71148ccf0091f8005d (diff)
downloadchrome-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.h1
-rw-r--r--common/build.mk1
-rw-r--r--common/led_peppy.c97
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);
+