diff options
author | xiong.huang <xiong.huang@bitland.corp-partner.google.com> | 2020-07-07 13:23:20 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-07-15 05:41:33 +0000 |
commit | d3a2090e1e0061ec664f914f10d1220395100635 (patch) | |
tree | 6cfed1454e67a289db322b5b09fcd73a3d7f4f4c /board/boten | |
parent | 234286a32f62067e06679faff0cc6c8f238fa877 (diff) | |
download | chrome-ec-d3a2090e1e0061ec664f914f10d1220395100635.tar.gz |
boten: define power and battery led behavior
Boten uses two types LED, battery LED and power LED. Battery LED uses
dual-color LED, green and red. Power LED uses monochrome LED, white.
BUG=b:160664441
BRANCH=none
TEST=`ectool led battery red/amber/green/off` and `ectool led power
white/off` work well.
Cq-Depend: chromium:2296544
Signed-off-by: xiong.huang <xiong.huang@bitland.corp-partner.google.com>
Change-Id: I6fb87d841ce837ebdc256154dc4b8557f6ed0401
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2282740
Reviewed-by: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'board/boten')
-rw-r--r-- | board/boten/board.c | 9 | ||||
-rw-r--r-- | board/boten/board.h | 8 | ||||
-rw-r--r-- | board/boten/led.c | 146 |
3 files changed, 98 insertions, 65 deletions
diff --git a/board/boten/board.c b/board/boten/board.c index 44670d2041..520d69d1bb 100644 --- a/board/boten/board.c +++ b/board/boten/board.c @@ -3,7 +3,7 @@ * found in the LICENSE file. */ -/* Waddledee board-specific configuration */ +/* Boten board-specific configuration */ #include "adc_chip.h" #include "button.h" @@ -148,6 +148,11 @@ void board_init(void) gpio_enable_interrupt(GPIO_HDMI_HPD_SUB_ODL); gpio_set_level(GPIO_HDMI_EN_SUB_ODL, 0); + + /* Set LEDs luminance */ + pwm_set_duty(PWM_CH_LED_RED, 70); + pwm_set_duty(PWM_CH_LED_GREEN, 70); + pwm_set_duty(PWM_CH_LED_WHITE, 70); } DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); @@ -260,7 +265,7 @@ const struct pwm_t pwm_channels[] = { .freq_hz = 2400, }, - [PWM_CH_LED_BLUE] = { + [PWM_CH_LED_WHITE] = { .channel = 3, .flags = PWM_CONFIG_DSLEEP | PWM_CONFIG_ACTIVE_LOW, .freq_hz = 2400, diff --git a/board/boten/board.h b/board/boten/board.h index 10d2588412..1d4524f155 100644 --- a/board/boten/board.h +++ b/board/boten/board.h @@ -3,7 +3,7 @@ * found in the LICENSE file. */ -/* Waddledee board configuration */ +/* Boten board configuration */ #ifndef __CROS_EC_BOARD_H #define __CROS_EC_BOARD_H @@ -30,8 +30,8 @@ #define CONFIG_OCPC_DEF_RBATT_MOHMS 22 /* R_DS(on) 11.6mOhm + 10mOhm sns rstr */ /* LED */ -#define CONFIG_LED_PWM -#define CONFIG_LED_PWM_COUNT 1 +#define CONFIG_LED_POWER_LED +#define CONFIG_LED_ONOFF_STATES /* Sensors */ #define CONFIG_ACCEL_LIS2DWL /* Lid accel */ @@ -86,7 +86,7 @@ enum pwm_channel { PWM_CH_KBLIGHT, PWM_CH_LED_RED, PWM_CH_LED_GREEN, - PWM_CH_LED_BLUE, + PWM_CH_LED_WHITE, PWM_CH_COUNT, }; diff --git a/board/boten/led.c b/board/boten/led.c index b19e594fbd..fe0a03e8db 100644 --- a/board/boten/led.c +++ b/board/boten/led.c @@ -1,82 +1,110 @@ /* Copyright 2020 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. + * + * Boten specific PWM LED settings. */ -/* Waddledee specific PWM LED settings. */ - #include "common.h" -#include "ec_commands.h" -#include "led_pwm.h" +#include "led_onoff_states.h" +#include "led_common.h" +#include "gpio.h" #include "pwm.h" -#include "util.h" -const enum ec_led_id supported_led_ids[] = { - EC_LED_ID_POWER_LED, +#define LED_OFF_LVL 0 +#define LED_ON_LVL 1 + +const int led_charge_lvl_1 = 5; + +const int led_charge_lvl_2 = 97; + +struct led_descriptor led_bat_state_table[LED_NUM_STATES][LED_NUM_PHASES] = { + [STATE_CHARGING_LVL_1] = {{EC_LED_COLOR_RED, LED_INDEFINITE} }, + [STATE_CHARGING_LVL_2] = {{EC_LED_COLOR_AMBER, LED_INDEFINITE} }, + [STATE_CHARGING_FULL_CHARGE] = {{EC_LED_COLOR_GREEN, LED_INDEFINITE} }, + [STATE_DISCHARGE_S0] = {{LED_OFF, LED_INDEFINITE} }, + [STATE_DISCHARGE_S3] = {{LED_OFF, LED_INDEFINITE} }, + [STATE_DISCHARGE_S5] = {{LED_OFF, LED_INDEFINITE} }, + [STATE_BATTERY_ERROR] = {{EC_LED_COLOR_RED, 1 * LED_ONE_SEC}, + {LED_OFF, 1 * LED_ONE_SEC} }, + [STATE_FACTORY_TEST] = {{EC_LED_COLOR_RED, 2 * LED_ONE_SEC}, + {EC_LED_COLOR_GREEN, 2 * LED_ONE_SEC} }, }; -const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); -/* - * Board has one physical LED with red, green, and blue - */ -struct pwm_led led_color_map[EC_LED_COLOR_COUNT] = { - /* Red, Green, Blue */ - [EC_LED_COLOR_RED] = { 100, 0, 0 }, - [EC_LED_COLOR_GREEN] = { 0, 100, 0 }, - [EC_LED_COLOR_BLUE] = { 0, 0, 100 }, - [EC_LED_COLOR_YELLOW] = { 50, 50, 0 }, - [EC_LED_COLOR_WHITE] = { 50, 50, 50 }, - [EC_LED_COLOR_AMBER] = { 70, 30, 0 }, +const struct led_descriptor + led_pwr_state_table[PWR_LED_NUM_STATES][LED_NUM_PHASES] = { + [PWR_LED_STATE_ON] = {{EC_LED_COLOR_WHITE, LED_INDEFINITE} }, + [PWR_LED_STATE_SUSPEND_AC] = {{EC_LED_COLOR_WHITE, 3 * LED_ONE_SEC}, + {LED_OFF, 0.5 * LED_ONE_SEC} }, + [PWR_LED_STATE_SUSPEND_NO_AC] = {{LED_OFF, LED_INDEFINITE} }, + [PWR_LED_STATE_OFF] = {{LED_OFF, LED_INDEFINITE} }, }; -/* One logical LED with red, green, and blue channels. */ -struct pwm_led pwm_leds[CONFIG_LED_PWM_COUNT] = { - { - .ch0 = PWM_CH_LED_RED, - .ch1 = PWM_CH_LED_GREEN, - .ch2 = PWM_CH_LED_BLUE, - .enable = &pwm_enable, - .set_duty = &pwm_set_duty, - }, +const enum ec_led_id supported_led_ids[] = { + EC_LED_ID_BATTERY_LED, + EC_LED_ID_POWER_LED }; -void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) +const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); + +void led_set_color_power(enum ec_led_colors color) { - memset(brightness_range, '\0', - sizeof(*brightness_range) * EC_LED_COLOR_COUNT); - brightness_range[EC_LED_COLOR_RED] = 100; - brightness_range[EC_LED_COLOR_GREEN] = 100; - brightness_range[EC_LED_COLOR_BLUE] = 100; - brightness_range[EC_LED_COLOR_YELLOW] = 100; - brightness_range[EC_LED_COLOR_WHITE] = 100; - brightness_range[EC_LED_COLOR_AMBER] = 100; + if (color == EC_LED_COLOR_WHITE) + pwm_enable(PWM_CH_LED_WHITE, LED_ON_LVL); + else + pwm_enable(PWM_CH_LED_WHITE, LED_OFF_LVL); } -int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) +void led_set_color_battery(enum ec_led_colors color) { - enum pwm_led_id pwm_id; + switch (color) { + case EC_LED_COLOR_RED: + pwm_enable(PWM_CH_LED_RED, LED_ON_LVL); + pwm_enable(PWM_CH_LED_GREEN, LED_OFF_LVL); + break; + case EC_LED_COLOR_AMBER: + pwm_enable(PWM_CH_LED_RED, LED_ON_LVL); + pwm_enable(PWM_CH_LED_GREEN, LED_ON_LVL); + break; + case EC_LED_COLOR_GREEN: + pwm_enable(PWM_CH_LED_RED, LED_OFF_LVL); + pwm_enable(PWM_CH_LED_GREEN, LED_ON_LVL); + break; + default: /* LED_OFF and other unsupported colors */ + pwm_enable(PWM_CH_LED_RED, LED_OFF_LVL); + pwm_enable(PWM_CH_LED_GREEN, LED_OFF_LVL); + break; + } +} - /* Convert ec_led_id to pwm_led_id. */ - if (led_id == EC_LED_ID_POWER_LED) - pwm_id = PWM_LED0; - else - return EC_ERROR_UNKNOWN; +void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) +{ + if (led_id == EC_LED_ID_BATTERY_LED) { + brightness_range[EC_LED_COLOR_RED] = 1; + brightness_range[EC_LED_COLOR_AMBER] = 1; + brightness_range[EC_LED_COLOR_GREEN] = 1; + } else if (led_id == EC_LED_ID_POWER_LED) { + brightness_range[EC_LED_COLOR_WHITE] = 1; + } +} - if (brightness[EC_LED_COLOR_RED]) - set_pwm_led_color(pwm_id, EC_LED_COLOR_RED); - else if (brightness[EC_LED_COLOR_GREEN]) - set_pwm_led_color(pwm_id, EC_LED_COLOR_GREEN); - else if (brightness[EC_LED_COLOR_BLUE]) - set_pwm_led_color(pwm_id, EC_LED_COLOR_BLUE); - else if (brightness[EC_LED_COLOR_YELLOW]) - set_pwm_led_color(pwm_id, EC_LED_COLOR_YELLOW); - else if (brightness[EC_LED_COLOR_WHITE]) - set_pwm_led_color(pwm_id, EC_LED_COLOR_WHITE); - else if (brightness[EC_LED_COLOR_AMBER]) - set_pwm_led_color(pwm_id, EC_LED_COLOR_AMBER); - else - /* Otherwise, the "color" is "off". */ - set_pwm_led_color(pwm_id, -1); +int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) +{ + if (led_id == EC_LED_ID_BATTERY_LED) { + if (brightness[EC_LED_COLOR_RED] != 0) + led_set_color_battery(EC_LED_COLOR_RED); + else if (brightness[EC_LED_COLOR_AMBER] != 0) + led_set_color_battery(EC_LED_COLOR_AMBER); + else if (brightness[EC_LED_COLOR_GREEN] != 0) + led_set_color_battery(EC_LED_COLOR_GREEN); + 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(EC_LED_COLOR_WHITE); + else + led_set_color_power(LED_OFF); + } return EC_SUCCESS; } |