diff options
author | Ryan <fauxpark@gmail.com> | 2023-03-30 12:21:02 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-30 12:21:02 +1100 |
commit | 647c2835e65995339fb9380830c53725a62f6299 (patch) | |
tree | 8e5b96ea65f2a4c5e0990ac09dfc7f019ac1b90e | |
parent | 7e1e662dc704736b88cc4a7487457638b72f54e8 (diff) |
WS2812 driver improvements (#20262)
23 files changed, 68 insertions, 77 deletions
diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 0880934e95..af6cf81aa8 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -574,7 +574,7 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) endif endif -VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c vendor +VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor WS2812_DRIVER ?= bitbang ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes) @@ -584,15 +584,11 @@ ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes) OPT_DEFS += -DWS2812_DRIVER_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]')) - ifeq ($(strip $(WS2812_DRIVER)), bitbang) - SRC += ws2812.c - else - SRC += ws2812_$(strip $(WS2812_DRIVER)).c + SRC += ws2812_$(strip $(WS2812_DRIVER)).c - ifeq ($(strip $(PLATFORM)), CHIBIOS) - ifeq ($(strip $(WS2812_DRIVER)), pwm) - OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE - endif + ifeq ($(strip $(PLATFORM)), CHIBIOS) + ifeq ($(strip $(WS2812_DRIVER)), pwm) + OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE endif endif diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index 239813473c..21d9d49104 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -119,6 +119,8 @@ "USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"}, "USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"}, "USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"}, + "WS2812_I2C_ADDRESS": {"info_key": "ws2812.i2c_address", "value_type": "hex"}, + "WS2812_I2C_TIMEOUT": {"info_key": "ws2812.i2c_timeout", "value_type": "int"}, // Items we want flagged in lint "NO_ACTION_MACRO": {"info_key": "_invalid.no_action_macro", "invalid": true}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 18b3514aa5..47decf1a15 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -707,8 +707,10 @@ "properties": { "driver": { "type": "string", - "enum": ["bitbang", "i2c", "pwm", "spi", "vendor"] - } + "enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"] + }, + "i2c_address": {"$ref": "qmk.definitions.v1#/hex_number_2d"}, + "i2c_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} } } } diff --git a/docs/ws2812_driver.md b/docs/ws2812_driver.md index 5942da28d1..23a21de567 100644 --- a/docs/ws2812_driver.md +++ b/docs/ws2812_driver.md @@ -72,8 +72,8 @@ WS2812_DRIVER = i2c Configure the hardware via your config.h: ```c -#define WS2812_ADDRESS 0xb0 // default: 0xb0 -#define WS2812_TIMEOUT 100 // default: 100 +#define WS2812_I2C_ADDRESS 0xB0 // default: 0xB0 +#define WS2812_I2C_TIMEOUT 100 // default: 100 ``` ### SPI diff --git a/keyboards/1k/keymaps/default/rules.mk b/keyboards/1k/keymaps/default/rules.mk index ff480ff890..3f8ac1d4bb 100644 --- a/keyboards/1k/keymaps/default/rules.mk +++ b/keyboards/1k/keymaps/default/rules.mk @@ -1,2 +1,2 @@ -SRC += ws2812.c +WS2812_DRIVER_REQUIRED = yes SRC += color.c diff --git a/keyboards/1k/keymaps/media/rules.mk b/keyboards/1k/keymaps/media/rules.mk index 2368727640..76db8f131e 100644 --- a/keyboards/1k/keymaps/media/rules.mk +++ b/keyboards/1k/keymaps/media/rules.mk @@ -1,3 +1,3 @@ -SRC += ws2812.c +WS2812_DRIVER_REQUIRED = yes SRC += color.c EXTRAKEY_ENABLE = yes diff --git a/keyboards/dp60/keymaps/indicator/led_driver.c b/keyboards/dp60/keymaps/indicator/led_driver.c index 2a1ac5a385..f4a2dcc47c 100644 --- a/keyboards/dp60/keymaps/indicator/led_driver.c +++ b/keyboards/dp60/keymaps/indicator/led_driver.c @@ -18,7 +18,7 @@ #define RGB_DI_PIN RGB_INDICATOR_PIN #define ws2812_setleds indicator_setleds #define ws2812_setleds_pin indicator_setleds_pin -#include "ws2812.c" +#include "ws2812_bitbang.c" void indicator_write(LED_TYPE *start_led, uint8_t num_leds) { diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk index 038266add8..a0be87690e 100644 --- a/keyboards/handwired/promethium/rules.mk +++ b/keyboards/handwired/promethium/rules.mk @@ -19,8 +19,8 @@ PS2_DRIVER = interrupt CUSTOM_MATRIX = yes BLUETOOTH_ENABLE = yes BLUETOOTH_DRIVER = BluefruitLE +WS2812_DRIVER_REQUIRED = yes -SRC += ws2812.c SRC += rgbsps.c SRC += analog.c SRC += matrix.c diff --git a/keyboards/matrix/noah/rules.mk b/keyboards/matrix/noah/rules.mk index 616574f4ae..e4ce6d5243 100644 --- a/keyboards/matrix/noah/rules.mk +++ b/keyboards/matrix/noah/rules.mk @@ -29,7 +29,8 @@ RGB_MATRIX_DRIVER = IS31FL3731 RGBLIGHT_ENABLE = yes RGBLIGHT_CUSTOM_DRIVER = yes +WS2812_DRIVER_REQUIRED = yes CUSTOM_MATRIX = yes # project specific files -SRC += ws2812.c matrix.c +SRC += matrix.c diff --git a/keyboards/mschwingen/modelm/led_ws2812/rules.mk b/keyboards/mschwingen/modelm/led_ws2812/rules.mk index 424388fd8f..9a69649289 100644 --- a/keyboards/mschwingen/modelm/led_ws2812/rules.mk +++ b/keyboards/mschwingen/modelm/led_ws2812/rules.mk @@ -1,2 +1 @@ -# variant for WS2812 LEDs -SRC += ws2812.c +WS2812_DRIVER_REQUIRED = yes diff --git a/keyboards/oddforge/vea/info.json b/keyboards/oddforge/vea/info.json index daf69e8a42..713ea5186e 100644 --- a/keyboards/oddforge/vea/info.json +++ b/keyboards/oddforge/vea/info.json @@ -12,7 +12,7 @@ "pin": "D4" }, "ws2812": { - "driver": "i2c" + "driver": "custom" }, "indicators": { "caps_lock": "D1", diff --git a/keyboards/oddforge/vea/vea.c b/keyboards/oddforge/vea/vea.c deleted file mode 100644 index 220083e403..0000000000 --- a/keyboards/oddforge/vea/vea.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2021 MajorKoos <github.com/majorkoos> - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ -#include "vea.h" - -void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) { vea_setleds(start_led, num_leds); } - -void vea_rgb_init(void) { i2c_init(); } - -// Setleds for standard RGB -void vea_setleds(LED_TYPE *ledarray, uint16_t leds) { - static bool s_init = false; - if (!s_init) { - vea_rgb_init(); - s_init = true; - } - - i2c_transmit(WS2812_ADDRESS, (uint8_t *)ledarray, sizeof(LED_TYPE) * (leds >> 1), WS2812_TIMEOUT); - i2c_transmit(WS2812_ADDRESS_SPLIT, (uint8_t *)ledarray+(sizeof(LED_TYPE) * (leds >> 1)), sizeof(LED_TYPE) * (leds - (leds >> 1)), WS2812_TIMEOUT); -}; diff --git a/keyboards/oddforge/vea/vea.h b/keyboards/oddforge/vea/vea.h index 8e5851b84d..158b82d944 100644 --- a/keyboards/oddforge/vea/vea.h +++ b/keyboards/oddforge/vea/vea.h @@ -16,17 +16,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #pragma once -#include "quantum.h" -#include "i2c_master.h" -#include "rgblight.h" -#include "ws2812.h" -#include "led.h" - -#define WS2812_ADDRESS 0xb0 -#define WS2812_ADDRESS_SPLIT 0xb8 -#define WS2812_TIMEOUT 100 -void vea_setleds(LED_TYPE *ledarray, uint16_t leds); +#include "quantum.h" /* LEFT diff --git a/keyboards/oddforge/vea/ws2812_custom.c b/keyboards/oddforge/vea/ws2812_custom.c new file mode 100644 index 0000000000..0dc5a2d0f1 --- /dev/null +++ b/keyboards/oddforge/vea/ws2812_custom.c @@ -0,0 +1,34 @@ +#include "ws2812.h" +#include "i2c_master.h" + +#ifdef RGBW +# error "RGBW not supported" +#endif + +#ifndef WS2812_I2C_ADDRESS +# define WS2812_I2C_ADDRESS 0xB0 +#endif + +#ifndef WS2812_I2C_ADDRESS_RIGHT +# define WS2812_I2C_ADDRESS_RIGHT 0xB8 +#endif + +#ifndef WS2812_I2C_TIMEOUT +# define WS2812_I2C_TIMEOUT 100 +#endif + +void ws2812_init(void) { + i2c_init(); +} + +// Setleds for standard RGB +void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) { + static bool s_init = false; + if (!s_init) { + ws2812_init(); + s_init = true; + } + + i2c_transmit(WS2812_I2C_ADDRESS, (uint8_t *)ledarray, sizeof(LED_TYPE) * (leds >> 1), WS2812_I2C_TIMEOUT); + i2c_transmit(WS2812_I2C_ADDRESS_RIGHT, (uint8_t *)ledarray+(sizeof(LED_TYPE) * (leds >> 1)), sizeof(LED_TYPE) * (leds - (leds >> 1)), WS2812_I2C_TIMEOUT); +} diff --git a/keyboards/work_louder/rgb_functions.c b/keyboards/work_louder/rgb_functions.c index cde435134a..a425eb763a 100644 --- a/keyboards/work_louder/rgb_functions.c +++ b/keyboards/work_louder/rgb_functions.c @@ -22,7 +22,7 @@ #define ws2812_setleds ws2812_rgb_setleds -#include "ws2812.c" +#include "ws2812_bitbang.c" void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) { ws2812_setleds(start_led, num_leds); diff --git a/keyboards/xelus/dawn60/rev1/rules.mk b/keyboards/xelus/dawn60/rev1/rules.mk index e641678ecb..d4e70bfbec 100644 --- a/keyboards/xelus/dawn60/rev1/rules.mk +++ b/keyboards/xelus/dawn60/rev1/rules.mk @@ -17,13 +17,13 @@ AUDIO_ENABLE = no # Audio output RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. - We have custom RGB underglow CIE1931_CURVE = yes +WS2812_DRIVER_REQUIRED = yes # project specific files SRC += keyboards/wilba_tech/wt_main.c \ keyboards/wilba_tech/wt_rgb_backlight.c \ quantum/color.c \ - drivers/led/issi/is31fl3731.c \ - ws2812.c + drivers/led/issi/is31fl3731.c QUANTUM_LIB_SRC += i2c_master.c diff --git a/keyboards/xelus/dawn60/rev1_qmk/rules.mk b/keyboards/xelus/dawn60/rev1_qmk/rules.mk index 2101e1cd1c..71a023f2d0 100644 --- a/keyboards/xelus/dawn60/rev1_qmk/rules.mk +++ b/keyboards/xelus/dawn60/rev1_qmk/rules.mk @@ -19,12 +19,12 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. - We have custom RGB RGB_MATRIX_ENABLE = yes # Enable RGB matrix effects. RGB_MATRIX_DRIVER = custom # Enable RGB matrix effects. +WS2812_DRIVER_REQUIRED = yes COMMON_VPATH += $(DRIVER_PATH)/issi # project specific files -SRC += drivers/led/issi/is31fl3731.c \ - ws2812.c +SRC += drivers/led/issi/is31fl3731.c QUANTUM_LIB_SRC += i2c_master.c diff --git a/keyboards/xiudi/xd002/keymaps/multilayer_rgb/rules.mk b/keyboards/xiudi/xd002/keymaps/multilayer_rgb/rules.mk index 69d592aa4b..07c75adb47 100644 --- a/keyboards/xiudi/xd002/keymaps/multilayer_rgb/rules.mk +++ b/keyboards/xiudi/xd002/keymaps/multilayer_rgb/rules.mk @@ -1,2 +1,2 @@ -SRC += ws2812.c +WS2812_DRIVER_REQUIRED = yes EXTRAKEY_ENABLE = yes diff --git a/keyboards/xiudi/xd002/keymaps/rgb_lite/rules.mk b/keyboards/xiudi/xd002/keymaps/rgb_lite/rules.mk index 227bbcae32..9a69649289 100644 --- a/keyboards/xiudi/xd002/keymaps/rgb_lite/rules.mk +++ b/keyboards/xiudi/xd002/keymaps/rgb_lite/rules.mk @@ -1 +1 @@ -SRC += ws2812.c +WS2812_DRIVER_REQUIRED = yes diff --git a/platforms/avr/drivers/ws2812.c b/platforms/avr/drivers/ws2812_bitbang.c index 5c0cb3b718..5c0cb3b718 100644 --- a/platforms/avr/drivers/ws2812.c +++ b/platforms/avr/drivers/ws2812_bitbang.c diff --git a/platforms/avr/drivers/ws2812_i2c.c b/platforms/avr/drivers/ws2812_i2c.c index 709f382254..f4a2fbe0b3 100644 --- a/platforms/avr/drivers/ws2812_i2c.c +++ b/platforms/avr/drivers/ws2812_i2c.c @@ -5,12 +5,12 @@ # error "RGBW not supported" #endif -#ifndef WS2812_ADDRESS -# define WS2812_ADDRESS 0xb0 +#ifndef WS2812_I2C_ADDRESS +# define WS2812_I2C_ADDRESS 0xB0 #endif -#ifndef WS2812_TIMEOUT -# define WS2812_TIMEOUT 100 +#ifndef WS2812_I2C_TIMEOUT +# define WS2812_I2C_TIMEOUT 100 #endif void ws2812_init(void) { @@ -25,5 +25,5 @@ void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) { s_init = true; } - i2c_transmit(WS2812_ADDRESS, (uint8_t *)ledarray, sizeof(LED_TYPE) * leds, WS2812_TIMEOUT); + i2c_transmit(WS2812_I2C_ADDRESS, (uint8_t *)ledarray, sizeof(LED_TYPE) * leds, WS2812_I2C_TIMEOUT); } diff --git a/platforms/chibios/drivers/ws2812.c b/platforms/chibios/drivers/ws2812_bitbang.c index 55ac333b1e..55ac333b1e 100644 --- a/platforms/chibios/drivers/ws2812.c +++ b/platforms/chibios/drivers/ws2812_bitbang.c diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.c b/quantum/rgb_matrix/rgb_matrix_drivers.c index 5b81915845..415c66f115 100644 --- a/quantum/rgb_matrix/rgb_matrix_drivers.c +++ b/quantum/rgb_matrix/rgb_matrix_drivers.c @@ -359,7 +359,6 @@ LED_TYPE rgb_matrix_ws2812_array[RGB_MATRIX_LED_COUNT]; static void init(void) {} static void flush(void) { - // Assumes use of RGB_DI_PIN ws2812_setleds(rgb_matrix_ws2812_array, RGB_MATRIX_LED_COUNT); } |