summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYilun Lin <yllin@google.com>2018-07-11 12:45:24 +0800
committerchrome-bot <chrome-bot@chromium.org>2018-07-11 05:24:12 -0700
commit56f742bed06c2247803b198875247875d02632a4 (patch)
tree0bcee295141ce5a26847858f3b117cdfc2556ac2
parentb2fbe4c24610fda7314361c2efab31c7ae7aca8a (diff)
downloadchrome-ec-56f742bed06c2247803b198875247875d02632a4.tar.gz
kukui: Add LED behavior.
Add simple LED rules. Charge: red Discharge under 10 percent: blink red Full: green Idle: red or green breath. BUG=b:80160408 TEST=none BRANCH=none Change-Id: I1d3a75dadb92e0dbf617a132990e3a0c4da66461 Signed-off-by: Yilun Lin <yllin@google.com> Reviewed-on: https://chromium-review.googlesource.com/1126748 Commit-Ready: Yilun Lin <yllin@chromium.org> Tested-by: Yilun Lin <yllin@chromium.org> Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
-rw-r--r--board/kukui/led.c66
1 files changed, 62 insertions, 4 deletions
diff --git a/board/kukui/led.c b/board/kukui/led.c
index 68e7570303..2b6c19a07e 100644
--- a/board/kukui/led.c
+++ b/board/kukui/led.c
@@ -6,28 +6,86 @@
*TODO(b:80160408): Implement mt6370 led driver.
*/
+#include "battery.h"
+#include "charge_state.h"
+#include "driver/charger/rt946x.h"
#include "hooks.h"
#include "led_common.h"
-/* LEDs on Kukui are active low. */
-#define BAT_LED_ON 0
-#define BAT_LED_OFF 1
-
const enum ec_led_id supported_led_ids[] = { EC_LED_ID_BATTERY_LED };
const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids);
+#define LED_OFF MT6370_LED_ID_OFF
+#define LED_GREEN MT6370_LED_ID1
+#define LED_RED MT6370_LED_ID2
+
+static void kukui_led_set_battery(void)
+{
+ static int battery_second;
+ uint32_t chflags = charge_get_flags();
+
+ battery_second++;
+
+ switch (charge_get_state()) {
+ case PWR_STATE_CHARGE:
+ /* Always indicate when charging, even in suspend. */
+ mt6370_led_set_color(LED_RED);
+ break;
+ case PWR_STATE_DISCHARGE:
+ if (charge_get_percent() <= 10)
+ mt6370_led_set_color(
+ (battery_second & 0x4) ? LED_RED : LED_OFF);
+ else
+ mt6370_led_set_color(LED_OFF);
+ break;
+ case PWR_STATE_ERROR:
+ mt6370_led_set_color((battery_second & 0x2) ?
+ LED_RED : LED_OFF);
+ break;
+ case PWR_STATE_CHARGE_NEAR_FULL:
+ mt6370_led_set_color(LED_GREEN);
+ break;
+ case PWR_STATE_IDLE: /* External power connected in IDLE. */
+ if (chflags & CHARGE_FLAG_FORCE_IDLE) {
+ mt6370_led_set_color(LED_RED);
+ mt6370_led_set_dim_mode(LED_RED,
+ MT6370_LED_DIM_MODE_BREATH);
+ } else {
+ mt6370_led_set_color(LED_GREEN);
+ mt6370_led_set_dim_mode(LED_GREEN,
+ MT6370_LED_DIM_MODE_BREATH);
+ }
+ break;
+ default:
+ /* Other states don't alter LED behavior */
+ break;
+ }
+}
+
void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
{
+ if (led_id != EC_LED_ID_BATTERY_LED)
+ return;
+
+ brightness_range[EC_LED_COLOR_GREEN] = MT6370_LED_BRIGHTNESS_MAX;
+ brightness_range[EC_LED_COLOR_RED] = MT6370_LED_BRIGHTNESS_MAX;
}
int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness)
{
+ if (led_id != EC_LED_ID_BATTERY_LED)
+ return EC_ERROR_INVAL;
+
+ mt6370_led_set_brightness(LED_GREEN, brightness[EC_LED_COLOR_GREEN]);
+ mt6370_led_set_brightness(LED_RED, brightness[EC_LED_COLOR_RED]);
return EC_SUCCESS;
}
/* Called by hook task every 1 sec */
static void led_second(void)
{
+ if (led_auto_control_is_enabled(EC_LED_ID_BATTERY_LED))
+ kukui_led_set_battery();
}
DECLARE_HOOK(HOOK_SECOND, led_second, HOOK_PRIO_DEFAULT);