diff options
-rw-r--r-- | board/snappy/board.c | 5 | ||||
-rw-r--r-- | board/snappy/board.h | 2 | ||||
-rw-r--r-- | board/snappy/gpio.inc | 5 | ||||
-rw-r--r-- | board/snappy/led.c | 134 |
4 files changed, 74 insertions, 72 deletions
diff --git a/board/snappy/board.c b/board/snappy/board.c index beb48868de..f6e4a0879f 100644 --- a/board/snappy/board.c +++ b/board/snappy/board.c @@ -122,8 +122,6 @@ BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); /* PWM channels. Must be in the exactly same order as in enum pwm_channel. */ const struct pwm_t pwm_channels[] = { - [PWM_CH_LED_GREEN] = { 2, PWM_CONFIG_DSLEEP, 100 }, - [PWM_CH_LED_RED] = { 3, PWM_CONFIG_DSLEEP, 100 }, }; BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); @@ -661,7 +659,8 @@ void board_hibernate_late(void) int i; const uint32_t hibernate_pins[][2] = { /* Turn off LEDs in hibernate */ - {GPIO_BAT_LED_BLUE, GPIO_INPUT | GPIO_PULL_UP}, + {GPIO_POWER_LED_WHITE, GPIO_INPUT | GPIO_PULL_UP}, + {GPIO_BAT_LED_WHITE, GPIO_INPUT | GPIO_PULL_UP}, {GPIO_BAT_LED_AMBER, GPIO_INPUT | GPIO_PULL_UP}, {GPIO_LID_OPEN, GPIO_INT_RISING | GPIO_PULL_DOWN}, diff --git a/board/snappy/board.h b/board/snappy/board.h index e7578c5d51..a1bb8a5ccc 100644 --- a/board/snappy/board.h +++ b/board/snappy/board.h @@ -208,8 +208,6 @@ enum adc_channel { }; enum pwm_channel { - PWM_CH_LED_GREEN = 0, - PWM_CH_LED_RED, /* Number of PWM channels */ PWM_CH_COUNT }; diff --git a/board/snappy/gpio.inc b/board/snappy/gpio.inc index 8c8f1e1b63..5794f6f9fd 100644 --- a/board/snappy/gpio.inc +++ b/board/snappy/gpio.inc @@ -138,9 +138,8 @@ GPIO(USB_C1_5V_EN, PIN(D, 2), GPIO_OUT_LOW) /* EN_USB_C1_5V_OUT, Enable C1 */ GPIO(NC1, PIN(0, 0), GPIO_INPUT | GPIO_PULL_UP | GPIO_SEL_1P8V) GPIO(NC2, PIN(8, 4), GPIO_INPUT | GPIO_PULL_UP | GPIO_SEL_1P8V) -GPIO(ENG_STRAP, PIN(B, 6), GPIO_INPUT) - -GPIO(BAT_LED_BLUE, PIN(8, 0), GPIO_OUT_HIGH) +GPIO(POWER_LED_WHITE, PIN(8, 0), GPIO_OUT_HIGH) +GPIO(BAT_LED_WHITE, PIN(B, 6), GPIO_OUT_HIGH) GPIO(BAT_LED_AMBER, PIN(C, 4), GPIO_OUT_HIGH) /* diff --git a/board/snappy/led.c b/board/snappy/led.c index bc595171ed..d511c448af 100644 --- a/board/snappy/led.c +++ b/board/snappy/led.c @@ -19,23 +19,15 @@ #define BAT_LED_ON 0 #define BAT_LED_OFF 1 -#define CRITICAL_LOW_BATTERY_PERCENTAGE 3 -#define LOW_BATTERY_PERCENTAGE 10 - -#define LED_TOTAL_4SECS_TICKS 4 -#define LED_TOTAL_2SECS_TICKS 2 -#define LED_ON_1SEC_TICKS 1 -#define LED_ON_2SECS_TICKS 2 - const enum ec_led_id supported_led_ids[] = { - EC_LED_ID_BATTERY_LED}; + EC_LED_ID_POWER_LED, EC_LED_ID_BATTERY_LED}; const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); enum led_color { LED_OFF = 0, - LED_BLUE, LED_AMBER, + LED_WHITE, LED_COLOR_COUNT /* Number of colors, not a color itself */ }; @@ -43,15 +35,15 @@ static int led_set_color_battery(enum led_color color) { switch (color) { case LED_OFF: - gpio_set_level(GPIO_BAT_LED_BLUE, BAT_LED_OFF); + gpio_set_level(GPIO_BAT_LED_WHITE, BAT_LED_OFF); gpio_set_level(GPIO_BAT_LED_AMBER, BAT_LED_OFF); break; - case LED_BLUE: - gpio_set_level(GPIO_BAT_LED_BLUE, BAT_LED_ON); + case LED_WHITE: + gpio_set_level(GPIO_BAT_LED_WHITE, BAT_LED_ON); gpio_set_level(GPIO_BAT_LED_AMBER, BAT_LED_OFF); break; case LED_AMBER: - gpio_set_level(GPIO_BAT_LED_BLUE, BAT_LED_OFF); + gpio_set_level(GPIO_BAT_LED_WHITE, BAT_LED_OFF); gpio_set_level(GPIO_BAT_LED_AMBER, BAT_LED_ON); break; default: @@ -60,9 +52,24 @@ static int led_set_color_battery(enum led_color color) return EC_SUCCESS; } +static int led_set_color_power(enum led_color color) +{ + switch (color) { + case LED_OFF: + gpio_set_level(GPIO_POWER_LED_WHITE, BAT_LED_OFF); + break; + case LED_WHITE: + gpio_set_level(GPIO_POWER_LED_WHITE, BAT_LED_ON); + break; + default: + return EC_ERROR_UNKNOWN; + } + return EC_SUCCESS; +} + void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) { - brightness_range[EC_LED_COLOR_BLUE] = 1; + brightness_range[EC_LED_COLOR_WHITE] = 1; brightness_range[EC_LED_COLOR_AMBER] = 1; } @@ -74,6 +81,9 @@ static int led_set_color(enum ec_led_id led_id, enum led_color color) case EC_LED_ID_BATTERY_LED: rv = led_set_color_battery(color); break; + case EC_LED_ID_POWER_LED: + rv = led_set_color_power(color); + break; default: return EC_ERROR_UNKNOWN; } @@ -82,8 +92,8 @@ static int led_set_color(enum ec_led_id led_id, enum led_color color) 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_id, LED_BLUE); + if (brightness[EC_LED_COLOR_WHITE] != 0) + led_set_color(led_id, LED_WHITE); else if (brightness[EC_LED_COLOR_AMBER] != 0) led_set_color(led_id, LED_AMBER); else @@ -95,80 +105,76 @@ int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) static void led_set_battery(void) { static int battery_ticks; - static int suspend_ticks; - static int previous_state_suspend; + static int power_ticks; uint32_t chflags = charge_get_flags(); + int remaining_capacity; + int full_charge_capacity; + int permillage; battery_ticks++; - suspend_ticks++; + power_ticks++; + + remaining_capacity = *(int *)host_get_memmap(EC_MEMMAP_BATT_CAP); + full_charge_capacity = *(int *)host_get_memmap(EC_MEMMAP_BATT_LFCC); + permillage = !full_charge_capacity ? 0 : + (1000 * remaining_capacity) / full_charge_capacity; + switch (charge_get_state()) { case PWR_STATE_CHARGE: led_set_color_battery(LED_AMBER); break; case PWR_STATE_DISCHARGE: - /* Less than 3%, blink one second every two second */ - if (!chipset_in_state(CHIPSET_STATE_ANY_OFF) && - charge_get_percent() < CRITICAL_LOW_BATTERY_PERCENTAGE) - led_set_color_battery( - (battery_ticks % LED_TOTAL_2SECS_TICKS < - LED_ON_1SEC_TICKS) ? LED_AMBER : LED_OFF); - /* Less than 10%, blink one second every four seconds */ - else if (!chipset_in_state(CHIPSET_STATE_ANY_OFF) && - charge_get_percent() < LOW_BATTERY_PERCENTAGE) + /* + * Blink white light (1 sec on, 1 sec off) + * when battery capacity is less than 10% + */ + if (permillage < 100) led_set_color_battery( - (battery_ticks % LED_TOTAL_4SECS_TICKS < - LED_ON_1SEC_TICKS) ? LED_AMBER : LED_OFF); - else { - if (chipset_in_state(CHIPSET_STATE_SUSPEND - | CHIPSET_STATE_STANDBY)) { - if (!previous_state_suspend) - suspend_ticks = 0; - /* Blink once every four seconds. */ - led_set_color_battery( - (suspend_ticks % LED_TOTAL_4SECS_TICKS) - < LED_ON_1SEC_TICKS ? - LED_AMBER : LED_OFF); - previous_state_suspend = 1; - return; - } - - if (chipset_in_state(CHIPSET_STATE_ON)) - led_set_color_battery(LED_BLUE); - else - led_set_color_battery(LED_OFF); - } + (battery_ticks & 0x4) ? LED_WHITE : LED_OFF); + else + led_set_color_battery(LED_OFF); break; case PWR_STATE_ERROR: led_set_color_battery( - (battery_ticks % LED_TOTAL_2SECS_TICKS < - LED_ON_1SEC_TICKS) ? LED_AMBER : LED_OFF); + (battery_ticks & 0x2) ? LED_WHITE : LED_OFF); break; case PWR_STATE_CHARGE_NEAR_FULL: - led_set_color_battery(LED_BLUE); + led_set_color_battery(LED_WHITE); break; case PWR_STATE_IDLE: /* External power connected in IDLE */ if (chflags & CHARGE_FLAG_FORCE_IDLE) led_set_color_battery( - (battery_ticks % LED_TOTAL_4SECS_TICKS < - LED_ON_2SECS_TICKS) ? LED_AMBER : LED_BLUE); + (battery_ticks & 0x4) ? LED_AMBER : LED_OFF); else - led_set_color_battery(LED_BLUE); + led_set_color_battery(LED_WHITE); break; default: /* Other states don't alter LED behavior */ break; } - previous_state_suspend = 0; } -/* Called by hook task every 1 sec */ -static void led_second(void) +static void led_set_power(void) +{ + static int power_tick; + + power_tick++; + + if (chipset_in_state(CHIPSET_STATE_ON)) + led_set_color_power(LED_WHITE); + else if (chipset_in_state(CHIPSET_STATE_SUSPEND)) + led_set_color_power( + (power_tick & 0x4) ? LED_WHITE : LED_OFF); + else + led_set_color_power(LED_OFF); +} + +/* Called by hook task every TICK */ +static void led_tick(void) { - /* - * Reference board only has one LED, so overload it to act as both - * power LED and battery LED. - */ if (led_auto_control_is_enabled(EC_LED_ID_BATTERY_LED)) led_set_battery(); + if (led_auto_control_is_enabled(EC_LED_ID_POWER_LED)) + led_set_power(); } -DECLARE_HOOK(HOOK_SECOND, led_second, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_TICK, led_tick, HOOK_PRIO_DEFAULT); |