mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-27 03:30:00 +01:00 
			
		
		
		
	Rework RGBLight driver system (#22529)
This commit is contained in:
		
							parent
							
								
									2acb426b8e
								
							
						
					
					
						commit
						17f36a21bf
					
				| @ -313,6 +313,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) | |||||||
|         OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]')) |         OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]')) | ||||||
|         SRC += $(QUANTUM_DIR)/color.c |         SRC += $(QUANTUM_DIR)/color.c | ||||||
|         SRC += $(QUANTUM_DIR)/rgblight/rgblight.c |         SRC += $(QUANTUM_DIR)/rgblight/rgblight.c | ||||||
|  |         SRC += $(QUANTUM_DIR)/rgblight/rgblight_drivers.c | ||||||
|         CIE1931_CURVE := yes |         CIE1931_CURVE := yes | ||||||
|         RGB_KEYCODES_ENABLE := yes |         RGB_KEYCODES_ENABLE := yes | ||||||
|     endif |     endif | ||||||
|  | |||||||
| @ -71,11 +71,6 @@ void apa102_setleds(rgb_led_t *start_led, uint16_t num_leds) { | |||||||
|     apa102_end_frame(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) { | void static apa102_init(void) { | ||||||
|     setPinOutput(APA102_DI_PIN); |     setPinOutput(APA102_DI_PIN); | ||||||
|     setPinOutput(APA102_CI_PIN); |     setPinOutput(APA102_CI_PIN); | ||||||
|  | |||||||
| @ -14,10 +14,8 @@ | |||||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 |     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "dp60.h" | #include QMK_KEYBOARD_H | ||||||
| 
 | #include "ws2812.h" | ||||||
| #include "rgblight.h" |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| // caps led
 | // caps led
 | ||||||
| const rgblight_segment_t PROGMEM dp60_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( | 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              rgblight_layers_write(void); | ||||||
| extern void              indicator_write(rgb_led_t *start_led, uint8_t num_leds); | 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); |     ws2812_setleds(start_led, RGBLED_NUM-RGB_INDICATOR_NUM); | ||||||
| 
 | 
 | ||||||
|     indicator_write(start_led + (RGBLED_NUM - RGB_INDICATOR_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) { | void led_update_ports(led_t led_state) { | ||||||
|     rgblight_set_layer_state(0, led_state.caps_lock); |     rgblight_set_layer_state(0, led_state.caps_lock); | ||||||
|     rgblight_set_layer_state(1, led_state.scroll_lock); |     rgblight_set_layer_state(1, led_state.scroll_lock); | ||||||
|  | |||||||
| @ -1,4 +1,6 @@ | |||||||
| 
 | 
 | ||||||
| RGBLIGHT_ENABLE = yes       	# Use RGB underglow light | RGBLIGHT_ENABLE = yes       	# Use RGB underglow light | ||||||
|  | RGBLIGHT_DRIVER = custom | ||||||
|  | WS2812_DRIVER_REQUIRED = yes | ||||||
| 
 | 
 | ||||||
| SRC += indicator.c led_driver.c | SRC += indicator.c led_driver.c | ||||||
|  | |||||||
| @ -21,8 +21,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | |||||||
| #ifdef RGBLIGHT_ENABLE | #ifdef RGBLIGHT_ENABLE | ||||||
| 
 | 
 | ||||||
| #    include "ergodox_ez.h" | #    include "ergodox_ez.h" | ||||||
|  | #    include "ws2812.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_init(); | ||||||
|     i2c_start(0x84, ERGODOX_EZ_I2C_TIMEOUT); |     i2c_start(0x84, ERGODOX_EZ_I2C_TIMEOUT); | ||||||
|     int i = 0; |     int i = 0; | ||||||
| @ -51,5 +52,8 @@ void rgblight_call_driver(rgb_led_t *led, uint8_t led_num) { | |||||||
|     ws2812_setleds(led, led_num); |     ws2812_setleds(led, led_num); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const rgblight_driver_t rgblight_driver = { | ||||||
|  |     .setleds = setleds_custom, | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| #endif  // RGBLIGHT_ENABLE
 | #endif  // RGBLIGHT_ENABLE
 | ||||||
|  | |||||||
| @ -2,5 +2,8 @@ | |||||||
|     "keyboard_name": "ErgoDox EZ Shine", |     "keyboard_name": "ErgoDox EZ Shine", | ||||||
|     "usb": { |     "usb": { | ||||||
|         "pid": "0x4975" |         "pid": "0x4975" | ||||||
|  |     }, | ||||||
|  |     "rgblight": { | ||||||
|  |         "driver": "custom" | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1 +1,2 @@ | |||||||
| RGBLIGHT_ENABLE = yes | RGBLIGHT_ENABLE = yes | ||||||
|  | WS2812_DRIVER_REQUIRED = yes | ||||||
|  | |||||||
| @ -57,6 +57,7 @@ void housekeeping_task_kb(void) { | |||||||
| 
 | 
 | ||||||
| #ifdef RGBLIGHT_ENABLE | #ifdef RGBLIGHT_ENABLE | ||||||
| #include "rgblight.h" | #include "rgblight.h" | ||||||
|  | #include "ws2812.h" | ||||||
| #include "i2c_master.h" | #include "i2c_master.h" | ||||||
| 
 | 
 | ||||||
| const aw9523b_led g_aw9523b_leds[AW9523B_RGB_NUM] = { | 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}, |     {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; |     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 | #endif | ||||||
| 
 | 
 | ||||||
| static uint16_t caps_lock_pin = DEF_PIN(TCA6424_PORT2, 3); | static uint16_t caps_lock_pin = DEF_PIN(TCA6424_PORT2, 3); | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ | |||||||
|   }, |   }, | ||||||
|   "rgblight": { |   "rgblight": { | ||||||
|     "led_count": 9, |     "led_count": 9, | ||||||
|  |     "driver": "custom", | ||||||
|     "animations": { |     "animations": { | ||||||
|       "breathing": true, |       "breathing": true, | ||||||
|       "rainbow_mood": true, |       "rainbow_mood": true, | ||||||
|  | |||||||
| @ -46,3 +46,4 @@ CUSTOM_MATRIX = lite | |||||||
| # project specific files
 | # project specific files
 | ||||||
| SRC += matrix.c tca6424.c aw9523b.c | SRC += matrix.c tca6424.c aw9523b.c | ||||||
| I2C_DRIVER_REQUIRED = yes | I2C_DRIVER_REQUIRED = yes | ||||||
|  | WS2812_DRIVER_REQUIRED = yes | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ | |||||||
|   }, |   }, | ||||||
|   "rgblight": { |   "rgblight": { | ||||||
|     "led_count": 20, |     "led_count": 20, | ||||||
|  |     "driver": "custom", | ||||||
|     "animations": { |     "animations": { | ||||||
|       "breathing": true, |       "breathing": true, | ||||||
|       "rainbow_mood": true, |       "rainbow_mood": true, | ||||||
|  | |||||||
| @ -357,7 +357,7 @@ static void custom_effects(void) | |||||||
|     effect_funcs[rgb_ring.effect](); |     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) { |     if (rgb_ring.state != RING_STATE_QMK) { | ||||||
|         return; |         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) | void rgb_ring_init(void) | ||||||
| { | { | ||||||
|  | |||||||
| @ -22,45 +22,42 @@ extern rgblight_config_t rgblight_config; | |||||||
| #endif | #endif | ||||||
| rgb_led_t noah_leds[RGBLED_NUM]; | rgb_led_t noah_leds[RGBLED_NUM]; | ||||||
| static bool noah_led_mode = false; | static bool noah_led_mode = false; | ||||||
| void rgblight_set(void) { | void setleds_custom(rgb_led_t *ledarray, uint16_t num_leds) { | ||||||
|     memset(&noah_leds[0], 0, sizeof(noah_leds)); |     memset(&noah_leds[0], 0, sizeof(noah_leds)); | ||||||
|     if (!rgblight_config.enable) { |     if (!rgblight_config.enable) { | ||||||
|         for (uint8_t i = 0; i < RGBLED_NUM; i++) { |         for (uint8_t i = 0; i < RGBLED_NUM; i++) { | ||||||
|             led[i].r = 0; |             ledarray[i].r = 0; | ||||||
|             led[i].g = 0; |             ledarray[i].g = 0; | ||||||
|             led[i].b = 0; |             ledarray[i].b = 0; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     if (noah_led_mode) { |     if (noah_led_mode) { | ||||||
|       led_t led_state = host_keyboard_led_state(); |       led_t led_state = host_keyboard_led_state(); | ||||||
|       if (led_state.caps_lock) { |       if (led_state.caps_lock) { | ||||||
|         noah_leds[0] = led[0]; |         noah_leds[0] = ledarray[0]; | ||||||
|       } |       } | ||||||
|       if (led_state.scroll_lock) { |       if (led_state.scroll_lock) { | ||||||
|         noah_leds[1] = led[1]; |         noah_leds[1] = ledarray[1]; | ||||||
|       } |       } | ||||||
|       if (led_state.num_lock) { |       if (led_state.num_lock) { | ||||||
|         noah_leds[2] = led[2]; |         noah_leds[2] = ledarray[2]; | ||||||
|       } |       } | ||||||
|       for (int32_t i = 0; i < 4; i++) { |       for (int32_t i = 0; i < 4; i++) { | ||||||
|         if(layer_state_is(i+1)) { |         if(layer_state_is(i+1)) { | ||||||
|           noah_leds[i + 3] = led[i + 3]; |           noah_leds[i + 3] = ledarray[i + 3]; | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     } else { |     } else { | ||||||
|       memcpy(&noah_leds[0], &led[0], sizeof(noah_leds)); |       memcpy(&noah_leds[0], &ledarray[0], sizeof(noah_leds)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|   ws2812_setleds(noah_leds, RGBLED_NUM); |   ws2812_setleds(noah_leds, RGBLED_NUM); | ||||||
| } | } | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
| void matrix_scan_kb(void) { | const rgblight_driver_t rgblight_driver = { | ||||||
| #ifdef RGBLIGHT_ENABLE |     .setleds = setleds_custom, | ||||||
|     rgblight_task(); | }; | ||||||
| #endif | #endif | ||||||
|     matrix_scan_user(); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| #ifdef RGB_MATRIX_ENABLE | #ifdef RGB_MATRIX_ENABLE | ||||||
| const is31fl3731_led_t PROGMEM g_is31fl3731_leds[RGB_MATRIX_LED_COUNT] = { | const is31fl3731_led_t PROGMEM g_is31fl3731_leds[RGB_MATRIX_LED_COUNT] = { | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ | |||||||
| #include "quantum.h" | #include "quantum.h" | ||||||
| #include "i2c_master.h" | #include "i2c_master.h" | ||||||
| #include "drivers/led/issi/is31fl3731.h" | #include "drivers/led/issi/is31fl3731.h" | ||||||
|  | #include "ws2812.h" | ||||||
| 
 | 
 | ||||||
| enum { | enum { | ||||||
|     SELF_TESTING, |     SELF_TESTING, | ||||||
| @ -336,7 +337,7 @@ void housekeeping_task_kb(void) | |||||||
|     housekeeping_task_user(); |     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; |     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); |     ws2812_setleds(leds, 4); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const rgblight_driver_t rgblight_driver = { | ||||||
|  |     .setleds = setleds_custom, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| bool led_update_kb(led_t led_state) | bool led_update_kb(led_t led_state) | ||||||
| { | { | ||||||
|     bool res = led_update_user(led_state); |     bool res = led_update_user(led_state); | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ | |||||||
|         "saturation_steps": 8, |         "saturation_steps": 8, | ||||||
|         "brightness_steps": 8, |         "brightness_steps": 8, | ||||||
|         "led_count": 68, |         "led_count": 68, | ||||||
|  |         "driver": "custom", | ||||||
|         "animations": { |         "animations": { | ||||||
|             "breathing": true, |             "breathing": true, | ||||||
|             "rainbow_mood": true, |             "rainbow_mood": true, | ||||||
|  | |||||||
| @ -12,4 +12,5 @@ RGBLIGHT_ENABLE = yes		# Enable keyboard RGB underglow | |||||||
| NO_USB_STARTUP_CHECK = yes | NO_USB_STARTUP_CHECK = yes | ||||||
| 
 | 
 | ||||||
| QUANTUM_LIB_SRC += drivers/led/issi/is31fl3731.c | QUANTUM_LIB_SRC += drivers/led/issi/is31fl3731.c | ||||||
|  | WS2812_DRIVER_REQUIRED = yes | ||||||
| I2C_DRIVER_REQUIRED = yes | I2C_DRIVER_REQUIRED = yes | ||||||
|  | |||||||
| @ -23,6 +23,7 @@ | |||||||
|         "saturation_steps": 8, |         "saturation_steps": 8, | ||||||
|         "brightness_steps": 8, |         "brightness_steps": 8, | ||||||
|         "led_count": 65, |         "led_count": 65, | ||||||
|  |         "driver": "custom", | ||||||
|         "max_brightness": 192, |         "max_brightness": 192, | ||||||
|         "animations": { |         "animations": { | ||||||
|             "breathing": true, |             "breathing": true, | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ | |||||||
| #include "quantum.h" | #include "quantum.h" | ||||||
| #include "i2c_master.h" | #include "i2c_master.h" | ||||||
| #include "drivers/led/issi/is31fl3731.h" | #include "drivers/led/issi/is31fl3731.h" | ||||||
|  | #include "ws2812.h" | ||||||
| 
 | 
 | ||||||
| enum { | enum { | ||||||
|     SELF_TESTING, |     SELF_TESTING, | ||||||
| @ -338,7 +339,7 @@ void housekeeping_task_kb(void) | |||||||
|     housekeeping_task_user(); |     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; |     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); |     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 led_update_kb(led_t led_state) | ||||||
| { | { | ||||||
|     bool res = led_update_user(led_state); |     bool res = led_update_user(led_state); | ||||||
|  | |||||||
| @ -11,4 +11,5 @@ BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality | |||||||
| RGBLIGHT_ENABLE = yes		# Enable keyboard RGB underglow | RGBLIGHT_ENABLE = yes		# Enable keyboard RGB underglow | ||||||
| 
 | 
 | ||||||
| QUANTUM_LIB_SRC += drivers/led/issi/is31fl3731.c | QUANTUM_LIB_SRC += drivers/led/issi/is31fl3731.c | ||||||
|  | WS2812_DRIVER_REQUIRED = yes | ||||||
| I2C_DRIVER_REQUIRED = yes | I2C_DRIVER_REQUIRED = yes | ||||||
|  | |||||||
| @ -25,7 +25,8 @@ | |||||||
|         "pin": "B0" |         "pin": "B0" | ||||||
|     }, |     }, | ||||||
|     "rgblight": { |     "rgblight": { | ||||||
|         "led_count": 5 |         "led_count": 5, | ||||||
|  |         "driver": "custom" | ||||||
|     }, |     }, | ||||||
|     "url": "", |     "url": "", | ||||||
|     "usb": { |     "usb": { | ||||||
|  | |||||||
| @ -18,6 +18,7 @@ | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "quantum.h" | #include "quantum.h" | ||||||
|  | #include "ws2812.h" | ||||||
| #ifdef RGBLIGHT_ENABLE | #ifdef RGBLIGHT_ENABLE | ||||||
| 
 | 
 | ||||||
| static bool alert = false; | static bool alert = false; | ||||||
| @ -66,7 +67,7 @@ void housekeeping_task_kb(void) | |||||||
|     housekeeping_task_user(); |     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].r = start_led[0].r; | ||||||
|     start_led[2].g = start_led[0].g; |     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); |     ws2812_setleds(start_led, RGBLED_NUM); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const rgblight_driver_t rgblight_driver = { | ||||||
|  |     .setleds = setleds_custom, | ||||||
|  | }; | ||||||
| #endif | #endif | ||||||
| @ -1 +1 @@ | |||||||
| # This file intentionally left blank
 | WS2812_DRIVER_REQUIRED = yes | ||||||
|  | |||||||
| @ -18,22 +18,6 @@ | |||||||
|     "pin": "F7", |     "pin": "F7", | ||||||
|     "on_state": 0 |     "on_state": 0 | ||||||
|   }, |   }, | ||||||
|   "rgblight": { |  | ||||||
|     "driver": "custom", |  | ||||||
|     "led_count": 1, |  | ||||||
|     "animations": { |  | ||||||
|       "breathing": true, |  | ||||||
|       "rainbow_mood": true, |  | ||||||
|       "rainbow_swirl": true, |  | ||||||
|       "snake": true, |  | ||||||
|       "knight": true, |  | ||||||
|       "christmas": true, |  | ||||||
|       "static_gradient": true, |  | ||||||
|       "rgb_test": true, |  | ||||||
|       "alternating": true, |  | ||||||
|       "twinkle": true |  | ||||||
|     } |  | ||||||
|   }, |  | ||||||
|   "processor": "atmega32u4", |   "processor": "atmega32u4", | ||||||
|   "bootloader": "atmel-dfu", |   "bootloader": "atmel-dfu", | ||||||
|   "community_layouts": ["60_ansi", "60_iso"], |   "community_layouts": ["60_ansi", "60_iso"], | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ CONSOLE_ENABLE = no         # Console for debug | |||||||
| COMMAND_ENABLE = yes        # Commands for debug and configuration | COMMAND_ENABLE = yes        # Commands for debug and configuration | ||||||
| NKRO_ENABLE = no            # Enable N-Key Rollover | NKRO_ENABLE = no            # Enable N-Key Rollover | ||||||
| BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality | BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality | ||||||
| RGBLIGHT_ENABLE = yes       # Enable the RGB Underglow | RGBLIGHT_ENABLE = no        # Enable the RGB Underglow | ||||||
| AUDIO_ENABLE = no           # Audio output | AUDIO_ENABLE = no           # Audio output | ||||||
| 
 | 
 | ||||||
| LTO_ENABLE = yes | LTO_ENABLE = yes | ||||||
|  | |||||||
| @ -131,20 +131,6 @@ void set_rgb_pin_off(uint8_t pin) { | |||||||
| 	PORTF |= _BV(pin); | 	PORTF |= _BV(pin); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void rgblight_set(void) { |  | ||||||
| 	  // xprintf("Setting RGB underglow\n");
 |  | ||||||
|     if (!rgblight_config.enable) { |  | ||||||
|           led[0].r = 0; |  | ||||||
|           led[0].g = 0; |  | ||||||
|           led[0].b = 0; |  | ||||||
|           set_rgb_pin_off(RGB_RED_PIN); |  | ||||||
|           set_rgb_pin_off(RGB_GREEN_PIN); |  | ||||||
|           set_rgb_pin_off(RGB_BLUE_PIN); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|    //  //xprintf("Red: %u, Green: %u, Blue: %u\n", led[0].r, led[0].g, led[0].b);
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ISR(TIMER3_COMPA_vect) | ISR(TIMER3_COMPA_vect) | ||||||
| { | { | ||||||
|     static uint8_t pwm = 0; |     static uint8_t pwm = 0; | ||||||
|  | |||||||
| @ -30,6 +30,7 @@ | |||||||
|         "pin": "F1" |         "pin": "F1" | ||||||
|     }, |     }, | ||||||
|     "rgblight": { |     "rgblight": { | ||||||
|  |         "driver": "custom", | ||||||
|         "max_brightness": 120, |         "max_brightness": 120, | ||||||
|         "sleep": true, |         "sleep": true, | ||||||
|         "animations": { |         "animations": { | ||||||
|  | |||||||
| @ -21,6 +21,7 @@ | |||||||
|     }, |     }, | ||||||
|     "processor": "atmega32u4", |     "processor": "atmega32u4", | ||||||
|     "rgblight": { |     "rgblight": { | ||||||
|  |         "driver": "custom", | ||||||
|         "animations": { |         "animations": { | ||||||
|             "alternating": false, |             "alternating": false, | ||||||
|             "breathing": true, |             "breathing": true, | ||||||
|  | |||||||
| @ -27,6 +27,7 @@ | |||||||
|     }, |     }, | ||||||
|     "rgblight": { |     "rgblight": { | ||||||
|         "led_count": 6, |         "led_count": 6, | ||||||
|  |         "driver": "custom", | ||||||
|         "max_brightness": 120, |         "max_brightness": 120, | ||||||
|         "sleep": true, |         "sleep": true, | ||||||
|         "animations": { |         "animations": { | ||||||
|  | |||||||
| @ -50,6 +50,7 @@ | |||||||
|         ] |         ] | ||||||
|     }, |     }, | ||||||
|     "rgblight": { |     "rgblight": { | ||||||
|  |         "driver": "custom", | ||||||
|         "animations": { |         "animations": { | ||||||
|             "breathing": true, |             "breathing": true, | ||||||
|             "knight": true, |             "knight": true, | ||||||
|  | |||||||
| @ -24,9 +24,9 @@ | |||||||
| 
 | 
 | ||||||
| #include "ws2812_bitbang.c" | #include "ws2812_bitbang.c" | ||||||
| 
 | 
 | ||||||
| void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds) { | const rgblight_driver_t rgblight_driver = { | ||||||
|     ws2812_setleds(start_led, num_leds); |     .setleds = ws2812_setleds, | ||||||
| } | }; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef RGB_MATRIX_ENABLE | #ifdef RGB_MATRIX_ENABLE | ||||||
|  | |||||||
| @ -25,6 +25,7 @@ | |||||||
|       "pin": "D1" |       "pin": "D1" | ||||||
|     }, |     }, | ||||||
|     "rgblight": { |     "rgblight": { | ||||||
|  |       "driver": "custom", | ||||||
|       "max_brightness": 120, |       "max_brightness": 120, | ||||||
|       "sleep": true, |       "sleep": true, | ||||||
|       "animations": { |       "animations": { | ||||||
|  | |||||||
| @ -900,12 +900,6 @@ void rgblight_wakeup(void) { | |||||||
| 
 | 
 | ||||||
| #endif | #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) { | void rgblight_set(void) { | ||||||
|     rgb_led_t *start_led; |     rgb_led_t *start_led; | ||||||
|     uint8_t    num_leds = rgblight_ranges.clipping_num_leds; |     uint8_t    num_leds = rgblight_ranges.clipping_num_leds; | ||||||
| @ -915,42 +909,41 @@ void rgblight_set(void) { | |||||||
|             led[i].r = 0; |             led[i].r = 0; | ||||||
|             led[i].g = 0; |             led[i].g = 0; | ||||||
|             led[i].b = 0; |             led[i].b = 0; | ||||||
| #    ifdef RGBW | #ifdef RGBW | ||||||
|             led[i].w = 0; |             led[i].w = 0; | ||||||
| #    endif | #endif | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #    ifdef RGBLIGHT_LAYERS | #ifdef RGBLIGHT_LAYERS | ||||||
|     if (rgblight_layers != NULL |     if (rgblight_layers != NULL | ||||||
| #        if !defined(RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF) | #    if !defined(RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF) | ||||||
|         && rgblight_config.enable |         && rgblight_config.enable | ||||||
| #        elif defined(RGBLIGHT_SLEEP) | #    elif defined(RGBLIGHT_SLEEP) | ||||||
|         && !is_suspended |         && !is_suspended | ||||||
| #        endif | #    endif | ||||||
|     ) { |     ) { | ||||||
|         rgblight_layers_write(); |         rgblight_layers_write(); | ||||||
|     } |     } | ||||||
| #    endif | #endif | ||||||
| 
 | 
 | ||||||
| #    ifdef RGBLIGHT_LED_MAP | #ifdef RGBLIGHT_LED_MAP | ||||||
|     rgb_led_t led0[RGBLED_NUM]; |     rgb_led_t led0[RGBLED_NUM]; | ||||||
|     for (uint8_t i = 0; i < RGBLED_NUM; i++) { |     for (uint8_t i = 0; i < RGBLED_NUM; i++) { | ||||||
|         led0[i] = led[pgm_read_byte(&led_map[i])]; |         led0[i] = led[pgm_read_byte(&led_map[i])]; | ||||||
|     } |     } | ||||||
|     start_led = led0 + rgblight_ranges.clipping_start_pos; |     start_led = led0 + rgblight_ranges.clipping_start_pos; | ||||||
| #    else | #else | ||||||
|     start_led = led + rgblight_ranges.clipping_start_pos; |     start_led = led + rgblight_ranges.clipping_start_pos; | ||||||
| #    endif | #endif | ||||||
| 
 | 
 | ||||||
| #    ifdef RGBW | #ifdef RGBW | ||||||
|     for (uint8_t i = 0; i < num_leds; i++) { |     for (uint8_t i = 0; i < num_leds; i++) { | ||||||
|         convert_rgb_to_rgbw(&start_led[i]); |         convert_rgb_to_rgbw(&start_led[i]); | ||||||
|     } |     } | ||||||
| #    endif |  | ||||||
|     rgblight_call_driver(start_led, num_leds); |  | ||||||
| } |  | ||||||
| #endif | #endif | ||||||
|  |     rgblight_driver.setleds(start_led, num_leds); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| #ifdef RGBLIGHT_SPLIT | #ifdef RGBLIGHT_SPLIT | ||||||
| /* for split keyboard master side */ | /* for split keyboard master side */ | ||||||
|  | |||||||
| @ -160,6 +160,7 @@ enum RGBLIGHT_EFFECT_MODE { | |||||||
| 
 | 
 | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
|  | #include "rgblight_drivers.h" | ||||||
| #include "progmem.h" | #include "progmem.h" | ||||||
| #include "eeconfig.h" | #include "eeconfig.h" | ||||||
| #include "ws2812.h" | #include "ws2812.h" | ||||||
|  | |||||||
							
								
								
									
										20
									
								
								quantum/rgblight/rgblight_drivers.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								quantum/rgblight/rgblight_drivers.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | // Copyright 2023 QMK
 | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later
 | ||||||
|  | 
 | ||||||
|  | #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 | ||||||
							
								
								
									
										13
									
								
								quantum/rgblight/rgblight_drivers.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								quantum/rgblight/rgblight_drivers.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | // Copyright 2023 QMK
 | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <stdint.h> | ||||||
|  | #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; | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Ryan
						Ryan