From 647c2835e65995339fb9380830c53725a62f6299 Mon Sep 17 00:00:00 2001 From: Ryan Date: Thu, 30 Mar 2023 12:21:02 +1100 Subject: [PATCH] WS2812 driver improvements (#20262) --- builddefs/common_features.mk | 14 +++----- data/mappings/info_config.hjson | 2 ++ data/schemas/keyboard.jsonschema | 6 ++-- docs/ws2812_driver.md | 4 +-- keyboards/1k/keymaps/default/rules.mk | 2 +- keyboards/1k/keymaps/media/rules.mk | 2 +- keyboards/dp60/keymaps/indicator/led_driver.c | 2 +- keyboards/handwired/promethium/rules.mk | 2 +- keyboards/matrix/noah/rules.mk | 3 +- .../mschwingen/modelm/led_ws2812/rules.mk | 3 +- keyboards/oddforge/vea/info.json | 2 +- keyboards/oddforge/vea/vea.c | 33 ------------------ keyboards/oddforge/vea/vea.h | 11 +----- keyboards/oddforge/vea/ws2812_custom.c | 34 +++++++++++++++++++ keyboards/work_louder/rgb_functions.c | 2 +- keyboards/xelus/dawn60/rev1/rules.mk | 4 +-- keyboards/xelus/dawn60/rev1_qmk/rules.mk | 4 +-- .../xd002/keymaps/multilayer_rgb/rules.mk | 2 +- .../xiudi/xd002/keymaps/rgb_lite/rules.mk | 2 +- .../drivers/{ws2812.c => ws2812_bitbang.c} | 0 platforms/avr/drivers/ws2812_i2c.c | 10 +++--- .../drivers/{ws2812.c => ws2812_bitbang.c} | 0 quantum/rgb_matrix/rgb_matrix_drivers.c | 1 - 23 files changed, 68 insertions(+), 77 deletions(-) delete mode 100644 keyboards/oddforge/vea/vea.c create mode 100644 keyboards/oddforge/vea/ws2812_custom.c rename platforms/avr/drivers/{ws2812.c => ws2812_bitbang.c} (100%) rename platforms/chibios/drivers/{ws2812.c => ws2812_bitbang.c} (100%) diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 0880934e957..af6cf81aa87 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 239813473c5..21d9d491040 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 18b3514aa5d..47decf1a157 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 5942da28d1d..23a21de5671 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 ff480ff890a..3f8ac1d4bbd 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 23687276408..76db8f131e8 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 2a1ac5a3852..f4a2dcc47c2 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 038266add83..a0be87690e1 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 616574f4aed..e4ce6d5243a 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 424388fd8f6..9a696492896 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 daf69e8a421..713ea5186e2 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 220083e4030..00000000000 --- a/keyboards/oddforge/vea/vea.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2021 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 . -*/ -#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 8e5851b84d3..158b82d9444 100644 --- a/keyboards/oddforge/vea/vea.h +++ b/keyboards/oddforge/vea/vea.h @@ -16,17 +16,8 @@ along with this program. If not, see . */ #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 00000000000..0dc5a2d0f14 --- /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 cde435134a2..a425eb763a7 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 e641678ecb1..d4e70bfbece 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 2101e1cd1ce..71a023f2d0a 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 69d592aa4bb..07c75adb470 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 227bbcae32d..9a696492896 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 similarity index 100% rename from platforms/avr/drivers/ws2812.c rename to platforms/avr/drivers/ws2812_bitbang.c diff --git a/platforms/avr/drivers/ws2812_i2c.c b/platforms/avr/drivers/ws2812_i2c.c index 709f3822547..f4a2fbe0b30 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 similarity index 100% rename from platforms/chibios/drivers/ws2812.c rename to 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 5b81915845f..415c66f1150 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); }