diff options
Diffstat (limited to 'board/kakadu/led.c')
-rw-r--r-- | board/kakadu/led.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/board/kakadu/led.c b/board/kakadu/led.c index 3931c392e7..80470e0913 100644 --- a/board/kakadu/led.c +++ b/board/kakadu/led.c @@ -2,7 +2,7 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * - * Battery LED control for kakadu board. + * Battery LED control for Kakadu board. */ #include "battery.h" @@ -20,15 +20,17 @@ static enum charge_state prv_chstate = PWR_STATE_INIT; #define LED_OFF MT6370_LED_ID_OFF #define LED_RED MT6370_LED_ID1 #define LED_GREEN MT6370_LED_ID2 +#define LED_BLUE MT6370_LED_ID3 #define LED_MASK_OFF 0 #define LED_MASK_RED MT6370_MASK_RGB_ISNK1DIM_EN #define LED_MASK_GREEN MT6370_MASK_RGB_ISNK2DIM_EN +#define LED_MASK_BLUE MT6370_MASK_RGB_ISNK3DIM_EN static void kakadu_led_set_battery(void) { enum charge_state chstate; - static uint8_t prv_r, prv_g; + static uint8_t prv_r, prv_g, prv_b; uint8_t br[EC_LED_COLOR_COUNT] = { 0 }; chstate = charge_get_state(); @@ -41,19 +43,19 @@ static void kakadu_led_set_battery(void) switch (chstate) { case PWR_STATE_CHARGE: - br[EC_LED_COLOR_GREEN] = 255; - br[EC_LED_COLOR_RED] = 255; + /* RGB(current, duty) = (4mA,1/32)*/ + br[EC_LED_COLOR_BLUE] = 1; break; case PWR_STATE_DISCHARGE: - /* real battery SoC 5%*/ - if (charge_get_percent() <= 5) - br[EC_LED_COLOR_RED] = 255; + /* display SoC 10% = real battery SoC 13%*/ + if (charge_get_percent() <= 13) + br[EC_LED_COLOR_RED] = 1; break; case PWR_STATE_CHARGE_NEAR_FULL: - br[EC_LED_COLOR_GREEN] = 255; + br[EC_LED_COLOR_GREEN] = 1; break; case PWR_STATE_ERROR: - br[EC_LED_COLOR_RED] = 255; + br[EC_LED_COLOR_RED] = 1; break; default: /* Other states don't alter LED behavior */ @@ -61,11 +63,13 @@ static void kakadu_led_set_battery(void) } if (prv_r == br[EC_LED_COLOR_RED] && - prv_g == br[EC_LED_COLOR_GREEN]) + prv_g == br[EC_LED_COLOR_GREEN] && + prv_b == br[EC_LED_COLOR_BLUE]) return; prv_r = br[EC_LED_COLOR_RED]; prv_g = br[EC_LED_COLOR_GREEN]; + prv_b = br[EC_LED_COLOR_BLUE]; led_set_brightness(EC_LED_ID_BATTERY_LED, br); } @@ -76,23 +80,27 @@ void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) brightness_range[EC_LED_COLOR_RED] = MT6370_LED_BRIGHTNESS_MAX; brightness_range[EC_LED_COLOR_GREEN] = MT6370_LED_BRIGHTNESS_MAX; + brightness_range[EC_LED_COLOR_BLUE] = MT6370_LED_BRIGHTNESS_MAX; } int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) { - uint8_t red, green; + uint8_t red, green, blue; if (led_id != EC_LED_ID_BATTERY_LED) return EC_ERROR_INVAL; red = brightness[EC_LED_COLOR_RED]; green = brightness[EC_LED_COLOR_GREEN]; + blue = brightness[EC_LED_COLOR_BLUE]; mt6370_led_set_brightness(LED_RED, red); mt6370_led_set_brightness(LED_GREEN, green); + mt6370_led_set_brightness(LED_BLUE, blue); /* Enables LED sink power if necessary. */ mt6370_led_set_color((red ? LED_MASK_RED : 0) | + (blue ? LED_MASK_BLUE : 0) | (green ? LED_MASK_GREEN : 0)); return EC_SUCCESS; } @@ -110,14 +118,16 @@ static void kakadu_led_init(void) { const enum mt6370_led_dim_mode dim = MT6370_LED_DIM_MODE_PWM; const enum mt6370_led_pwm_freq freq = MT6370_LED_PWM_FREQ1000; - mt6370_led_set_color(0); mt6370_led_set_dim_mode(LED_RED, dim); mt6370_led_set_dim_mode(LED_GREEN, dim); + mt6370_led_set_dim_mode(LED_BLUE, dim); mt6370_led_set_pwm_frequency(LED_RED, freq); mt6370_led_set_pwm_frequency(LED_GREEN, freq); - mt6370_led_set_pwm_dim_duty(LED_RED, 12); - mt6370_led_set_pwm_dim_duty(LED_GREEN, 31); + mt6370_led_set_pwm_frequency(LED_BLUE, freq); + mt6370_led_set_pwm_dim_duty(LED_RED, 0); + mt6370_led_set_pwm_dim_duty(LED_GREEN, 0); + mt6370_led_set_pwm_dim_duty(LED_BLUE, 0); } DECLARE_HOOK(HOOK_INIT, kakadu_led_init, HOOK_PRIO_DEFAULT); |