diff options
author | Ryan <[email protected]> | 2024-10-06 19:01:07 +1100 |
---|---|---|
committer | GitHub <[email protected]> | 2024-10-06 21:01:07 +1300 |
commit | 208ebf54a905ce6e4e563a6811eca8c8dc8b17e1 (patch) | |
tree | 7bb6a8bdb5a641263c39236d0b655825ac37307b /drivers | |
parent | 43e82ed5c72b7386ca91d1bd363ee092f77c1b9a (diff) | |
download | qmk_firmware-208ebf54a905ce6e4e563a6811eca8c8dc8b17e1.tar.gz qmk_firmware-208ebf54a905ce6e4e563a6811eca8c8dc8b17e1.zip |
WS2812 API rework (#24364)
* Begin WS2812 API rework
* Move RGBW conversion, clean up color.h, fix RGBW for AVR bitbang
* Formatting & update PS2AVRGB I2C driver (untested)
* Tested ARM bitbang RGB+RGBW
* Tested ARM SPI RGB - RGBW not working
* Tested ARM PWM RGB+RGBW
* Tested RP2040 PIO driver RGB+RGBW
* Update RGBLight
* Formatting
* Fix BM60HSRGB rev2
* Fix oddforge/vea
* Fix 1k and XD002 RGBLite
* Fix model_m/mschwingen
* Fix handwired/promethium
* Rename `WS2812_LED_TOTAL` for BM60HSRGB
* Fix work_louder boards
* Fix dawn60
* Fix rgbkb/pan
* Fix neson_design/700e and n6
* Fix ergodox_ez/shine
* ergodox_ez/shine: invert indices for left half
* Fix matrix/abelx
* Fix matrix/m20add
* Remove custom rgblight driver for matrix/noah - should be done with lighting layers
* Fix LED indexes for RGBLight split
* Rename `convert_rgb_to_rgbw()` to `ws2812_rgb_to_rgbw()`
* Update WS2812 API docs
* `ergodox_ez/shine`: simplify LED index calculation
* LED/RGB Matrix: Add weak function for LED index resolution
* Bandaid fix for RGB Matrix splits not using WS2812
* `steelseries/prime_plus`: redo custom RGBLight driver
* Update keyboards/steelseries/prime_plus/rgblight_custom.c
Co-authored-by: Dasky <[email protected]>
---------
Co-authored-by: Dasky <[email protected]>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ws2812.c | 15 | ||||
-rw-r--r-- | drivers/ws2812.h | 45 |
2 files changed, 47 insertions, 13 deletions
diff --git a/drivers/ws2812.c b/drivers/ws2812.c new file mode 100644 index 0000000000..bf234c6f7d --- /dev/null +++ b/drivers/ws2812.c @@ -0,0 +1,15 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ws2812.h" + +#if defined(WS2812_RGBW) +void ws2812_rgb_to_rgbw(ws2812_led_t *led) { + // Determine lowest value in all three colors, put that into + // the white channel and then shift all colors by that amount + led->w = MIN(led->r, MIN(led->g, led->b)); + led->r -= led->w; + led->g -= led->w; + led->b -= led->w; +} +#endif diff --git a/drivers/ws2812.h b/drivers/ws2812.h index 993cce8ce4..8013e5bd2d 100644 --- a/drivers/ws2812.h +++ b/drivers/ws2812.h @@ -15,7 +15,7 @@ #pragma once -#include "quantum/color.h" +#include "util.h" /* * The WS2812 datasheets define T1H 900ns, T0H 350ns, T1L 350ns, T0L 900ns. Hence, by default, these @@ -62,17 +62,36 @@ # define WS2812_LED_COUNT RGB_MATRIX_LED_COUNT #endif +#define WS2812_BYTE_ORDER_RGB 0 +#define WS2812_BYTE_ORDER_GRB 1 +#define WS2812_BYTE_ORDER_BGR 2 + +#ifndef WS2812_BYTE_ORDER +# define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_GRB +#endif + +typedef struct PACKED ws2812_led_t { +#if (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_GRB) + uint8_t g; + uint8_t r; + uint8_t b; +#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_RGB) + uint8_t r; + uint8_t g; + uint8_t b; +#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR) + uint8_t b; + uint8_t g; + uint8_t r; +#endif +#ifdef WS2812_RGBW + uint8_t w; +#endif +} ws2812_led_t; + void ws2812_init(void); +void ws2812_set_color(int index, uint8_t red, uint8_t green, uint8_t blue); +void ws2812_set_color_all(uint8_t red, uint8_t green, uint8_t blue); +void ws2812_flush(void); -/* User Interface - * - * Input: - * ledarray: An array of GRB data describing the LED colors - * number_of_leds: The number of LEDs to write - * - * The functions will perform the following actions: - * - Set the data-out pin as output - * - Send out the LED data - * - Wait 50us to reset the LEDs - */ -void ws2812_setleds(rgb_led_t *ledarray, uint16_t number_of_leds); +void ws2812_rgb_to_rgbw(ws2812_led_t *led); |