diff options
-rw-r--r-- | board/atlas/board.c | 18 | ||||
-rw-r--r-- | board/atlas/board.h | 14 | ||||
-rw-r--r-- | board/atlas/build.mk | 1 | ||||
-rw-r--r-- | board/atlas/led.c | 84 |
4 files changed, 108 insertions, 9 deletions
diff --git a/board/atlas/board.c b/board/atlas/board.c index 0d122f022e..5725e1f14e 100644 --- a/board/atlas/board.c +++ b/board/atlas/board.c @@ -95,11 +95,19 @@ struct keyboard_scan_config keyscan_config = { /* PWM channels. Must be in the exactly same order as in enum pwm_channel. */ const struct pwm_t pwm_channels[] = { - [PWM_CH_KBLIGHT] = { 3, 0, 10000 }, - [PWM_CH_LED1] = { 0, PWM_CONFIG_DSLEEP, 100 }, - [PWM_CH_LED2] = { 2, PWM_CONFIG_DSLEEP, 100 }, - [PWM_CH_LED3] = { 6, PWM_CONFIG_DSLEEP, 100 }, - [PWM_CH_LED4] = { 1, PWM_CONFIG_DSLEEP, 100 }, + [PWM_CH_KBLIGHT] = { 3, 0, 10000 }, + [PWM_CH_DB0_LED_BLUE] = { + 0, PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, 2400 }, + [PWM_CH_DB0_LED_RED] = { + 2, PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, 2400 }, + [PWM_CH_DB0_LED_GREEN] = { + 6, PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, 2400 }, + [PWM_CH_DB1_LED_BLUE] = { + 1, PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, 2400 }, + [PWM_CH_DB1_LED_RED] = { + 7, PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, 2400 }, + [PWM_CH_DB1_LED_GREEN] = { + 5, PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, 2400 }, }; BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); diff --git a/board/atlas/board.h b/board/atlas/board.h index ae290ca666..d4cca06959 100644 --- a/board/atlas/board.h +++ b/board/atlas/board.h @@ -100,6 +100,10 @@ #define CONFIG_POWER_S0IX #define CONFIG_POWER_TRACK_HOST_SLEEP_STATE +/* LEDs */ +#define CONFIG_LED_COMMON +#define CONFIG_LED_PWM_COUNT 2 + /* Temperature Sensor */ #define CONFIG_TEMP_SENSOR #define CONFIG_TEMP_SENSOR_BD99992GW @@ -196,10 +200,12 @@ enum temp_sensor_id { enum pwm_channel { PWM_CH_KBLIGHT, - PWM_CH_LED1, - PWM_CH_LED2, - PWM_CH_LED3, - PWM_CH_LED4, + PWM_CH_DB0_LED_BLUE, + PWM_CH_DB0_LED_RED, + PWM_CH_DB0_LED_GREEN, + PWM_CH_DB1_LED_BLUE, + PWM_CH_DB1_LED_RED, + PWM_CH_DB1_LED_GREEN, PWM_CH_COUNT }; diff --git a/board/atlas/build.mk b/board/atlas/build.mk index 8fbcd50554..77001ecfa1 100644 --- a/board/atlas/build.mk +++ b/board/atlas/build.mk @@ -12,4 +12,5 @@ CHIP_VARIANT:=npcx7m6f board-y=board.o board-$(CONFIG_BATTERY_SMART)+=battery.o +board-$(CONFIG_LED_COMMON)+=led.o board-$(CONFIG_USB_POWER_DELIVERY)+=usb_pd_policy.o diff --git a/board/atlas/led.c b/board/atlas/led.c new file mode 100644 index 0000000000..85c1ef9214 --- /dev/null +++ b/board/atlas/led.c @@ -0,0 +1,84 @@ +/* Copyright 2018 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. + */ + +/* Atlas specific PWM LED settings. */ + +#include "common.h" +#include "ec_commands.h" +#include "led_pwm.h" +#include "pwm.h" +#include "util.h" + +const enum ec_led_id supported_led_ids[] = { + EC_LED_ID_LEFT_LED, + EC_LED_ID_RIGHT_LED, +}; +const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); + +/* We may not be using the blue channel long term. */ +struct pwm_led led_color_map[EC_LED_COLOR_COUNT] = { + /* Red, Green, Blue */ + [EC_LED_COLOR_RED] = { 45, 0, 0 }, + [EC_LED_COLOR_GREEN] = { 0, 30, 0 }, + [EC_LED_COLOR_BLUE] = { 0, 0, 60 }, + [EC_LED_COLOR_YELLOW] = { 25, 15, 0 }, + [EC_LED_COLOR_WHITE] = { 30, 25, 25 }, + [EC_LED_COLOR_AMBER] = { 40, 5, 0 }, +}; + +/* Two tri-color LEDs with red, green, and blue channels. */ +struct pwm_led pwm_leds[CONFIG_LED_PWM_COUNT] = { + [PWM_LED0] = { + PWM_CH_DB0_LED_RED, + PWM_CH_DB0_LED_GREEN, + PWM_CH_DB0_LED_BLUE, + }, + [PWM_LED1] = { + PWM_CH_DB1_LED_RED, + PWM_CH_DB1_LED_GREEN, + PWM_CH_DB1_LED_BLUE, + }, +}; + +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_GREEN] = 100; + brightness_range[EC_LED_COLOR_YELLOW] = 100; + brightness_range[EC_LED_COLOR_AMBER] = 100; + brightness_range[EC_LED_COLOR_BLUE] = 100; + brightness_range[EC_LED_COLOR_WHITE] = 100; +} + +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_LEFT_LED) + pwm_id = PWM_LED1; + else if (led_id == EC_LED_ID_RIGHT_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); + + return EC_SUCCESS; +} |