diff options
author | Parth Malkan <parthmalkan@google.com> | 2022-04-07 16:13:21 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-04-08 15:36:32 +0000 |
commit | 5b9b3ce49180b94a4535b56eb11022c994591427 (patch) | |
tree | 39179aaa2b50f141dfb3da0e2c33a1f810f74d14 | |
parent | 0e90261640febc2e7f97f213846b56faf662a7ae (diff) | |
download | chrome-ec-5b9b3ce49180b94a4535b56eb11022c994591427.tar.gz |
zephyr: LED: Convert brightness range func to use DT
LED set/get brightness range funcs are used in ectool for
LED testing. This patch converts the implementation to be
generic and leverage dt.
BUG=b:227755556, b:194430340
BRANCH=none
TEST=On Lazor in both gpio and pwm LED configurations
- ectool led battery query -> Amber and Blue are set
- ectool led battery amber -> Sets Amber LED
- ectool led battery blue -> Sets Blue LED
- ectool led battery off -> Turns off LED
- ectool led battery auto -> Sets Blue LED (w/o charger)
Cq-Depend: chromium:3576900, chromium:3578053
Signed-off-by: Parth Malkan <parthmalkan@google.com>
Change-Id: I4830837202f80db662b4341d41c82c9cc2e70d3b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3576899
Reviewed-by: Wai-Hong Tam <waihong@google.com>
-rw-r--r-- | zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml | 13 | ||||
-rw-r--r-- | zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml | 13 | ||||
-rw-r--r-- | zephyr/shim/src/led_driver/led.c | 18 | ||||
-rw-r--r-- | zephyr/shim/src/led_driver/led.h | 5 | ||||
-rw-r--r-- | zephyr/shim/src/led_driver/led_gpio.c | 40 | ||||
-rw-r--r-- | zephyr/shim/src/led_driver/led_pwm.c | 40 |
6 files changed, 109 insertions, 20 deletions
diff --git a/zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml b/zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml index 238be08782..7c625bf401 100644 --- a/zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml +++ b/zephyr/dts/bindings/leds/cros-ec,gpio-led-pins.yaml @@ -20,6 +20,7 @@ child-binding: led-color: type: string required: true + description: Used to link the color nodes with the pin nodes enum: - LED_OFF - LED_RED @@ -28,6 +29,18 @@ child-binding: - LED_YELLOW - LED_WHITE - LED_AMBER + br-color: + type: string + required: false + description: This is used in the ectool brightness range APIs. + It needs to match the enum names defined in ec_commands.h + enum: + - EC_LED_COLOR_RED + - EC_LED_COLOR_GREEN + - EC_LED_COLOR_BLUE + - EC_LED_COLOR_YELLOW + - EC_LED_COLOR_WHITE + - EC_LED_COLOR_AMBER led-pins: type: phandle-array required: false diff --git a/zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml b/zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml index deabf0227f..3b083fb79d 100644 --- a/zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml +++ b/zephyr/dts/bindings/leds/cros-ec,pwm-led-pins.yaml @@ -26,6 +26,7 @@ child-binding: led-color: type: string required: true + description: Used to link the color nodes with the pin nodes enum: - LED_OFF - LED_RED @@ -34,6 +35,18 @@ child-binding: - LED_YELLOW - LED_WHITE - LED_AMBER + br-color: + type: string + required: false + description: This is used in the ectool brightness range APIs. + It needs to match the enum names defined in ec_commands.h + enum: + - EC_LED_COLOR_RED + - EC_LED_COLOR_GREEN + - EC_LED_COLOR_BLUE + - EC_LED_COLOR_YELLOW + - EC_LED_COLOR_WHITE + - EC_LED_COLOR_AMBER led-pins: type: phandle-array required: false diff --git a/zephyr/shim/src/led_driver/led.c b/zephyr/shim/src/led_driver/led.c index 1e97c98a86..edc4f9ce58 100644 --- a/zephyr/shim/src/led_driver/led.c +++ b/zephyr/shim/src/led_driver/led.c @@ -119,24 +119,6 @@ struct node_prop_t node_array[] = { DT_FOREACH_CHILD(LED_COLOR_NODE, SET_LED_VALUES) }; -void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) -{ - brightness_range[EC_LED_COLOR_AMBER] = 1; - brightness_range[EC_LED_COLOR_BLUE] = 1; -} - -int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) -{ - if (brightness[EC_LED_COLOR_BLUE] != 0) - led_set_color(LED_BLUE); - else if (brightness[EC_LED_COLOR_AMBER] != 0) - led_set_color(LED_AMBER); - else - led_set_color(LED_OFF); - - return EC_SUCCESS; -} - static enum power_state get_chipset_state(void) { enum power_state chipset_state = 0; diff --git a/zephyr/shim/src/led_driver/led.h b/zephyr/shim/src/led_driver/led.h index 4354df5125..53728609ed 100644 --- a/zephyr/shim/src/led_driver/led.h +++ b/zephyr/shim/src/led_driver/led.h @@ -14,6 +14,11 @@ (DT_STRING_UPPER_TOKEN(id, prop)), \ (0)) +#define GET_BR_COLOR(id, prop) \ + COND_CODE_1(DT_NODE_HAS_PROP(id, prop), \ + (DT_STRING_UPPER_TOKEN(id, prop)), \ + (-1)) + /* TODO(b/227798487): Use DT to generate this enum instead of hardcoding */ enum led_color { LED_OFF = 0, diff --git a/zephyr/shim/src/led_driver/led_gpio.c b/zephyr/shim/src/led_driver/led_gpio.c index 46d94db4dc..85bdc2dd71 100644 --- a/zephyr/shim/src/led_driver/led_gpio.c +++ b/zephyr/shim/src/led_driver/led_gpio.c @@ -5,6 +5,7 @@ * GPIO LED control. */ +#include "ec_commands.h" #include "led.h" #include "util.h" @@ -32,7 +33,13 @@ struct gpio_pin_t { * to alter in order to enable the given color. */ struct led_pins_node_t { + /* Link between color and pins node */ int led_color; + + /* Brightness Range color, only used by ectool funcs for testing */ + enum ec_led_colors br_color; + + /* Array of GPIO pins to set to enable particular color */ struct gpio_pin_t gpio_pins[LED_PIN_COUNT]; }; @@ -50,10 +57,11 @@ struct led_pins_node_t { #define SET_PIN_NODE(node_id) \ { \ .led_color = GET_PROP(node_id, led_color), \ + .br_color = GET_BR_COLOR(node_id, br_color), \ .gpio_pins = SET_GPIO_PIN(node_id) \ }, -struct led_pins_node_t pins_node[LED_COLOR_COUNT] = { +struct led_pins_node_t pins_node[] = { DT_FOREACH_CHILD(GPIO_LED_PINS_NODE, SET_PIN_NODE) }; @@ -74,4 +82,34 @@ void led_set_color(enum led_color color) } } } + +void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) +{ + for (int i = 0; i < ARRAY_SIZE(pins_node); i++) { + int br_color = pins_node[i].br_color; + + if (br_color != -1) + brightness_range[br_color] = 1; + } +} + +int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) +{ + bool color_set = false; + + for (int i = 0; i < ARRAY_SIZE(pins_node); i++) { + int br_color = pins_node[i].br_color; + + if ((br_color != -1) && (brightness[br_color] != 0)) { + color_set = true; + led_set_color(pins_node[i].led_color); + } + } + + /* If no color was set, turn off the LED */ + if (!color_set) + led_set_color(LED_OFF); + + return EC_SUCCESS; +} #endif /* DT_HAS_COMPAT_STATUS_OKAY(COMPAT_GPIO_LED) */ diff --git a/zephyr/shim/src/led_driver/led_pwm.c b/zephyr/shim/src/led_driver/led_pwm.c index 57cd6eb92f..d2605256a5 100644 --- a/zephyr/shim/src/led_driver/led_pwm.c +++ b/zephyr/shim/src/led_driver/led_pwm.c @@ -5,6 +5,7 @@ * PWM LED control. */ +#include "ec_commands.h" #include "led.h" #include "util.h" @@ -34,7 +35,13 @@ struct pwm_pin_t { * to alter in order to enable the given color. */ struct led_pins_node_t { + /* Link between color and pins node */ int led_color; + + /* Brightness Range color, only used by ectool funcs for testing */ + enum ec_led_colors br_color; + + /* Array of PWM pins to set to enable particular color */ struct pwm_pin_t pwm_pins[LED_PIN_COUNT]; }; @@ -70,10 +77,11 @@ const uint32_t period_us = #define SET_PIN_NODE(node_id) \ { \ .led_color = GET_PROP(node_id, led_color), \ + .br_color = GET_BR_COLOR(node_id, br_color), \ .pwm_pins = SET_PWM_PIN(node_id) \ }, -struct led_pins_node_t pins_node[LED_COLOR_COUNT] = { +struct led_pins_node_t pins_node[] = { DT_FOREACH_CHILD(PWM_LED_PINS_NODE, SET_PIN_NODE) }; @@ -99,4 +107,34 @@ void led_set_color(enum led_color color) } } } + +void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) +{ + for (int i = 0; i < ARRAY_SIZE(pins_node); i++) { + int br_color = pins_node[i].br_color; + + if (br_color != -1) + brightness_range[br_color] = 100; + } +} + +int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) +{ + bool color_set = false; + + for (int i = 0; i < ARRAY_SIZE(pins_node); i++) { + int br_color = pins_node[i].br_color; + + if ((br_color != -1) && (brightness[br_color] != 0)) { + color_set = true; + led_set_color(pins_node[i].led_color); + } + } + + /* If no color was set, turn off the LED */ + if (!color_set) + led_set_color(LED_OFF); + + return EC_SUCCESS; +} #endif /* DT_HAS_COMPAT_STATUS_OKAY(COMPAT_PWM_LED) */ |