drivers: led_strip: Add length function
Adds a length function which returns the length of the LED strip Signed-off-by: Jamie McCrae <spam@helper3000.net>
This commit is contained in:
parent
8ca399919b
commit
4bea96b68b
11 changed files with 97 additions and 4 deletions
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
struct apa102_config {
|
struct apa102_config {
|
||||||
struct spi_dt_spec bus;
|
struct spi_dt_spec bus;
|
||||||
|
size_t length;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int apa102_update(const struct device *dev, void *buf, size_t size)
|
static int apa102_update(const struct device *dev, void *buf, size_t size)
|
||||||
|
@ -80,6 +81,13 @@ static int apa102_update_channels(const struct device *dev, uint8_t *channels,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t apa102_length(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct apa102_config *config = dev->config;
|
||||||
|
|
||||||
|
return config->length;
|
||||||
|
}
|
||||||
|
|
||||||
static int apa102_init(const struct device *dev)
|
static int apa102_init(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct apa102_config *config = dev->config;
|
const struct apa102_config *config = dev->config;
|
||||||
|
@ -94,6 +102,7 @@ static int apa102_init(const struct device *dev)
|
||||||
static const struct led_strip_driver_api apa102_api = {
|
static const struct led_strip_driver_api apa102_api = {
|
||||||
.update_rgb = apa102_update_rgb,
|
.update_rgb = apa102_update_rgb,
|
||||||
.update_channels = apa102_update_channels,
|
.update_channels = apa102_update_channels,
|
||||||
|
.length = apa102_length,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define APA102_DEVICE(idx) \
|
#define APA102_DEVICE(idx) \
|
||||||
|
@ -102,6 +111,7 @@ static const struct led_strip_driver_api apa102_api = {
|
||||||
idx, \
|
idx, \
|
||||||
SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB | SPI_WORD_SET(8), \
|
SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB | SPI_WORD_SET(8), \
|
||||||
0), \
|
0), \
|
||||||
|
.length = DT_INST_PROP(idx, chain_length), \
|
||||||
}; \
|
}; \
|
||||||
\
|
\
|
||||||
DEVICE_DT_INST_DEFINE(idx, \
|
DEVICE_DT_INST_DEFINE(idx, \
|
||||||
|
|
|
@ -36,6 +36,7 @@ LOG_MODULE_REGISTER(lpd880x);
|
||||||
|
|
||||||
struct lpd880x_config {
|
struct lpd880x_config {
|
||||||
struct spi_dt_spec bus;
|
struct spi_dt_spec bus;
|
||||||
|
size_t length;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int lpd880x_update(const struct device *dev, void *data, size_t size)
|
static int lpd880x_update(const struct device *dev, void *data, size_t size)
|
||||||
|
@ -125,6 +126,13 @@ static int lpd880x_strip_update_channels(const struct device *dev,
|
||||||
return lpd880x_update(dev, channels, num_channels);
|
return lpd880x_update(dev, channels, num_channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t lpd880x_strip_length(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct lpd880x_config *config = dev->config;
|
||||||
|
|
||||||
|
return config->length;
|
||||||
|
}
|
||||||
|
|
||||||
static int lpd880x_strip_init(const struct device *dev)
|
static int lpd880x_strip_init(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct lpd880x_config *config = dev->config;
|
const struct lpd880x_config *config = dev->config;
|
||||||
|
@ -138,12 +146,14 @@ static int lpd880x_strip_init(const struct device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct lpd880x_config lpd880x_config = {
|
static const struct lpd880x_config lpd880x_config = {
|
||||||
.bus = SPI_DT_SPEC_INST_GET(0, LPD880X_SPI_OPERATION, 0)
|
.bus = SPI_DT_SPEC_INST_GET(0, LPD880X_SPI_OPERATION, 0),
|
||||||
|
.length = DT_INST_PROP(0, chain_length),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct led_strip_driver_api lpd880x_strip_api = {
|
static const struct led_strip_driver_api lpd880x_strip_api = {
|
||||||
.update_rgb = lpd880x_strip_update_rgb,
|
.update_rgb = lpd880x_strip_update_rgb,
|
||||||
.update_channels = lpd880x_strip_update_channels,
|
.update_channels = lpd880x_strip_update_channels,
|
||||||
|
.length = lpd880x_strip_length,
|
||||||
};
|
};
|
||||||
|
|
||||||
DEVICE_DT_INST_DEFINE(0, lpd880x_strip_init, NULL,
|
DEVICE_DT_INST_DEFINE(0, lpd880x_strip_init, NULL,
|
||||||
|
|
|
@ -269,6 +269,13 @@ static int tlc5971_update_channels(const struct device *dev, uint8_t *channels,
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t tlc5971_length(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct tlc5971_config *cfg = dev->config;
|
||||||
|
|
||||||
|
return (size_t)cfg->num_pixels;
|
||||||
|
}
|
||||||
|
|
||||||
int tlc5971_set_global_brightness(const struct device *dev, struct led_rgb pixel)
|
int tlc5971_set_global_brightness(const struct device *dev, struct led_rgb pixel)
|
||||||
{
|
{
|
||||||
const struct tlc5971_config *cfg = dev->config;
|
const struct tlc5971_config *cfg = dev->config;
|
||||||
|
@ -334,6 +341,7 @@ static int tlc5971_init(const struct device *dev)
|
||||||
static const struct led_strip_driver_api tlc5971_api = {
|
static const struct led_strip_driver_api tlc5971_api = {
|
||||||
.update_rgb = tlc5971_update_rgb,
|
.update_rgb = tlc5971_update_rgb,
|
||||||
.update_channels = tlc5971_update_channels,
|
.update_channels = tlc5971_update_channels,
|
||||||
|
.length = tlc5971_length,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TLC5971_DATA_BUFFER_LENGTH(inst) \
|
#define TLC5971_DATA_BUFFER_LENGTH(inst) \
|
||||||
|
|
|
@ -28,6 +28,7 @@ struct ws2812_gpio_cfg {
|
||||||
struct gpio_dt_spec gpio;
|
struct gpio_dt_spec gpio;
|
||||||
uint8_t num_colors;
|
uint8_t num_colors;
|
||||||
const uint8_t *color_mapping;
|
const uint8_t *color_mapping;
|
||||||
|
size_t length;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -187,9 +188,17 @@ static int ws2812_gpio_update_channels(const struct device *dev,
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t ws2812_gpio_length(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct ws2812_gpio_cfg *config = dev->config;
|
||||||
|
|
||||||
|
return config->length;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct led_strip_driver_api ws2812_gpio_api = {
|
static const struct led_strip_driver_api ws2812_gpio_api = {
|
||||||
.update_rgb = ws2812_gpio_update_rgb,
|
.update_rgb = ws2812_gpio_update_rgb,
|
||||||
.update_channels = ws2812_gpio_update_channels,
|
.update_channels = ws2812_gpio_update_channels,
|
||||||
|
.length = ws2812_gpio_length,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -245,6 +254,7 @@ static const uint8_t ws2812_gpio_##idx##_color_mapping[] = \
|
||||||
.gpio = GPIO_DT_SPEC_INST_GET(idx, gpios), \
|
.gpio = GPIO_DT_SPEC_INST_GET(idx, gpios), \
|
||||||
.num_colors = WS2812_NUM_COLORS(idx), \
|
.num_colors = WS2812_NUM_COLORS(idx), \
|
||||||
.color_mapping = ws2812_gpio_##idx##_color_mapping, \
|
.color_mapping = ws2812_gpio_##idx##_color_mapping, \
|
||||||
|
.length = DT_INST_PROP(idx, chain_length), \
|
||||||
}; \
|
}; \
|
||||||
\
|
\
|
||||||
DEVICE_DT_INST_DEFINE(idx, \
|
DEVICE_DT_INST_DEFINE(idx, \
|
||||||
|
|
|
@ -38,6 +38,7 @@ struct ws2812_i2s_cfg {
|
||||||
size_t tx_buf_bytes;
|
size_t tx_buf_bytes;
|
||||||
struct k_mem_slab *mem_slab;
|
struct k_mem_slab *mem_slab;
|
||||||
uint8_t num_colors;
|
uint8_t num_colors;
|
||||||
|
size_t length;
|
||||||
const uint8_t *color_mapping;
|
const uint8_t *color_mapping;
|
||||||
uint16_t reset_words;
|
uint16_t reset_words;
|
||||||
uint32_t lrck_period;
|
uint32_t lrck_period;
|
||||||
|
@ -170,6 +171,13 @@ static int ws2812_strip_update_channels(const struct device *dev, uint8_t *chann
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t ws2812_strip_length(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct ws2812_i2s_cfg *cfg = dev->config;
|
||||||
|
|
||||||
|
return cfg->length;
|
||||||
|
}
|
||||||
|
|
||||||
static int ws2812_i2s_init(const struct device *dev)
|
static int ws2812_i2s_init(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct ws2812_i2s_cfg *cfg = dev->config;
|
const struct ws2812_i2s_cfg *cfg = dev->config;
|
||||||
|
@ -218,6 +226,7 @@ static int ws2812_i2s_init(const struct device *dev)
|
||||||
static const struct led_strip_driver_api ws2812_i2s_api = {
|
static const struct led_strip_driver_api ws2812_i2s_api = {
|
||||||
.update_rgb = ws2812_strip_update_rgb,
|
.update_rgb = ws2812_strip_update_rgb,
|
||||||
.update_channels = ws2812_strip_update_channels,
|
.update_channels = ws2812_strip_update_channels,
|
||||||
|
.length = ws2812_strip_length,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Integer division, but always rounds up: e.g. 10/3 = 4 */
|
/* Integer division, but always rounds up: e.g. 10/3 = 4 */
|
||||||
|
@ -250,6 +259,7 @@ static const struct led_strip_driver_api ws2812_i2s_api = {
|
||||||
.tx_buf_bytes = WS2812_I2S_BUFSIZE(idx), \
|
.tx_buf_bytes = WS2812_I2S_BUFSIZE(idx), \
|
||||||
.mem_slab = &ws2812_i2s_##idx##_slab, \
|
.mem_slab = &ws2812_i2s_##idx##_slab, \
|
||||||
.num_colors = WS2812_NUM_COLORS(idx), \
|
.num_colors = WS2812_NUM_COLORS(idx), \
|
||||||
|
.length = DT_INST_PROP(idx, chain_length), \
|
||||||
.color_mapping = ws2812_i2s_##idx##_color_mapping, \
|
.color_mapping = ws2812_i2s_##idx##_color_mapping, \
|
||||||
.lrck_period = WS2812_I2S_LRCK_PERIOD_US(idx), \
|
.lrck_period = WS2812_I2S_LRCK_PERIOD_US(idx), \
|
||||||
.extra_wait_time_us = DT_INST_PROP(idx, extra_wait_time), \
|
.extra_wait_time_us = DT_INST_PROP(idx, extra_wait_time), \
|
||||||
|
|
|
@ -24,6 +24,7 @@ struct ws2812_led_strip_config {
|
||||||
const struct device *piodev;
|
const struct device *piodev;
|
||||||
const uint8_t gpio_pin;
|
const uint8_t gpio_pin;
|
||||||
uint8_t num_colors;
|
uint8_t num_colors;
|
||||||
|
size_t length;
|
||||||
uint32_t frequency;
|
uint32_t frequency;
|
||||||
const uint8_t *const color_mapping;
|
const uint8_t *const color_mapping;
|
||||||
uint16_t reset_delay;
|
uint16_t reset_delay;
|
||||||
|
@ -115,9 +116,17 @@ static int ws2812_led_strip_update_channels(const struct device *dev, uint8_t *c
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t ws2812_led_strip_length(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct ws2812_led_strip_config *config = dev->config;
|
||||||
|
|
||||||
|
return config->length;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct led_strip_driver_api ws2812_led_strip_api = {
|
static const struct led_strip_driver_api ws2812_led_strip_api = {
|
||||||
.update_rgb = ws2812_led_strip_update_rgb,
|
.update_rgb = ws2812_led_strip_update_rgb,
|
||||||
.update_channels = ws2812_led_strip_update_channels,
|
.update_channels = ws2812_led_strip_update_channels,
|
||||||
|
.length = ws2812_led_strip_length,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -190,6 +199,7 @@ static int ws2812_rpi_pico_pio_init(const struct device *dev)
|
||||||
.piodev = DEVICE_DT_GET(DT_PARENT(DT_PARENT(node))), \
|
.piodev = DEVICE_DT_GET(DT_PARENT(DT_PARENT(node))), \
|
||||||
.gpio_pin = DT_GPIO_PIN_BY_IDX(node, gpios, 0), \
|
.gpio_pin = DT_GPIO_PIN_BY_IDX(node, gpios, 0), \
|
||||||
.num_colors = DT_PROP_LEN(node, color_mapping), \
|
.num_colors = DT_PROP_LEN(node, color_mapping), \
|
||||||
|
.length = DT_PROP(node, chain_length), \
|
||||||
.color_mapping = ws2812_led_strip_##node##_color_mapping, \
|
.color_mapping = ws2812_led_strip_##node##_color_mapping, \
|
||||||
.reset_delay = DT_PROP(node, reset_delay), \
|
.reset_delay = DT_PROP(node, reset_delay), \
|
||||||
.frequency = DT_PROP(node, frequency), \
|
.frequency = DT_PROP(node, frequency), \
|
||||||
|
|
|
@ -44,6 +44,7 @@ struct ws2812_spi_cfg {
|
||||||
uint8_t zero_frame;
|
uint8_t zero_frame;
|
||||||
uint8_t num_colors;
|
uint8_t num_colors;
|
||||||
const uint8_t *color_mapping;
|
const uint8_t *color_mapping;
|
||||||
|
size_t length;
|
||||||
uint16_t reset_delay;
|
uint16_t reset_delay;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -160,6 +161,13 @@ static int ws2812_strip_update_channels(const struct device *dev,
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t ws2812_strip_length(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct ws2812_spi_cfg *cfg = dev_cfg(dev);
|
||||||
|
|
||||||
|
return cfg->length;
|
||||||
|
}
|
||||||
|
|
||||||
static int ws2812_spi_init(const struct device *dev)
|
static int ws2812_spi_init(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct ws2812_spi_cfg *cfg = dev_cfg(dev);
|
const struct ws2812_spi_cfg *cfg = dev_cfg(dev);
|
||||||
|
@ -191,6 +199,7 @@ static int ws2812_spi_init(const struct device *dev)
|
||||||
static const struct led_strip_driver_api ws2812_spi_api = {
|
static const struct led_strip_driver_api ws2812_spi_api = {
|
||||||
.update_rgb = ws2812_strip_update_rgb,
|
.update_rgb = ws2812_strip_update_rgb,
|
||||||
.update_channels = ws2812_strip_update_channels,
|
.update_channels = ws2812_strip_update_channels,
|
||||||
|
.length = ws2812_strip_length,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define WS2812_SPI_NUM_PIXELS(idx) \
|
#define WS2812_SPI_NUM_PIXELS(idx) \
|
||||||
|
@ -231,6 +240,7 @@ static const struct led_strip_driver_api ws2812_spi_api = {
|
||||||
.zero_frame = WS2812_SPI_ZERO_FRAME(idx), \
|
.zero_frame = WS2812_SPI_ZERO_FRAME(idx), \
|
||||||
.num_colors = WS2812_NUM_COLORS(idx), \
|
.num_colors = WS2812_NUM_COLORS(idx), \
|
||||||
.color_mapping = ws2812_spi_##idx##_color_mapping, \
|
.color_mapping = ws2812_spi_##idx##_color_mapping, \
|
||||||
|
.length = DT_INST_PROP(idx, chain_length), \
|
||||||
.reset_delay = WS2812_RESET_DELAY(idx), \
|
.reset_delay = WS2812_RESET_DELAY(idx), \
|
||||||
}; \
|
}; \
|
||||||
\
|
\
|
||||||
|
|
|
@ -2,4 +2,4 @@ description: APA102 SPI LED strip
|
||||||
|
|
||||||
compatible: "apa,apa102"
|
compatible: "apa,apa102"
|
||||||
|
|
||||||
include: spi-device.yaml
|
include: [spi-device.yaml, led-strip.yaml]
|
||||||
|
|
|
@ -5,4 +5,4 @@ description: GreeLed LPD8803 SPI LED strip
|
||||||
|
|
||||||
compatible: "greeled,lpd8803"
|
compatible: "greeled,lpd8803"
|
||||||
|
|
||||||
include: spi-device.yaml
|
include: [spi-device.yaml, led-strip.yaml]
|
||||||
|
|
|
@ -5,4 +5,4 @@ description: GreeLed LPD8806 SPI LED strip
|
||||||
|
|
||||||
compatible: "greeled,lpd8806"
|
compatible: "greeled,lpd8806"
|
||||||
|
|
||||||
include: spi-device.yaml
|
include: [spi-device.yaml, led-strip.yaml]
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2017 Linaro Limited
|
* Copyright (c) 2017 Linaro Limited
|
||||||
|
* Copyright (c) 2024 Jamie McCrae
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
@ -71,6 +72,14 @@ typedef int (*led_api_update_channels)(const struct device *dev,
|
||||||
uint8_t *channels,
|
uint8_t *channels,
|
||||||
size_t num_channels);
|
size_t num_channels);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef led_api_length
|
||||||
|
* @brief Callback API for getting length of an LED strip.
|
||||||
|
*
|
||||||
|
* @see led_strip_length() for argument descriptions.
|
||||||
|
*/
|
||||||
|
typedef size_t (*led_api_length)(const struct device *dev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief LED strip driver API
|
* @brief LED strip driver API
|
||||||
*
|
*
|
||||||
|
@ -79,6 +88,7 @@ typedef int (*led_api_update_channels)(const struct device *dev,
|
||||||
__subsystem struct led_strip_driver_api {
|
__subsystem struct led_strip_driver_api {
|
||||||
led_api_update_rgb update_rgb;
|
led_api_update_rgb update_rgb;
|
||||||
led_api_update_channels update_channels;
|
led_api_update_channels update_channels;
|
||||||
|
led_api_length length;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -131,6 +141,21 @@ static inline int led_strip_update_channels(const struct device *dev,
|
||||||
return api->update_channels(dev, channels, num_channels);
|
return api->update_channels(dev, channels, num_channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Mandatory function to get chain length (in pixels) of an LED strip device.
|
||||||
|
*
|
||||||
|
* @param dev LED strip device.
|
||||||
|
*
|
||||||
|
* @retval Length of LED strip device.
|
||||||
|
*/
|
||||||
|
static inline size_t led_strip_length(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct led_strip_driver_api *api =
|
||||||
|
(const struct led_strip_driver_api *)dev->api;
|
||||||
|
|
||||||
|
return api->length(dev);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue