diff options
-rw-r--r-- | board/homestar/led.c | 122 | ||||
-rw-r--r-- | include/ec_commands.h | 2 | ||||
-rw-r--r-- | util/ectool.c | 2 |
3 files changed, 59 insertions, 67 deletions
diff --git a/board/homestar/led.c b/board/homestar/led.c index baf1768b19..cd26a9c316 100644 --- a/board/homestar/led.c +++ b/board/homestar/led.c @@ -33,31 +33,39 @@ const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); enum led_color { LED_OFF = 0, - LED_AMBER, - LED_BLUE, + LED_RED, + LED_GREEN, + LED_ORANGE, LED_COLOR_COUNT /* Number of colors, not a color itself */ }; static void led_set_color(enum led_color color) { gpio_set_level(GPIO_EC_CHG_LED_R_C0, - (color == LED_AMBER) ? BAT_LED_ON : BAT_LED_OFF); + (color == LED_RED) ? BAT_LED_ON : BAT_LED_OFF); gpio_set_level(GPIO_EC_CHG_LED_G_C0, - (color == LED_BLUE) ? BAT_LED_ON : BAT_LED_OFF); + (color == LED_GREEN) ? BAT_LED_ON : BAT_LED_OFF); + if (color == LED_ORANGE) { + gpio_set_level(GPIO_EC_CHG_LED_R_C0, BAT_LED_ON); + gpio_set_level(GPIO_EC_CHG_LED_G_C0, BAT_LED_ON); + } } void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) { - brightness_range[EC_LED_COLOR_AMBER] = 1; - brightness_range[EC_LED_COLOR_BLUE] = 1; + brightness_range[EC_LED_COLOR_RED] = 1; + brightness_range[EC_LED_COLOR_GREEN] = 1; + brightness_range[EC_LED_COLOR_ORANGE] = 1; } int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) { - if (brightness[EC_LED_COLOR_BLUE] != 0) - led_set_color(LED_BLUE); - else if (brightness[EC_LED_COLOR_AMBER] != 0) - led_set_color(LED_AMBER); + 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_ORANGE] != 0) + led_set_color(LED_ORANGE); else led_set_color(LED_OFF); @@ -69,82 +77,66 @@ static void board_led_set_battery(void) static int battery_ticks; int color = LED_OFF; int period = 0; + int percent = charge_get_percent(); uint32_t chflags = charge_get_flags(); battery_ticks++; switch (charge_get_state()) { - case PWR_STATE_CHARGE: - /* Always indicate amber on when charging. */ - color = LED_AMBER; - break; case PWR_STATE_DISCHARGE: - if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) { - /* Discharging in S3: White 1 sec, off 1 sec */ - period = (1 + 1) * LED_ONE_SEC; - battery_ticks = battery_ticks % period; - if (battery_ticks < 1 * LED_ONE_SEC) { - if (charge_get_percent() < 10) { - /* Blink amber light (1 sec on, 1 sec off) */ - color = LED_AMBER; - } else { - /* Blink white light (1 sec on, 1 sec off) */ - color = LED_BLUE; - } + if (chipset_in_state(CHIPSET_STATE_ON | + CHIPSET_STATE_ANY_SUSPEND | + CHIPSET_STATE_ANY_OFF)) { + if (percent <= BATTERY_LEVEL_CRITICAL) { + /* battery capa < 5%, Red */ + color = LED_RED; + } else if (percent > BATTERY_LEVEL_CRITICAL && + percent < BATTERY_LEVEL_NEAR_FULL) { + /* 5% < battery capa < 97%, Orange */ + color = LED_ORANGE; } else { - color = LED_OFF; - } - } else { - /* Discharging in S5 and S0: off */ - /* Blink amber light (1 sec on, 1 sec off) */ - if (charge_get_percent() < 10) { - period = (1 + 1) * LED_ONE_SEC; - battery_ticks = battery_ticks % period; - if (battery_ticks < 1 * LED_ONE_SEC) - color = LED_AMBER; - else - color = LED_OFF; - } else { - /* G3 or S5 or S0: off */ - color = LED_OFF; + /* battery capa > 97%, Green */ + color = LED_GREEN; } } break; - case PWR_STATE_ERROR: - /* Battery error: Amber on 0.5 sec, off 0.5 sec */ - period = (1 + 1) * LED_HALF_ONE_SEC; - battery_ticks = battery_ticks % period; - if (battery_ticks < 1 * LED_HALF_ONE_SEC) - color = LED_AMBER; - else - color = LED_OFF; - break; - case PWR_STATE_CHARGE_NEAR_FULL: - /* Full Charged: Blue on */ - /* S3: Blink white light (1 sec on, 1 sec off) */ - if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) { - period = (1 + 1) * LED_ONE_SEC; + case PWR_STATE_CHARGE: + 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_BLUE; + color = LED_ORANGE; else color = LED_OFF; - } else { - /* Full charged: White on */ - color = LED_BLUE; + } else if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) { + /* S5, off */ + color = LED_OFF; } break; + case PWR_STATE_ERROR: + /* Battery error, Red on 1sec off 1sec */ + period = (1 + 1) * LED_ONE_SEC; + battery_ticks = battery_ticks % period; + if (battery_ticks < 1 * LED_ONE_SEC) + color = LED_RED; + else + color = LED_OFF; + break; case PWR_STATE_IDLE: /* External power connected in IDLE */ if (chflags & CHARGE_FLAG_FORCE_IDLE) { - /* Factory mode: Blue 2 sec, Amber 2 sec */ + /* Factory mode, Red 2 sec, green 2 sec */ period = (2 + 2) * LED_ONE_SEC; battery_ticks = battery_ticks % period; if (battery_ticks < 2 * LED_ONE_SEC) - color = LED_BLUE; + color = LED_RED; else - color = LED_AMBER; + color = LED_GREEN; } else - color = LED_BLUE; + color = LED_RED; break; default: /* Other states don't alter LED behavior */ @@ -167,7 +159,7 @@ void led_control(enum ec_led_id led_id, enum ec_led_state state) enum led_color color; if ((led_id != EC_LED_ID_RECOVERY_HW_REINIT_LED) && - (led_id != EC_LED_ID_SYSRQ_DEBUG_LED)) + (led_id != EC_LED_ID_SYSRQ_DEBUG_LED)) return; if (state == LED_STATE_RESET) { @@ -176,7 +168,7 @@ void led_control(enum ec_led_id led_id, enum ec_led_state state) return; } - color = state ? LED_BLUE : LED_OFF; + color = state ? LED_RED : LED_OFF; led_auto_control(EC_LED_ID_BATTERY_LED, 0); diff --git a/include/ec_commands.h b/include/ec_commands.h index 7dc21165c3..90c3de8c42 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -2393,7 +2393,7 @@ enum ec_led_colors { EC_LED_COLOR_YELLOW, EC_LED_COLOR_WHITE, EC_LED_COLOR_AMBER, - + EC_LED_COLOR_ORANGE, EC_LED_COLOR_COUNT }; diff --git a/util/ectool.c b/util/ectool.c index 8d91d2cb74..25161265c3 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -350,7 +350,7 @@ static const char * const image_names[] = {"unknown", "RO", "RW"}; /* Note: depends on enum ec_led_colors */ static const char * const led_color_names[] = { - "red", "green", "blue", "yellow", "white", "amber"}; + "red", "green", "blue", "yellow", "white", "amber", "orange"}; BUILD_ASSERT(ARRAY_SIZE(led_color_names) == EC_LED_COLOR_COUNT); /* Note: depends on enum ec_led_id */ |