summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@google.com>2017-02-24 10:30:30 -0800
committerchrome-bot <chrome-bot@chromium.org>2017-03-01 16:36:23 -0800
commit6d1130b5c3ba3c397f981c17e3cf79ffac1a5bdf (patch)
treecb86f3cafe63721a18b2ffa6e52bd0bab5c5b5e2
parent9af60bb7955a8bba0710798d1dcf2a4d2c2aae6b (diff)
downloadchrome-ec-6d1130b5c3ba3c397f981c17e3cf79ffac1a5bdf.tar.gz
eve: led: Avoid changing pwm with every tick
When debugging PWM on eve I noticed that every tick was adjusting the pwm duty cycles for all LEDs, even if nothing changed. To keep that from happening keep track of the current led state and only adjust if it changes. This also modifies the "on+charging" state to not set both LEDs to blue and then change on to amber, but keep track of which side is charging and set both LEDs to their expected colors. Finally it fixes a bug with suspend and a full battery not blinking the other side white to indicate suspend state. BUG=chrome-os-partner:58666 BRANCH=none TEST=ensure LEDs still behave as expected with charging and full battery while in S0, S3, S5 states. Change-Id: I98e5d5ad04b3e71da6fa4056e95f3661a9271ecf Signed-off-by: Duncan Laurie <dlaurie@google.com> Reviewed-on: https://chromium-review.googlesource.com/446593 Reviewed-by: Scott Collyer <scollyer@chromium.org>
-rw-r--r--board/eve/led.c54
1 files changed, 40 insertions, 14 deletions
diff --git a/board/eve/led.c b/board/eve/led.c
index 763a0766f9..ddc3efa567 100644
--- a/board/eve/led.c
+++ b/board/eve/led.c
@@ -68,18 +68,33 @@ static const uint8_t color_brightness[LED_COLOR_COUNT][PWM_CHAN_PER_LED] = {
static void set_color(enum led_color color, enum led_side side)
{
int i;
+ static uint8_t saved_duty[LED_BOTH][PWM_CHAN_PER_LED];
/* Set color for left LED */
- if (side == LED_LEFT || side == LED_BOTH)
- for (i = 0; i < PWM_CHAN_PER_LED; i++)
- pwm_set_duty(PWM_CH_LED_L_RED + i,
- color_brightness[color][i]);
+ if (side == LED_LEFT || side == LED_BOTH) {
+ for (i = 0; i < PWM_CHAN_PER_LED; i++) {
+ if (saved_duty[LED_LEFT][i] !=
+ color_brightness[color][i]) {
+ pwm_set_duty(PWM_CH_LED_L_RED + i,
+ color_brightness[color][i]);
+ saved_duty[LED_LEFT][i] =
+ color_brightness[color][i];
+ }
+ }
+ }
/* Set color for right LED */
- if (side == LED_RIGHT || side == LED_BOTH)
- for (i = 0; i < PWM_CHAN_PER_LED; i++)
- pwm_set_duty(PWM_CH_LED_R_RED + i,
- color_brightness[color][i]);
+ if (side == LED_RIGHT || side == LED_BOTH) {
+ for (i = 0; i < PWM_CHAN_PER_LED; i++) {
+ if (saved_duty[LED_RIGHT][i] !=
+ color_brightness[color][i]) {
+ pwm_set_duty(PWM_CH_LED_R_RED + i,
+ color_brightness[color][i]);
+ saved_duty[LED_RIGHT][i] =
+ color_brightness[color][i];
+ }
+ }
+ }
}
void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
@@ -116,12 +131,17 @@ static void eve_led_set_power_battery(void)
side = LED_BOTH;
if (chipset_in_state(CHIPSET_STATE_ON)) {
- set_color(LED_BLUE, LED_BOTH);
- if (chg_state == PWR_STATE_CHARGE)
+ enum led_side blueside = LED_BOTH;
+
+ if (chg_state == PWR_STATE_CHARGE) {
set_color(LED_AMBER, side);
- else if (chg_state == PWR_STATE_IDLE || chg_state ==
- PWR_STATE_CHARGE_NEAR_FULL)
+ blueside = !side;
+ } else if (chg_state == PWR_STATE_IDLE || chg_state ==
+ PWR_STATE_CHARGE_NEAR_FULL) {
set_color(LED_GREEN, side);
+ blueside = !side;
+ }
+ set_color(LED_BLUE, blueside);
return;
}
@@ -138,12 +158,18 @@ static void eve_led_set_power_battery(void)
chipset_in_state(CHIPSET_STATE_STANDBY)) {
enum led_side blinkside = LED_BOTH;
- if (chg_state == PWR_STATE_CHARGE) {
+ if (chg_state == PWR_STATE_CHARGE_NEAR_FULL ||
+ chg_state == PWR_STATE_IDLE) {
+ set_color(LED_GREEN, side);
+ blinkside = !side;
+ } else if (chg_state == PWR_STATE_CHARGE) {
set_color(LED_AMBER, side);
blinkside = !side;
}
if (chg_state == PWR_STATE_DISCHARGE ||
- chg_state == PWR_STATE_CHARGE) {
+ chg_state == PWR_STATE_CHARGE ||
+ chg_state == PWR_STATE_CHARGE_NEAR_FULL ||
+ chg_state == PWR_STATE_IDLE) {
/*
* If in S3/S0iX and not in some error
* state, then flash non-charging LEDs white.