diff options
author | Drashna Jaelre <drashna@live.com> | 2020-01-05 19:04:55 -0800 |
---|---|---|
committer | Florian Didron <fdidron@users.noreply.github.com> | 2020-01-09 08:57:11 +0900 |
commit | df91396be99ea4bd916c8671d233d75d3d67aa18 (patch) | |
tree | 33325a06ad2caf8c5b0e9206733719d9c4b938d8 /quantum | |
parent | 81126b6673313dc5e40ed92cc67f85b430003894 (diff) |
WS2812 Overhaul (#210)
* ARM - ws2812 bitbang (#7173)
* Initial ARM bitbang ws2812 driver
* Unify chibios platform to run rgblight_task
* Remove 'avr only' comments from ws2812 docs
* Remove 'avr only' comments from ws2812 docs
* Unify chibios platform to run rgblight_task - review comments
* Remove debug flags from keymap
* Add comments from review
* Add defines for STM32L0XX
* Attempt to get arm ws2812 working on multiple gcc versions
* Support RGBLIGHT_SLEEP when ChibiOS boards suspend (#7280)
Copypasta from the AVR suspend implementation with a Teensy-specific
hack removed
* Unify RGB and RGBW commands (#7297)
* Fix unicode in comments
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Remove separate RGBW implementation for a unified function
* Set White to 0 in RGBW LEDs
This is just to get this working, later, proper brightness can be handled elsewhere.
* Use us instead of nanoseconds(?) since it renders correctly on web
* Remove RGBW function from arm/ws2812.h
* Remove RGBW function from arm/ws2812.c
* Formatting changes
* Add doc info
* Remove force of debug on within rgblight - causes lockups waiting for hid_listen (#7330)
* Move Ergodox EZ RGB Light code to custom driver (#7309)
* Move Ergodox EZ RGB code to custom driver
Also implements full addressing of Ergodox EZ's LED Strip, as written by seebs
Co-authored-by: Seebs <seebs@seebs.net>
* Make Clipping range accessible for custom drivers
* Remove RGBW_BB_TWI from driver and docs
* Revert changes to clipping range support
* Use just rgblight_set instead of full custom driver
* Convert to i2c_master commands
* Rename rgblight driver and clean up includes
* Use White channel on RGBW LEDs
* SPI DMA based RGB Underglow for STM32 (#7674)
* Initial stash of ws2812 spi driver
* Update comment, add sync backup plan
* Add testing notes to spi ws2812 driver
* Align RGBW error messages
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Jonathan Rascher <jon@bcat.name>
Co-authored-by: Florian Didron <fdidron@users.noreply.github.com>
Diffstat (limited to 'quantum')
-rw-r--r-- | quantum/color.c | 15 | ||||
-rw-r--r-- | quantum/color.h | 4 | ||||
-rw-r--r-- | quantum/rgb_matrix_drivers.c | 3 | ||||
-rw-r--r-- | quantum/rgblight.c | 34 | ||||
-rw-r--r-- | quantum/stm32/proton_c.mk | 6 |
5 files changed, 55 insertions, 7 deletions
diff --git a/quantum/color.c b/quantum/color.c index 1f398e2403..85a6d52cf0 100644 --- a/quantum/color.c +++ b/quantum/color.c @@ -85,3 +85,18 @@ RGB hsv_to_rgb(HSV hsv) { return rgb; } + + +#ifdef RGBW +#ifndef MIN +# define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif +void convert_rgb_to_rgbw(LED_TYPE *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/quantum/color.h b/quantum/color.h index 6781646628..8fe671b93d 100644 --- a/quantum/color.h +++ b/quantum/color.h @@ -65,4 +65,8 @@ typedef struct PACKED { RGB hsv_to_rgb(HSV hsv); +#ifdef RGBW +void convert_rgb_to_rgbw(LED_TYPE *led); +#endif + #endif // COLOR_H diff --git a/quantum/rgb_matrix_drivers.c b/quantum/rgb_matrix_drivers.c index 503f97014f..ea41b0d396 100644 --- a/quantum/rgb_matrix_drivers.c +++ b/quantum/rgb_matrix_drivers.c @@ -112,6 +112,9 @@ static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) { led[i].r = r; led[i].g = g; led[i].b = b; +# ifdef RGBW + convert_rgb_to_rgbw(led[i]); +# endif } static void setled_all(uint8_t r, uint8_t g, uint8_t b) { diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 1c197827f2..07c3c9770b 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -126,6 +126,9 @@ void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1) { (*led1).r = r; (*led1).g = g; (*led1).b = b; +#ifdef RGBW + (*led1).w = 0; +#endif } void rgblight_check_config(void) { @@ -186,7 +189,6 @@ void rgblight_init(void) { return; } - debug_enable = 1; // Debug ON! dprintf("rgblight_init called.\n"); dprintf("rgblight_init start!\n"); if (!eeconfig_is_enabled()) { @@ -514,6 +516,9 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { led[i].r = r; led[i].g = g; led[i].b = b; +#ifdef RGBW + led[i].w = 0; +#endif } rgblight_set(); } @@ -526,6 +531,9 @@ void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index) { led[index].r = r; led[index].g = g; led[index].b = b; +#ifdef RGBW + led[index].w = 0; +#endif rgblight_set(); } @@ -560,6 +568,9 @@ void rgblight_setrgb_range(uint8_t r, uint8_t g, uint8_t b, uint8_t start, uint8 led[i].r = r; led[i].g = g; led[i].b = b; +#ifdef RGBW + led[i].w = 0; +#endif } rgblight_set(); wait_ms(1); @@ -595,6 +606,9 @@ void rgblight_set(void) { led[i].r = 0; led[i].g = 0; led[i].b = 0; +# ifdef RGBW + led[i].w = 0; +# endif } } # ifdef RGBLIGHT_LED_MAP @@ -606,11 +620,12 @@ void rgblight_set(void) { # else start_led = led + clipping_start_pos; # endif -# ifdef RGBW - ws2812_setleds_rgbw(start_led, num_leds); -# else +#ifdef RGBW + for (uint8_t i = 0; i < num_leds; i++) { + convert_rgb_to_rgbw(&start_led[i]); + } +#endif ws2812_setleds(start_led, num_leds); -# endif } #endif @@ -908,6 +923,9 @@ void rgblight_effect_snake(animation_status_t *anim) { ledp->r = 0; ledp->g = 0; ledp->b = 0; +# ifdef RGBW + ledp->w = 0; +# endif for (j = 0; j < RGBLIGHT_EFFECT_SNAKE_LENGTH; j++) { k = pos + j * increment; if (k > RGBLED_NUM) { @@ -965,6 +983,9 @@ void rgblight_effect_knight(animation_status_t *anim) { led[i].r = 0; led[i].g = 0; led[i].b = 0; +# ifdef RGBW + led[i].w = 0; +# endif } // Determine which LEDs should be lit up for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) { @@ -976,6 +997,9 @@ void rgblight_effect_knight(animation_status_t *anim) { led[cur].r = 0; led[cur].g = 0; led[cur].b = 0; +# ifdef RGBW + led[cur].w = 0; +# endif } } rgblight_set(); diff --git a/quantum/stm32/proton_c.mk b/quantum/stm32/proton_c.mk index ad73e81355..ff28a4cb5d 100644 --- a/quantum/stm32/proton_c.mk +++ b/quantum/stm32/proton_c.mk @@ -2,10 +2,12 @@ # These are defaults based on what has been implemented for ARM boards AUDIO_ENABLE = yes -RGBLIGHT_ENABLE = no +WS2812_DRIVER = bitbang # Force task driven PWM until ARM can provide automatic configuration -BACKLIGHT_DRIVER = software +ifneq ($(strip $(BACKLIGHT_ENABLE)), no) + BACKLIGHT_ENABLE = software +endif # The rest of these settings shouldn't change |