diff options
author | Lennon Chen <Lennon_Chen@wistron.com> | 2015-12-25 10:25:09 +0800 |
---|---|---|
committer | ChromeOS bot <3su6n15k.default@developer.gserviceaccount.com> | 2016-01-26 20:03:42 +0000 |
commit | e6741fe03d1c1c62c76e1540a39a5ffd13963cfd (patch) | |
tree | 3cf5fa6090c3e25c85e11ec76a7e98cda8afcaa2 | |
parent | d1384fa1546e55bb46fa085cae2b7c1be2151f43 (diff) | |
download | chrome-ec-e6741fe03d1c1c62c76e1540a39a5ffd13963cfd.tar.gz |
setzer: Implement LED function
Modify LED behavior to meet LED specification
BUG=chrome-os-partner:49646
BRANCH=strago
TEST=Check behavior to meet LED specification
Change-Id: I22d3c1df5f105b5cfc58ed4d637b97f67cd7494a
Signed-off-by: Lennon Chen <Lennon_Chen@wistron.com>
Reviewed-on: https://chromium-review.googlesource.com/319950
Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r-- | board/setzer/board.c | 9 | ||||
-rw-r--r-- | board/setzer/board.h | 10 | ||||
-rw-r--r-- | board/setzer/gpio.inc | 6 | ||||
-rw-r--r-- | board/setzer/led.c | 183 |
4 files changed, 103 insertions, 105 deletions
diff --git a/board/setzer/board.c b/board/setzer/board.c index c8bdc7fe7b..08b740d8f6 100644 --- a/board/setzer/board.c +++ b/board/setzer/board.c @@ -39,15 +39,6 @@ #include "gpio_list.h" -/* PWM channels. Must be in the exactly same order as in enum pwm_channel. */ -const struct pwm_t pwm_channels[] = { - {0, PWM_CONFIG_ACTIVE_LOW}, - {1, PWM_CONFIG_ACTIVE_LOW}, - {3, PWM_CONFIG_ACTIVE_LOW}, -}; - -BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); - /* power signal list. Must match order of enum power_signal. */ const struct power_signal_info power_signal_list[] = { {GPIO_ALL_SYS_PGOOD, 1, "ALL_SYS_PWRGD"}, diff --git a/board/setzer/board.h b/board/setzer/board.h index 27d298c5bf..b9a4d3f615 100644 --- a/board/setzer/board.h +++ b/board/setzer/board.h @@ -61,7 +61,6 @@ #define CONFIG_CHARGER_INPUT_CURRENT 2240 #define CONFIG_CHARGER_DISCHARGE_ON_AC -#define CONFIG_PWM #define CONFIG_LED_COMMON #define CONFIG_I2C @@ -84,6 +83,7 @@ #undef CONFIG_PECI #undef CONFIG_FANS #undef CONFIG_ADC +#undef CONFIG_PWM #ifndef __ASSEMBLER__ #include "gpio_signal.h" @@ -116,14 +116,6 @@ enum power_signal { POWER_SIGNAL_COUNT }; -enum pwm_channel { - PWM_CH_LED_RED, - PWM_CH_LED_BLUE, - PWM_CH_LED_GREEN, - /* Number of PWM channels */ - PWM_CH_COUNT -}; - enum temp_sensor_id { /* TMP432 local and remote sensors */ TEMP_SENSOR_I2C_TMP432_LOCAL, diff --git a/board/setzer/gpio.inc b/board/setzer/gpio.inc index d8592d7042..81923fdde2 100644 --- a/board/setzer/gpio.inc +++ b/board/setzer/gpio.inc @@ -78,7 +78,10 @@ GPIO(EC_VNN_ALERT_L, PIN(124), GPIO_INPUT | GPIO_PULL_UP) GPIO(NC_GPIO127, PIN(127), GPIO_INPUT | GPIO_PULL_UP) /* NC */ GPIO(NC_GPIO132, PIN(132), GPIO_INPUT | GPIO_PULL_UP) /* NC */ +GPIO(BAT_LED_WHITE, PIN(133), GPIO_OUT_LOW) /* LED color white */ +GPIO(BAT_LED_AMBER, PIN(136), GPIO_OUT_LOW) /* LED color amber */ GPIO(PD_RST_L, PIN(135), GPIO_ODR_HIGH) /* USB PD MCU reset */ +GPIO(PWR_LED_WHITE, PIN(141), GPIO_OUT_LOW) /* Power LED - white */ GPIO(NC_GPIO140, PIN(140), GPIO_INPUT | GPIO_PULL_UP) /* NC */ GPIO(PCH_RSMRST_L, PIN(143), GPIO_OUT_LOW) /* RSMRST_N to PCH */ @@ -128,9 +131,6 @@ ALTERNATE(PIN_MASK(12, 0x01), 1, MODULE_LPC, 0) ALTERNATE(PIN_MASK(5, 0x10), 1, MODULE_SPI, 0) ALTERNATE(PIN_MASK(16, 0x10), 1, MODULE_SPI, 0) ALTERNATE(PIN_MASK(15, 0x08), 1, MODULE_SPI, 0) /* 153: CLK */ - -ALTERNATE(PIN_MASK(13, 0x48), 1, MODULE_PWM_LED, GPIO_OUTPUT) /* 133: PWM0, 136: PWM1 */ -ALTERNATE(PIN_MASK(14, 0x02), 1, MODULE_PWM_LED, GPIO_OUTPUT) /* 141: PWM3 */ ALTERNATE(PIN_MASK(5, 0x40), 1, MODULE_ADC, 0) /* 56: temperature sensor 1 */ ALTERNATE(PIN_MASK(6, 0x07), 1, MODULE_ADC, 0) /* 60: PC_MON, 61: ADT_TYPE_AD, 62: temperature sensor 3 */ diff --git a/board/setzer/led.c b/board/setzer/led.c index 44d90c25e5..9651f3d72e 100644 --- a/board/setzer/led.c +++ b/board/setzer/led.c @@ -22,6 +22,11 @@ #define LED_TOTAL_TICKS 16 #define LED_ON_TICKS 4 +#define BAT_LED_ON 1 +#define BAT_LED_OFF 0 +#define POWER_LED_ON 1 +#define POWER_LED_OFF 0 + static int led_debug; const enum ec_led_id supported_led_ids[] = { @@ -30,47 +35,83 @@ const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); enum led_color { LED_OFF = 0, - LED_RED, + LED_WHITE, LED_AMBER, - LED_GREEN, - - /* Number of colors, not a color itself */ - LED_COLOR_COUNT + LED_COLOR_COUNT /* Number of colors, not a color itself */ }; -/* Brightness vs. color, in the order of off, red, amber, and green */ -static const uint8_t color_brightness[LED_COLOR_COUNT][3] = { - /* {Red, Blue, Green}, */ - [LED_OFF] = { 0, 0, 0}, - [LED_RED] = {100, 0, 0}, - [LED_AMBER] = { 75, 0, 10}, - [LED_GREEN] = { 0, 0, 100}, -}; +static int bat_led_set_color(enum led_color color) +{ + switch (color) { + case 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_AMBER: + gpio_set_level(GPIO_BAT_LED_WHITE, BAT_LED_OFF); + gpio_set_level(GPIO_BAT_LED_AMBER, BAT_LED_ON); + break; + case LED_WHITE: + gpio_set_level(GPIO_BAT_LED_WHITE, BAT_LED_ON); + gpio_set_level(GPIO_BAT_LED_AMBER, BAT_LED_OFF); + break; + default: + return EC_ERROR_UNKNOWN; + } + return EC_SUCCESS; +} -/** - * Set LED color - * - * @param color Enumerated color value - */ -static void set_color(enum led_color color) +static int pwr_led_set_color(enum led_color color) { - pwm_set_duty(PWM_CH_LED_RED, color_brightness[color][0]); - pwm_set_duty(PWM_CH_LED_BLUE, color_brightness[color][1]); - pwm_set_duty(PWM_CH_LED_GREEN, color_brightness[color][2]); + switch (color) { + case LED_OFF: + gpio_set_level(GPIO_PWR_LED_WHITE, POWER_LED_OFF); + break; + case LED_WHITE: + gpio_set_level(GPIO_PWR_LED_WHITE, POWER_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_RED] = 100; - brightness_range[EC_LED_COLOR_BLUE] = 100; - brightness_range[EC_LED_COLOR_GREEN] = 100; + switch (led_id) { + case EC_LED_ID_BATTERY_LED: + brightness_range[EC_LED_COLOR_WHITE] = 100; + brightness_range[EC_LED_COLOR_YELLOW] = 100; + break; + case EC_LED_ID_POWER_LED: + brightness_range[EC_LED_COLOR_WHITE] = 100; + break; + default: + /* Nothing to do */ + break; + } } int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) { - pwm_set_duty(PWM_CH_LED_RED, brightness[EC_LED_COLOR_RED]); - pwm_set_duty(PWM_CH_LED_BLUE, brightness[EC_LED_COLOR_BLUE]); - pwm_set_duty(PWM_CH_LED_GREEN, brightness[EC_LED_COLOR_GREEN]); + switch (led_id) { + case EC_LED_ID_BATTERY_LED: + if (brightness[EC_LED_COLOR_WHITE] != 0) + bat_led_set_color(LED_WHITE); + else if (brightness[EC_LED_COLOR_YELLOW] != 0) + bat_led_set_color(LED_AMBER); + else + bat_led_set_color(LED_OFF); + break; + case EC_LED_ID_POWER_LED: + if (brightness[EC_LED_COLOR_WHITE] != 0) + pwr_led_set_color(LED_WHITE); + else + pwr_led_set_color(LED_OFF); + break; + default: + break; + } return EC_SUCCESS; } @@ -87,11 +128,8 @@ static void setzer_led_set_power(void) if (!previous_state_suspend) power_ticks = 0; - /* Blink once every four seconds. */ - set_color( - (power_ticks % LED_TOTAL_TICKS) < LED_ON_TICKS ? - LED_AMBER : LED_OFF); - + /* Blink once every one second. */ + pwr_led_set_color((power_ticks & 0x4) ? LED_WHITE : LED_OFF); previous_state_suspend = 1; return; } @@ -99,9 +137,9 @@ static void setzer_led_set_power(void) previous_state_suspend = 0; if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) - set_color(LED_OFF); + pwr_led_set_color(LED_OFF); else if (chipset_in_state(CHIPSET_STATE_ON)) - set_color(LED_GREEN); + pwr_led_set_color(LED_WHITE); } static void setzer_led_set_battery(void) @@ -112,14 +150,21 @@ static void setzer_led_set_battery(void) switch (charge_get_state()) { case PWR_STATE_CHARGE: - set_color(LED_AMBER); + bat_led_set_color(LED_AMBER); + break; + case PWR_STATE_DISCHARGE: + if (charge_get_percent() < 10) + bat_led_set_color( + (battery_ticks & 0x4) ? LED_WHITE : LED_OFF); + else + bat_led_set_color(LED_OFF); break; case PWR_STATE_ERROR: - set_color(LED_RED); + bat_led_set_color((battery_ticks & 0x2) ? LED_WHITE : LED_OFF); break; + case PWR_STATE_IDLE: case PWR_STATE_CHARGE_NEAR_FULL: - case PWR_STATE_IDLE: /* External power connected in IDLE. */ - set_color(LED_GREEN); + bat_led_set_color(LED_WHITE); break; default: /* Other states don't alter LED behavior */ @@ -129,18 +174,8 @@ static void setzer_led_set_battery(void) static void led_init(void) { - /* Configure GPIOs */ - gpio_config_module(MODULE_PWM_LED, 1); - - /* - * Enable PWMs and set to 0% duty cycle. If they're disabled, - * seems to ground the pins instead of letting them float. - */ - pwm_enable(PWM_CH_LED_RED, 1); - pwm_enable(PWM_CH_LED_GREEN, 1); - pwm_enable(PWM_CH_LED_BLUE, 1); - - set_color(LED_OFF); + bat_led_set_color(LED_OFF); + pwr_led_set_color(LED_OFF); } DECLARE_HOOK(HOOK_INIT, led_init, HOOK_PRIO_DEFAULT); @@ -149,34 +184,14 @@ DECLARE_HOOK(HOOK_INIT, led_init, HOOK_PRIO_DEFAULT); */ static void led_tick(void) { - if (led_debug) - return; - - if (extpower_is_present()) { - if (led_auto_control_is_enabled(EC_LED_ID_BATTERY_LED)) { - setzer_led_set_battery(); - return; - } - } else if (led_auto_control_is_enabled(EC_LED_ID_POWER_LED)) { + if (led_auto_control_is_enabled(EC_LED_ID_POWER_LED)) setzer_led_set_power(); - return; - } - set_color(LED_OFF); + if (led_auto_control_is_enabled(EC_LED_ID_BATTERY_LED)) + setzer_led_set_battery(); } DECLARE_HOOK(HOOK_TICK, led_tick, HOOK_PRIO_DEFAULT); -static void dump_pwm_channels(void) -{ - int ch; - for (ch = 0; ch < 4; ch++) { - CPRINTF("channel = %d\n", ch); - CPRINTF("0x%04X 0x%04X 0x%04X\n", - MEC1322_PWM_CFG(ch), - MEC1322_PWM_ON(ch), - MEC1322_PWM_OFF(ch)); - } -} /******************************************************************/ /* Console commands */ static int command_led_color(int argc, char **argv) @@ -185,22 +200,22 @@ static int command_led_color(int argc, char **argv) if (!strcasecmp(argv[1], "debug")) { led_debug ^= 1; CPRINTF("led_debug = %d\n", led_debug); - } else if (!strcasecmp(argv[1], "off")) { - set_color(LED_OFF); - } else if (!strcasecmp(argv[1], "red")) { - set_color(LED_RED); - } else if (!strcasecmp(argv[1], "green")) { - set_color(LED_GREEN); - } else if (!strcasecmp(argv[1], "amber")) { - set_color(LED_AMBER); + } else if (!strcasecmp(argv[1], "bat_off")) { + bat_led_set_color(LED_OFF); + } else if (!strcasecmp(argv[1], "bat_white")) { + bat_led_set_color(LED_WHITE); + } else if (!strcasecmp(argv[1], "bat_amber")) { + bat_led_set_color(LED_AMBER); + } else if (!strcasecmp(argv[1], "pwr_off")) { + pwr_led_set_color(LED_OFF); + } else if (!strcasecmp(argv[1], "pwr_white")) { + pwr_led_set_color(LED_WHITE); } else { /* maybe handle charger_discharge_on_ac() too? */ return EC_ERROR_PARAM1; } } - if (led_debug == 1) - dump_pwm_channels(); return EC_SUCCESS; } DECLARE_CONSOLE_COMMAND(ledcolor, command_led_color, |