From e0aa74f0fe7447736d57b85e05ad6f443a608864 Mon Sep 17 00:00:00 2001 From: Jacky Wang Date: Tue, 29 Dec 2020 10:00:15 +0800 Subject: copano: Implement LED function Update LED behavior by Marketing spec. BUG=b:176434090 BRANCH=firmware-volteer-13521.B TEST=make BOARD=copano Verify LED behavior with below items 1. DC mode : S0/S5 2. AC mode : S0/S5 3. battery low : S0/S5 4. Battery Error : S0/S5 Signed-off-by: Jacky Wang Change-Id: I72445feb93113b38a4a0c7a42955b7cf9f5d658f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2606172 Reviewed-by: Michael5 Chen Reviewed-by: Keith Short --- board/copano/board.c | 15 ------ board/copano/board.h | 13 +++--- board/copano/gpio.inc | 11 +++-- board/copano/led.c | 126 +++++++++++++++++++++++++++----------------------- 4 files changed, 81 insertions(+), 84 deletions(-) diff --git a/board/copano/board.c b/board/copano/board.c index 9286f239b0..1cd9fef2a5 100644 --- a/board/copano/board.c +++ b/board/copano/board.c @@ -133,21 +133,6 @@ const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); /******************************************************************************/ /* PWM configuration */ const struct pwm_t pwm_channels[] = { - [PWM_CH_LED1_BLUE] = { - .channel = 2, - .flags = PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, - .freq = 2400, - }, - [PWM_CH_LED2_RED] = { - .channel = 0, - .flags = PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, - .freq = 2400, - }, - [PWM_CH_LED3_GREEN] = { - .channel = 1, - .flags = PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, - .freq = 2400, - }, [PWM_CH_KBLIGHT] = { .channel = 3, .flags = 0, diff --git a/board/copano/board.h b/board/copano/board.h index cd97d9a22a..c5ec16a70e 100644 --- a/board/copano/board.h +++ b/board/copano/board.h @@ -27,10 +27,12 @@ #undef CONFIG_UART_TX_BUF_SIZE #define CONFIG_UART_TX_BUF_SIZE 4096 +#undef NPCX_PWM1_SEL +#define NPCX_PWM1_SEL 0 /* GPIO C2 is not used as PWM1 */ + /* LED defines */ -#define CONFIG_LED_PWM -/* Although there are 2 LEDs, they are both controlled by the same lines. */ -#define CONFIG_LED_PWM_COUNT 1 +#define CONFIG_LED_ONOFF_STATES +#define CONFIG_LED_ONOFF_STATES_BAT_LOW 10 /* Keyboard features */ @@ -154,10 +156,7 @@ enum battery_type { }; enum pwm_channel { - PWM_CH_LED1_BLUE = 0, - PWM_CH_LED2_RED, - PWM_CH_LED3_GREEN, - PWM_CH_KBLIGHT, + PWM_CH_KBLIGHT = 0, PWM_CH_COUNT }; diff --git a/board/copano/gpio.inc b/board/copano/gpio.inc index 5d60de45c3..d6c2b345fc 100644 --- a/board/copano/gpio.inc +++ b/board/copano/gpio.inc @@ -104,6 +104,11 @@ GPIO(CCD_MODE_ODL, PIN(E, 5), GPIO_INPUT) /* Case Closed Debug Mode */ GPIO(M2_SSD_PLA, PIN(7, 0), GPIO_INPUT) /* SSD power-loss acknowledgment */ GPIO(M2_SSD_PLN, PIN(A, 0), GPIO_ODR_HIGH) /* SSD power-loss notification */ + +/* LED */ +GPIO(LED_2_L, PIN(C, 3), GPIO_OUT_HIGH) /* Battery Full LED / Power LED: White */ +GPIO(LED_1_L, PIN(C, 4), GPIO_OUT_HIGH) /* Battery Charging LED: Amber */ + /* * eDP backlight - both PCH and EC have enable pins that must be high * for the backlight to turn on. Default state is high, and can be turned @@ -139,11 +144,6 @@ ALTERNATE(PIN_MASK(F, BIT(3) | BIT(2)), 0, MODULE_I2C, 0) ALTERNATE(PIN_MASK(3, BIT(3) | BIT(6)), 0, MODULE_I2C, 0) /* I2C5 */ ALTERNATE(PIN_MASK(B, BIT(3) | BIT(2)), 0, MODULE_I2C, 0) /* I2C7 */ -/* This selects between an LED module on the motherboard and one on the daughter - * board, to be controlled by LED_{1,2,3}_L. PWM allows driving both modules at - * the same time. */ -ALTERNATE(PIN_MASK(C, BIT(2) | BIT(3) | BIT(4)), 0, MODULE_PWM, 0) /* LED_{3,2,1}_L */ - /* Keyboard pins */ #define GPIO_KB_INPUT (GPIO_INPUT | GPIO_PULL_UP) ALTERNATE(PIN_MASK(3, 0x03), 0, MODULE_KEYBOARD_SCAN, GPIO_KB_INPUT) /* KSI_00-01 */ @@ -170,4 +170,5 @@ ALTERNATE(PIN(F, 1), 0, MODULE_ADC, 0) /* TEMP_SENSOR3 */ /* Unused signals */ GPIO(UNUSED_GPIOD4, PIN(D, 4), GPIO_INPUT | GPIO_PULL_UP) +GPIO(UNUSED_GPIOC2, PIN(C, 2), GPIO_INPUT | GPIO_PULL_UP) diff --git a/board/copano/led.c b/board/copano/led.c index f792eb6e3f..f2625d786c 100644 --- a/board/copano/led.c +++ b/board/copano/led.c @@ -1,79 +1,91 @@ /* 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. - * - * Power and battery LED control for Volteer */ -#include "charge_manager.h" -#include "common.h" +#include "chipset.h" #include "ec_commands.h" -#include "hooks.h" +#include "gpio.h" #include "led_common.h" -#include "led_pwm.h" -#include "pwm.h" +#include "led_onoff_states.h" -const enum ec_led_id supported_led_ids[] = { - EC_LED_ID_POWER_LED, -}; -const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); +#define LED_OFF_LVL 1 +#define LED_ON_LVL 0 + +const int led_charge_lvl_1; +const int led_charge_lvl_2 = 95; -struct pwm_led led_color_map[] = { - /* Green, Red, Blue */ - [EC_LED_COLOR_GREEN] = { 100, 0, 0 }, - [EC_LED_COLOR_RED] = { 0, 100, 0 }, - [EC_LED_COLOR_BLUE] = { 0, 0, 100 }, - /* The green LED seems to be brighter than the others, so turn down - * green from its natural level for these secondary colors. - */ - [EC_LED_COLOR_YELLOW] = { 70, 100, 0 }, - [EC_LED_COLOR_WHITE] = { 70, 100, 100 }, - [EC_LED_COLOR_AMBER] = { 20, 100, 0 }, +struct led_descriptor led_bat_state_table[LED_NUM_STATES][LED_NUM_PHASES] = { + [STATE_CHARGING_LVL_1] = {{EC_LED_COLOR_AMBER, LED_INDEFINITE} }, + [STATE_CHARGING_LVL_2] = {{EC_LED_COLOR_AMBER, LED_INDEFINITE} }, + [STATE_CHARGING_FULL_CHARGE] = {{EC_LED_COLOR_WHITE, LED_INDEFINITE} }, + [STATE_DISCHARGE_S0] = {{EC_LED_COLOR_WHITE, LED_INDEFINITE} }, + [STATE_DISCHARGE_S0_BAT_LOW] = {{EC_LED_COLOR_AMBER, 1 * LED_ONE_SEC}, + {LED_OFF, 3 * LED_ONE_SEC} }, + [STATE_DISCHARGE_S3] = {{EC_LED_COLOR_WHITE, 2 * LED_ONE_SEC}, + {LED_OFF, 2 * LED_ONE_SEC} }, + [STATE_DISCHARGE_S5] = {{LED_OFF, LED_INDEFINITE} }, + [STATE_BATTERY_ERROR] = {{EC_LED_COLOR_AMBER, 1 * LED_ONE_SEC}, + {LED_OFF, 1 * LED_ONE_SEC} }, + [STATE_FACTORY_TEST] = {{EC_LED_COLOR_WHITE, 2 * LED_ONE_SEC}, + {EC_LED_COLOR_AMBER, 2 * LED_ONE_SEC} }, }; -struct pwm_led pwm_leds[] = { - /* 2 RGB diffusers controlled by 1 set of 3 channels. */ - [PWM_LED0] = { - .ch0 = PWM_CH_LED3_GREEN, - .ch1 = PWM_CH_LED2_RED, - .ch2 = PWM_CH_LED1_BLUE, - .enable = &pwm_enable, - .set_duty = &pwm_set_duty, - }, +const enum ec_led_id supported_led_ids[] = { + EC_LED_ID_BATTERY_LED, }; +const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); + +void led_set_color_battery(enum ec_led_colors color) +{ + switch (color) { + case EC_LED_COLOR_WHITE: + gpio_set_level(GPIO_LED_1_L, LED_OFF_LVL); + gpio_set_level(GPIO_LED_2_L, LED_ON_LVL); + break; + case EC_LED_COLOR_AMBER: + gpio_set_level(GPIO_LED_1_L, LED_ON_LVL); + gpio_set_level(GPIO_LED_2_L, LED_OFF_LVL); + break; + default: /* LED_OFF and other unsupported colors */ + gpio_set_level(GPIO_LED_1_L, LED_OFF_LVL); + gpio_set_level(GPIO_LED_2_L, LED_OFF_LVL); + break; + } +} + void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) { - brightness_range[EC_LED_COLOR_RED] = 255; - brightness_range[EC_LED_COLOR_GREEN] = 255; - brightness_range[EC_LED_COLOR_BLUE] = 255; + if (led_id == EC_LED_ID_BATTERY_LED) { + brightness_range[EC_LED_COLOR_WHITE] = 1; + brightness_range[EC_LED_COLOR_AMBER] = 1; + } } int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) { - enum pwm_led_id pwm_id; - - /* 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; - - 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); + if (led_id == EC_LED_ID_BATTERY_LED) { + if (brightness[EC_LED_COLOR_WHITE] != 0) + led_set_color_battery(EC_LED_COLOR_WHITE); + else if (brightness[EC_LED_COLOR_AMBER] != 0) + led_set_color_battery(EC_LED_COLOR_AMBER); + else + led_set_color_battery(LED_OFF); + } return EC_SUCCESS; } + +__override enum led_states board_led_get_state(enum led_states desired_state) +{ + if (desired_state == STATE_BATTERY_ERROR) { + if (chipset_in_state(CHIPSET_STATE_ON)) + return desired_state; + else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) + return STATE_DISCHARGE_S3; + else + return STATE_DISCHARGE_S5; + } + return desired_state; +} -- cgit v1.2.1