3.6 KiB
esp32-led-strip-module
WS2812-compatible RGB LED strip driver for Tactility. It uses ESP-IDF's RMT peripheral to transmit pixel data and provides per-pixel and range color control, brightness adjustment, and gamma-corrected output.
Devicetree Configuration
Declare the strip with the compatible string "espressif,esp32-led-strip". pin-data references the GPIO device and pin used for the data signal; led-count is the number of LEDs on the strip.
ws2812 {
compatible = "espressif,esp32-led-strip";
pin-data = <&gpio0 14 GPIO_FLAG_NONE>;
led-count = <8>;
};
The driver reads these properties into LedStripConfig.
API
Include <tactility/drivers/led_strip.h>. The kernel API operates on a struct Device * and returns error_t; successful calls return ERROR_NONE.
| Function | Description |
|---|---|
led_strip_set_single_led_color |
Set one LED using global brightness |
led_strip_set_single_led_color_and_brightness |
Set one LED with an explicit brightness |
led_strip_set_led_range_color |
Set a range from an array of LedRgb values using global brightness |
led_strip_set_led_range_color_and_brightness |
Set a range from an array with explicit brightness |
led_strip_fill_led_range_color |
Fill a range using global brightness |
led_strip_fill_led_range_color_and_brightness |
Fill a range with explicit brightness |
led_strip_set_brightness |
Set global brightness |
led_strip_show |
Transmit buffered pixel values to the strip |
led_strip_clear |
Turn off all LEDs |
led_strip_get_length |
Get the configured LED count |
LED indices and range offsets are zero-based. Color channels in struct LedRgb range from 0 to 255. Global and per-operation brightness also range from 0 (off) to 255 (full); the default global brightness is 255. Call led_strip_show() after setting colors to transmit the updated buffer. led_strip_clear() clears and refreshes the strip.
Usage Example
#include <tactility/drivers/led_strip.h>
void led_demo(struct Device *strip) {
uint16_t length = 0;
if (led_strip_get_length(strip, &length) != ERROR_NONE || length == 0) {
return;
}
led_strip_set_brightness(strip, 128); // About 50% brightness
led_strip_fill_led_range_color(strip, 0, length, LED_RGB_COLOR_GREEN);
led_strip_show(strip);
led_strip_set_single_led_color(strip, 0, LED_RGB_COLOR_RED);
led_strip_show(strip);
led_strip_clear(strip);
}
Using Literal RGB Values
Color macros are optional. Initialize struct LedRgb directly when a color is calculated or loaded at runtime. This example assumes the strip has at least four LEDs.
#include <tactility/drivers/led_strip.h>
void show_custom_colors(struct Device *strip) {
const struct LedRgb colors[] = {
{ .r = 255, .g = 32, .b = 0 },
{ .r = 0, .g = 180, .b = 64 },
{ .r = 24, .g = 48, .b = 255 },
{ .r = 200, .g = 80, .b = 160 }
};
led_strip_set_led_range_color_and_brightness(strip, 0, 4, colors, 192);
led_strip_show(strip);
}
Color Presets
The kernel header also provides LED_RGB_COLOR_* macros such as LED_RGB_COLOR_RED, LED_RGB_COLOR_GREEN, and LED_RGB_COLOR_WHITE, plus LED_COLOR_RGB_CUSTOM(r, g, b) for a custom color. These expand to struct LedRgb values.
Implementation Notes
- The driver configures the ESP-IDF RMT backend for WS2812 RGB output in GRB component order.
- An 8-bit gamma correction lookup table is applied after brightness scaling.
- The devicetree compatible string and driver registration are
"espressif,esp32-led-strip"; the kernel device type isLED_STRIP_TYPE.