From a21cecdf596ea520de514ca632303c0d0188b179 Mon Sep 17 00:00:00 2001 From: liheyang Date: Thu, 12 Aug 2021 18:02:58 +0800 Subject: Mrbland: Change the behavior of LED Add the new configuration of GPIO_EC_PWRBTN_LED and GPIO_EC_CHG_LED_R/G_C0 BUG=b:196325448 BRANCH=trogdor TEST=1.make BOARD=mrbland Signed-off-by: liheyang Change-Id: Ib0a6b6693cf833ca6320f287328e6bead040c729 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3090508 Reviewed-by: Wai-Hong Tam Commit-Queue: Wai-Hong Tam --- board/mrbland/gpio.inc | 2 +- board/mrbland/led.c | 101 +++++++++++++++++++++++++++++++++++-------------- 2 files changed, 73 insertions(+), 30 deletions(-) diff --git a/board/mrbland/gpio.inc b/board/mrbland/gpio.inc index 77a69a5faa..3a11aff46c 100644 --- a/board/mrbland/gpio.inc +++ b/board/mrbland/gpio.inc @@ -84,6 +84,7 @@ GPIO(DP_HOT_PLUG_DET, PIN(9, 5), GPIO_OUT_LOW) /* DP HPD to AP */ /* LEDs */ GPIO(EC_CHG_LED_R_C0, PIN(C, 3), GPIO_OUT_LOW) GPIO(EC_CHG_LED_G_C0, PIN(C, 4), GPIO_OUT_LOW) +GPIO(EC_PWRBTN_LED, PIN(7, 3), GPIO_OUT_LOW) /* * SPI host interface - enable PDs by default. These will be made functional @@ -173,7 +174,6 @@ UNUSED(PIN(D, 1)) UNUSED(PIN(D, 3)) UNUSED(PIN(7, 5)) UNUSED(PIN(8, 6)) -UNUSED(PIN(7, 3)) UNUSED(PIN(7, 4)) UNUSED(PIN(D, 7)) UNUSED(PIN(8, 5)) diff --git a/board/mrbland/led.c b/board/mrbland/led.c index bf1bb51fa6..a8d2fcda30 100644 --- a/board/mrbland/led.c +++ b/board/mrbland/led.c @@ -27,6 +27,7 @@ const enum ec_led_id supported_led_ids[] = { EC_LED_ID_BATTERY_LED, + EC_LED_ID_POWER_LED, }; const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); @@ -36,10 +37,11 @@ enum led_color { LED_RED, LED_GREEN, LED_AMBER, + LED_WHITE, LED_COLOR_COUNT /* Number of colors, not a color itself */ }; -static void led_set_color(enum led_color color) +static void led_set_color_battery(enum led_color color) { gpio_set_level(GPIO_EC_CHG_LED_R_C0, (color == LED_RED) ? BAT_LED_ON : BAT_LED_OFF); @@ -51,23 +53,40 @@ static void led_set_color(enum led_color color) } } +static void led_set_color_power(enum led_color color) +{ + gpio_set_level(GPIO_EC_PWRBTN_LED, + (color == LED_WHITE) ? BAT_LED_ON : BAT_LED_OFF); +} + void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) { - brightness_range[EC_LED_COLOR_RED] = 1; - brightness_range[EC_LED_COLOR_GREEN] = 1; - brightness_range[EC_LED_COLOR_AMBER] = 1; + if (led_id == EC_LED_ID_BATTERY_LED) { + brightness_range[EC_LED_COLOR_RED] = 1; + brightness_range[EC_LED_COLOR_GREEN] = 1; + brightness_range[EC_LED_COLOR_AMBER] = 1; + } else if (led_id == EC_LED_ID_POWER_LED) { + brightness_range[EC_LED_COLOR_WHITE] = 1; + } } int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) { - if (brightness[EC_LED_COLOR_RED] != 0) - led_set_color(LED_RED); - else if (brightness[EC_LED_COLOR_GREEN] != 0) - led_set_color(LED_GREEN); - else if (brightness[EC_LED_COLOR_AMBER] != 0) - led_set_color(LED_AMBER); - else - led_set_color(LED_OFF); + if (led_id == EC_LED_ID_BATTERY_LED) { + if (brightness[EC_LED_COLOR_RED] != 0) + led_set_color_battery(LED_RED); + else if (brightness[EC_LED_COLOR_GREEN] != 0) + led_set_color_battery(LED_GREEN); + else if (brightness[EC_LED_COLOR_AMBER] != 0) + led_set_color_battery(LED_AMBER); + else + led_set_color_battery(LED_OFF); + } else if (led_id == EC_LED_ID_POWER_LED) { + if (brightness[EC_LED_COLOR_WHITE] != 0) + led_set_color_power(LED_WHITE); + else + led_set_color_power(LED_OFF); + } return EC_SUCCESS; } @@ -102,21 +121,7 @@ static void board_led_set_battery(void) } break; case PWR_STATE_DISCHARGE: - if (chipset_in_state(CHIPSET_STATE_ON)) { - /* S0, Green (soild on) */ - color = LED_GREEN; - } else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) { - /* S3, Orange (1s on 3s off) */ - period = (2 + 2) * LED_ONE_SEC; - battery_ticks = battery_ticks % period; - if (battery_ticks < 1 * LED_ONE_SEC) - color = LED_AMBER; - else - color = LED_OFF; - } else if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) { - /* S5, off */ - color = LED_OFF; - } + color = LED_OFF; break; case PWR_STATE_ERROR: /* Battery error, Red on 1sec off 1sec */ @@ -144,7 +149,43 @@ static void board_led_set_battery(void) break; } - led_set_color(color); + led_set_color_battery(color); +} + +static void board_led_set_power(void) +{ + static int power_ticks; + int color = LED_OFF; + int period = 0; + + power_ticks++; + + switch (charge_get_state()) { + case PWR_STATE_CHARGE: + case PWR_STATE_CHARGE_NEAR_FULL: + case PWR_STATE_DISCHARGE: + if (chipset_in_state(CHIPSET_STATE_ON)) { + /* S0, White (soild on) */ + color = LED_WHITE; + } else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) { + /* S3, white (3s on 500ms off) */ + period = 1 * LED_HALF_ONE_SEC + 3 * LED_ONE_SEC; + power_ticks = power_ticks % period; + if (power_ticks < 3 * LED_ONE_SEC) + color = LED_WHITE; + else + color = LED_OFF; + } else if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) { + /* S5, off */ + color = LED_OFF; + } + break; + default: + /* Other states don't alter LED behavior */ + break; + } + + led_set_color_power(color); } /* Called by hook task every TICK */ @@ -152,6 +193,8 @@ static void led_tick(void) { if (led_auto_control_is_enabled(EC_LED_ID_BATTERY_LED)) board_led_set_battery(); + if (led_auto_control_is_enabled(EC_LED_ID_POWER_LED)) + board_led_set_power(); } DECLARE_HOOK(HOOK_TICK, led_tick, HOOK_PRIO_DEFAULT); @@ -173,5 +216,5 @@ void led_control(enum ec_led_id led_id, enum ec_led_state state) led_auto_control(EC_LED_ID_BATTERY_LED, 0); - led_set_color(color); + led_set_color_battery(color); } -- cgit v1.2.1