diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 60f1cbd837f..d793d5faf58 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -313,6 +313,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]')) SRC += $(QUANTUM_DIR)/color.c SRC += $(QUANTUM_DIR)/rgblight/rgblight.c + SRC += $(QUANTUM_DIR)/rgblight/rgblight_drivers.c CIE1931_CURVE := yes RGB_KEYCODES_ENABLE := yes endif diff --git a/drivers/led/apa102.c b/drivers/led/apa102.c index 527519eb8a9..4d8f69cdcd0 100644 --- a/drivers/led/apa102.c +++ b/drivers/led/apa102.c @@ -71,11 +71,6 @@ void apa102_setleds(rgb_led_t *start_led, uint16_t num_leds) { apa102_end_frame(num_leds); } -// Overwrite the default rgblight_call_driver to use apa102 driver -void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) { - apa102_setleds(start_led, num_leds); -} - void static apa102_init(void) { setPinOutput(APA102_DI_PIN); setPinOutput(APA102_CI_PIN); diff --git a/keyboards/dp60/keymaps/indicator/indicator.c b/keyboards/dp60/keymaps/indicator/indicator.c index 02450ce68d9..d7b628cc56f 100644 --- a/keyboards/dp60/keymaps/indicator/indicator.c +++ b/keyboards/dp60/keymaps/indicator/indicator.c @@ -14,10 +14,8 @@ along with this program. If not, see . */ -#include "dp60.h" - -#include "rgblight.h" - +#include QMK_KEYBOARD_H +#include "ws2812.h" // caps led const rgblight_segment_t PROGMEM dp60_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( @@ -72,13 +70,17 @@ extern rgblight_config_t rgblight_config; extern void rgblight_layers_write(void); extern void indicator_write(rgb_led_t *start_led, uint8_t num_leds); -void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) +void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) { ws2812_setleds(start_led, RGBLED_NUM-RGB_INDICATOR_NUM); indicator_write(start_led + (RGBLED_NUM - RGB_INDICATOR_NUM), RGB_INDICATOR_NUM); } +const rgblight_driver_t rgblight_driver = { + .setleds = setleds_custom, +}; + void led_update_ports(led_t led_state) { rgblight_set_layer_state(0, led_state.caps_lock); rgblight_set_layer_state(1, led_state.scroll_lock); diff --git a/keyboards/dp60/keymaps/indicator/rules.mk b/keyboards/dp60/keymaps/indicator/rules.mk index a8891659f72..853666e4f4a 100644 --- a/keyboards/dp60/keymaps/indicator/rules.mk +++ b/keyboards/dp60/keymaps/indicator/rules.mk @@ -1,4 +1,6 @@ RGBLIGHT_ENABLE = yes # Use RGB underglow light +RGBLIGHT_DRIVER = custom +WS2812_DRIVER_REQUIRED = yes SRC += indicator.c led_driver.c diff --git a/keyboards/ergodox_ez/led_i2c.c b/keyboards/ergodox_ez/led_i2c.c index 23ef91b74fe..5b50e717b05 100644 --- a/keyboards/ergodox_ez/led_i2c.c +++ b/keyboards/ergodox_ez/led_i2c.c @@ -22,7 +22,7 @@ along with this program. If not, see . # include "ergodox_ez.h" -void rgblight_call_driver(rgb_led_t *led, uint8_t led_num) { +void setleds_custom(rgb_led_t *led, uint16_t led_num) { i2c_init(); i2c_start(0x84, ERGODOX_EZ_I2C_TIMEOUT); int i = 0; @@ -51,5 +51,8 @@ void rgblight_call_driver(rgb_led_t *led, uint8_t led_num) { ws2812_setleds(led, led_num); } +const rgblight_driver_t rgblight_driver = { + .setleds = setleds_custom, +}; #endif // RGBLIGHT_ENABLE diff --git a/keyboards/matrix/abelx/abelx.c b/keyboards/matrix/abelx/abelx.c index ea3e57aeafa..7d964c5d900 100644 --- a/keyboards/matrix/abelx/abelx.c +++ b/keyboards/matrix/abelx/abelx.c @@ -57,6 +57,7 @@ void housekeeping_task_kb(void) { #ifdef RGBLIGHT_ENABLE #include "rgblight.h" +#include "ws2812.h" #include "i2c_master.h" const aw9523b_led g_aw9523b_leds[AW9523B_RGB_NUM] = { @@ -66,7 +67,7 @@ const aw9523b_led g_aw9523b_leds[AW9523B_RGB_NUM] = { {AW9523B_P07_PWM, AW9523B_P06_PWM, AW9523B_P05_PWM}, }; -void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) +void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) { uint8_t num = num_leds < AW9523B_RGB_NUM ? num_leds : AW9523B_RGB_NUM; @@ -77,6 +78,10 @@ void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) } } +const rgblight_driver_t rgblight_driver = { + .setleds = setleds_custom, +}; + #endif static uint16_t caps_lock_pin = DEF_PIN(TCA6424_PORT2, 3); diff --git a/keyboards/matrix/abelx/info.json b/keyboards/matrix/abelx/info.json index 35bc0598109..b9aa23b7566 100644 --- a/keyboards/matrix/abelx/info.json +++ b/keyboards/matrix/abelx/info.json @@ -10,6 +10,7 @@ }, "rgblight": { "led_count": 9, + "driver": "custom", "animations": { "breathing": true, "rainbow_mood": true, diff --git a/keyboards/matrix/abelx/rules.mk b/keyboards/matrix/abelx/rules.mk index 1c2fc05ffee..83142dd71c6 100644 --- a/keyboards/matrix/abelx/rules.mk +++ b/keyboards/matrix/abelx/rules.mk @@ -46,3 +46,4 @@ CUSTOM_MATRIX = lite # project specific files SRC += matrix.c tca6424.c aw9523b.c I2C_DRIVER_REQUIRED = yes +WS2812_DRIVER_REQUIRED = yes diff --git a/keyboards/matrix/m20add/info.json b/keyboards/matrix/m20add/info.json index 972aab9d0d2..6e1a1c493f3 100644 --- a/keyboards/matrix/m20add/info.json +++ b/keyboards/matrix/m20add/info.json @@ -10,6 +10,7 @@ }, "rgblight": { "led_count": 20, + "driver": "custom", "animations": { "breathing": true, "rainbow_mood": true, diff --git a/keyboards/matrix/m20add/rgb_ring.c b/keyboards/matrix/m20add/rgb_ring.c index f3fbe83d72c..f32875cf4f7 100644 --- a/keyboards/matrix/m20add/rgb_ring.c +++ b/keyboards/matrix/m20add/rgb_ring.c @@ -357,7 +357,7 @@ static void custom_effects(void) effect_funcs[rgb_ring.effect](); } -void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) +void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) { if (rgb_ring.state != RING_STATE_QMK) { return; @@ -368,6 +368,10 @@ void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) } } +const rgblight_driver_t rgblight_driver = { + .setleds = setleds_custom, +}; + void rgb_ring_init(void) { diff --git a/keyboards/neson_design/700e/700e.c b/keyboards/neson_design/700e/700e.c index 9def73d6a44..31f88a71f9b 100644 --- a/keyboards/neson_design/700e/700e.c +++ b/keyboards/neson_design/700e/700e.c @@ -20,6 +20,7 @@ #include "quantum.h" #include "i2c_master.h" #include "drivers/led/issi/is31fl3731.h" +#include "ws2812.h" enum { SELF_TESTING, @@ -336,7 +337,7 @@ void housekeeping_task_kb(void) housekeeping_task_user(); } -void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) +void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) { if (rgb_state.state != NORMAL) return; @@ -353,6 +354,10 @@ void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) ws2812_setleds(leds, 4); } +const rgblight_driver_t rgblight_driver = { + .setleds = setleds_custom, +}; + bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); diff --git a/keyboards/neson_design/700e/info.json b/keyboards/neson_design/700e/info.json index 12a979ab117..3b74e9609a9 100644 --- a/keyboards/neson_design/700e/info.json +++ b/keyboards/neson_design/700e/info.json @@ -20,6 +20,7 @@ "saturation_steps": 8, "brightness_steps": 8, "led_count": 68, + "driver": "custom", "animations": { "breathing": true, "rainbow_mood": true, diff --git a/keyboards/neson_design/700e/rules.mk b/keyboards/neson_design/700e/rules.mk index 5650ed1fee7..dd1db38babf 100644 --- a/keyboards/neson_design/700e/rules.mk +++ b/keyboards/neson_design/700e/rules.mk @@ -12,4 +12,5 @@ RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow NO_USB_STARTUP_CHECK = yes QUANTUM_LIB_SRC += drivers/led/issi/is31fl3731.c +WS2812_DRIVER_REQUIRED = yes I2C_DRIVER_REQUIRED = yes diff --git a/keyboards/neson_design/n6/info.json b/keyboards/neson_design/n6/info.json index 3f383b4f8fe..c48824d80f3 100644 --- a/keyboards/neson_design/n6/info.json +++ b/keyboards/neson_design/n6/info.json @@ -23,6 +23,7 @@ "saturation_steps": 8, "brightness_steps": 8, "led_count": 65, + "driver": "custom", "max_brightness": 192, "animations": { "breathing": true, diff --git a/keyboards/neson_design/n6/n6.c b/keyboards/neson_design/n6/n6.c index 38b634eeb73..b878b9368dd 100644 --- a/keyboards/neson_design/n6/n6.c +++ b/keyboards/neson_design/n6/n6.c @@ -20,6 +20,7 @@ #include "quantum.h" #include "i2c_master.h" #include "drivers/led/issi/is31fl3731.h" +#include "ws2812.h" enum { SELF_TESTING, @@ -338,7 +339,7 @@ void housekeeping_task_kb(void) housekeeping_task_user(); } -void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) +void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) { if (rgb_state.state != NORMAL) return; @@ -348,6 +349,10 @@ void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) ws2812_setleds(start_led+IS31FL3731_LED_COUNT, 1); } +const rgblight_driver_t rgblight_driver = { + .setleds = setleds_custom, +}; + bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); diff --git a/keyboards/neson_design/n6/rules.mk b/keyboards/neson_design/n6/rules.mk index a3e4abe6cd9..4c9ce453526 100644 --- a/keyboards/neson_design/n6/rules.mk +++ b/keyboards/neson_design/n6/rules.mk @@ -11,4 +11,5 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow QUANTUM_LIB_SRC += drivers/led/issi/is31fl3731.c +WS2812_DRIVER_REQUIRED = yes I2C_DRIVER_REQUIRED = yes diff --git a/keyboards/neson_design/nico/info.json b/keyboards/neson_design/nico/info.json index 477ac3ba7cb..1c86d9a1ae8 100644 --- a/keyboards/neson_design/nico/info.json +++ b/keyboards/neson_design/nico/info.json @@ -25,7 +25,8 @@ "pin": "B0" }, "rgblight": { - "led_count": 5 + "led_count": 5, + "driver": "custom" }, "url": "", "usb": { diff --git a/keyboards/neson_design/nico/nico.c b/keyboards/neson_design/nico/nico.c index b4d15777b7f..5d84cb9e1be 100644 --- a/keyboards/neson_design/nico/nico.c +++ b/keyboards/neson_design/nico/nico.c @@ -18,6 +18,7 @@ */ #include "quantum.h" +#include "ws2812.h" #ifdef RGBLIGHT_ENABLE static bool alert = false; @@ -66,7 +67,7 @@ void housekeeping_task_kb(void) housekeeping_task_user(); } -void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) +void setleds_custom(rgb_led_t *start_led, uint16_t num_leds) { start_led[2].r = start_led[0].r; start_led[2].g = start_led[0].g; @@ -82,4 +83,7 @@ void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) ws2812_setleds(start_led, RGBLED_NUM); } +const rgblight_driver_t rgblight_driver = { + .setleds = setleds_custom, +}; #endif \ No newline at end of file diff --git a/keyboards/neson_design/nico/rules.mk b/keyboards/neson_design/nico/rules.mk index 6e7633bfe01..9a696492896 100644 --- a/keyboards/neson_design/nico/rules.mk +++ b/keyboards/neson_design/nico/rules.mk @@ -1 +1 @@ -# This file intentionally left blank +WS2812_DRIVER_REQUIRED = yes diff --git a/keyboards/work_louder/loop/info.json b/keyboards/work_louder/loop/info.json index eacbbbccbd4..4514192b6db 100644 --- a/keyboards/work_louder/loop/info.json +++ b/keyboards/work_louder/loop/info.json @@ -30,6 +30,7 @@ "pin": "F1" }, "rgblight": { + "driver": "custom", "max_brightness": 120, "sleep": true, "animations": { diff --git a/keyboards/work_louder/micro/info.json b/keyboards/work_louder/micro/info.json index d76e7aa0494..21c4bc0da86 100644 --- a/keyboards/work_louder/micro/info.json +++ b/keyboards/work_louder/micro/info.json @@ -21,6 +21,7 @@ }, "processor": "atmega32u4", "rgblight": { + "driver": "custom", "animations": { "alternating": false, "breathing": true, diff --git a/keyboards/work_louder/nano/info.json b/keyboards/work_louder/nano/info.json index ab064bd019e..7bbdb4e032e 100644 --- a/keyboards/work_louder/nano/info.json +++ b/keyboards/work_louder/nano/info.json @@ -27,6 +27,7 @@ }, "rgblight": { "led_count": 6, + "driver": "custom", "max_brightness": 120, "sleep": true, "animations": { diff --git a/keyboards/work_louder/numpad/info.json b/keyboards/work_louder/numpad/info.json index 0fa2bf2565d..9149fc77bb1 100644 --- a/keyboards/work_louder/numpad/info.json +++ b/keyboards/work_louder/numpad/info.json @@ -50,6 +50,7 @@ ] }, "rgblight": { + "driver": "custom", "animations": { "breathing": true, "knight": true, diff --git a/keyboards/work_louder/rgb_functions.c b/keyboards/work_louder/rgb_functions.c index b4d1a2ad729..9b395559714 100644 --- a/keyboards/work_louder/rgb_functions.c +++ b/keyboards/work_louder/rgb_functions.c @@ -24,9 +24,9 @@ #include "ws2812_bitbang.c" -void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) { - ws2812_setleds(start_led, num_leds); -} +const rgblight_driver_t rgblight_driver = { + .setleds = ws2812_setleds, +}; #endif #ifdef RGB_MATRIX_ENABLE diff --git a/keyboards/work_louder/work_board/info.json b/keyboards/work_louder/work_board/info.json index 1946b8bcf40..163271bf7aa 100644 --- a/keyboards/work_louder/work_board/info.json +++ b/keyboards/work_louder/work_board/info.json @@ -25,6 +25,7 @@ "pin": "D1" }, "rgblight": { + "driver": "custom", "max_brightness": 120, "sleep": true, "animations": { diff --git a/quantum/rgblight/rgblight.c b/quantum/rgblight/rgblight.c index 8ac886d441f..8a6c0547d02 100644 --- a/quantum/rgblight/rgblight.c +++ b/quantum/rgblight/rgblight.c @@ -900,12 +900,6 @@ void rgblight_wakeup(void) { #endif -__attribute__((weak)) void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) { - ws2812_setleds(start_led, num_leds); -} - -#ifndef RGBLIGHT_CUSTOM - void rgblight_set(void) { rgb_led_t *start_led; uint8_t num_leds = rgblight_ranges.clipping_num_leds; @@ -948,9 +942,8 @@ void rgblight_set(void) { convert_rgb_to_rgbw(&start_led[i]); } # endif - rgblight_call_driver(start_led, num_leds); + rgblight_driver.setleds(start_led, num_leds); } -#endif #ifdef RGBLIGHT_SPLIT /* for split keyboard master side */ diff --git a/quantum/rgblight/rgblight.h b/quantum/rgblight/rgblight.h index a222ab6b9fc..d2b8a24b1eb 100644 --- a/quantum/rgblight/rgblight.h +++ b/quantum/rgblight/rgblight.h @@ -160,6 +160,7 @@ enum RGBLIGHT_EFFECT_MODE { #include #include +#include "rgblight_drivers.h" #include "progmem.h" #include "eeconfig.h" #include "ws2812.h" diff --git a/quantum/rgblight/rgblight_drivers.c b/quantum/rgblight/rgblight_drivers.c new file mode 100644 index 00000000000..4b1086bfd3f --- /dev/null +++ b/quantum/rgblight/rgblight_drivers.c @@ -0,0 +1,17 @@ +#include "rgblight_drivers.h" + +#if defined(RGBLIGHT_WS2812) +# include "ws2812.h" + +const rgblight_driver_t rgblight_driver = { + .setleds = ws2812_setleds, +}; + +#elif defined(RGBLIGHT_APA102) +# include "apa102.h" + +const rgblight_driver_t rgblight_driver = { + .setleds = apa102_setleds, +}; + +#endif diff --git a/quantum/rgblight/rgblight_drivers.h b/quantum/rgblight/rgblight_drivers.h new file mode 100644 index 00000000000..9287237d867 --- /dev/null +++ b/quantum/rgblight/rgblight_drivers.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include "color.h" + +typedef struct { + void (*setleds)(rgb_led_t *ledarray, uint16_t number_of_leds); +} rgblight_driver_t; + +extern const rgblight_driver_t rgblight_driver;