Skip to content

Commit 8a91e60

Browse files
committed
drivers: led: add leds-group-multicolor driver
This driver supports multi-color LEDs built with several monochromatic LEDs. ->set_color is the only LED driver API method implemented. Instead of calling led_set_brightness() for each monochromatic LED, led_set_color() can be called on the leds-group-multicolor device to set all colors at once. See the leds-group-multicolor DT binding for details. Signed-off-by: Simon Guinot <simon.guinot@seagate.com>
1 parent db55efa commit 8a91e60

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

drivers/led/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ zephyr_library_sources_ifdef(CONFIG_HT16K33 ht16k33.c)
99
zephyr_library_sources_ifdef(CONFIG_IS31FL3194 is31fl3194.c)
1010
zephyr_library_sources_ifdef(CONFIG_IS31FL3216A is31fl3216a.c)
1111
zephyr_library_sources_ifdef(CONFIG_IS31FL3733 is31fl3733.c)
12+
zephyr_library_sources_ifdef(CONFIG_LEDS_GROUP_MULTICOLOR leds_group_multicolor.c)
1213
zephyr_library_sources_ifdef(CONFIG_LED_AXP192_AXP2101 led_axp192.c)
1314
zephyr_library_sources_ifdef(CONFIG_LED_DAC led_dac.c)
1415
zephyr_library_sources_ifdef(CONFIG_LED_GPIO led_gpio.c)

drivers/led/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ source "drivers/led/Kconfig.ht16k33"
3434
source "drivers/led/Kconfig.is31fl3194"
3535
source "drivers/led/Kconfig.is31fl3216a"
3636
source "drivers/led/Kconfig.is31fl3733"
37+
source "drivers/led/Kconfig.leds-group-multicolor"
3738
source "drivers/led/Kconfig.lp3943"
3839
source "drivers/led/Kconfig.lp50xx"
3940
source "drivers/led/Kconfig.lp5562"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Copyright (c) 2025 Seagate Technology LLC
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config LEDS_GROUP_MULTICOLOR
5+
bool "LEDs group multi-color driver"
6+
default y
7+
depends on DT_HAS_LEDS_GROUP_MULTICOLOR_ENABLED
8+
help
9+
Enable this driver to supports multi-color LEDs built with several
10+
monochromatic LEDs.
11+
12+
See the leds-group-multicolor DT binding for details.

drivers/led/leds_group_multicolor.c

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* Copyright (c) 2025 Seagate Technology LLC
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#define DT_DRV_COMPAT leds_group_multicolor
8+
9+
/**
10+
* @file
11+
* @brief Driver for multi-color LED built from monochromatic LEDs.
12+
*/
13+
14+
#include <zephyr/drivers/led.h>
15+
#include <zephyr/device.h>
16+
#include <zephyr/kernel.h>
17+
18+
#include <zephyr/logging/log.h>
19+
LOG_MODULE_REGISTER(leds_group_multicolor, CONFIG_LED_LOG_LEVEL);
20+
21+
struct leds_group_multicolor_config {
22+
uint8_t num_leds;
23+
const struct led_dt_spec *led;
24+
};
25+
26+
static int leds_group_multicolor_set_color(const struct device *dev, uint32_t led,
27+
uint8_t num_colors, const uint8_t *color)
28+
{
29+
const struct leds_group_multicolor_config *config = dev->config;
30+
31+
if (led != 0) {
32+
return -EINVAL;
33+
}
34+
if (num_colors != config->num_leds) {
35+
return -EINVAL;
36+
}
37+
38+
for (uint8_t i = 0; i < num_colors; i++) {
39+
int err;
40+
41+
err = led_set_brightness_dt(&config->led[i], color[i]);
42+
if (err) {
43+
return err;
44+
}
45+
}
46+
47+
return 0;
48+
}
49+
50+
static int leds_group_multicolor_init(const struct device *dev)
51+
{
52+
const struct leds_group_multicolor_config *config = dev->config;
53+
54+
for (uint8_t i = 0; i < config->num_leds; i++) {
55+
const struct led_dt_spec *led = &config->led[i];
56+
57+
if (!led_is_ready_dt(led)) {
58+
LOG_ERR("%s: LED device %s is not ready", dev->name, led->dev->name);
59+
return -ENODEV;
60+
}
61+
}
62+
63+
return 0;
64+
}
65+
66+
static DEVICE_API(led, leds_group_multicolor_api) = {
67+
.set_color = leds_group_multicolor_set_color,
68+
};
69+
70+
#define LED_DT_SPEC_GET_BY_PHANDLE_IDX(node_id, prop, idx) \
71+
LED_DT_SPEC_GET(DT_PHANDLE_BY_IDX(node_id, prop, idx))
72+
73+
#define LEDS_GROUP_MULTICOLOR_DEVICE(inst) \
74+
\
75+
BUILD_ASSERT(DT_INST_PROP_LEN(inst, leds) > 0, \
76+
"at least one LED phandle must be present"); \
77+
\
78+
static const struct led_dt_spec led_group_multicolor_##inst[] = { \
79+
DT_INST_FOREACH_PROP_ELEM_SEP( \
80+
inst, leds, LED_DT_SPEC_GET_BY_PHANDLE_IDX, (,)) \
81+
}; \
82+
\
83+
static const struct leds_group_multicolor_config \
84+
leds_group_multicolor_config_##inst = { \
85+
.num_leds = ARRAY_SIZE(led_group_multicolor_##inst), \
86+
.led = led_group_multicolor_##inst, \
87+
}; \
88+
\
89+
DEVICE_DT_INST_DEFINE(inst, &leds_group_multicolor_init, NULL, \
90+
NULL, &leds_group_multicolor_config_##inst, \
91+
POST_KERNEL, CONFIG_LED_INIT_PRIORITY, \
92+
&leds_group_multicolor_api);
93+
94+
DT_INST_FOREACH_STATUS_OKAY(LEDS_GROUP_MULTICOLOR_DEVICE)

0 commit comments

Comments
 (0)