mirror of
https://github.com/ByteWelder/Tactility.git
synced 2026-10-17 02:45:05 +00:00
89 lines
3.6 KiB
Markdown
89 lines
3.6 KiB
Markdown
# 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.
|
|
|
|
```dts
|
|
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
|
|
|
|
```c
|
|
#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.
|
|
|
|
```c
|
|
#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 is `LED_STRIP_TYPE`.
|