diff options
Diffstat (limited to 'board/mrbland/led.c')
-rw-r--r-- | board/mrbland/led.c | 101 |
1 files changed, 72 insertions, 29 deletions
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); } |