1
0
Fork 0

WS2812 API rework (#24364)

* Begin WS2812 API rework

* Move RGBW conversion, clean up color.h, fix RGBW for AVR bitbang

* Formatting & update PS2AVRGB I2C driver (untested)

* Tested ARM bitbang RGB+RGBW

* Tested ARM SPI RGB - RGBW not working

* Tested ARM PWM RGB+RGBW

* Tested RP2040 PIO driver RGB+RGBW

* Update RGBLight

* Formatting

* Fix BM60HSRGB rev2

* Fix oddforge/vea

* Fix 1k and XD002 RGBLite

* Fix model_m/mschwingen

* Fix handwired/promethium

* Rename `WS2812_LED_TOTAL` for BM60HSRGB

* Fix work_louder boards

* Fix dawn60

* Fix rgbkb/pan

* Fix neson_design/700e and n6

* Fix ergodox_ez/shine

* ergodox_ez/shine: invert indices for left half

* Fix matrix/abelx

* Fix matrix/m20add

* Remove custom rgblight driver for matrix/noah - should be done with lighting layers

* Fix LED indexes for RGBLight split

* Rename `convert_rgb_to_rgbw()` to `ws2812_rgb_to_rgbw()`

* Update WS2812 API docs

* `ergodox_ez/shine`: simplify LED index calculation

* LED/RGB Matrix: Add weak function for LED index resolution

* Bandaid fix for RGB Matrix splits not using WS2812

* `steelseries/prime_plus`: redo custom RGBLight driver

* Update keyboards/steelseries/prime_plus/rgblight_custom.c

Co-authored-by: Dasky <32983009+daskygit@users.noreply.github.com>

---------

Co-authored-by: Dasky <32983009+daskygit@users.noreply.github.com>
This commit is contained in:
Ryan 2024-10-06 19:01:07 +11:00 committed by GitHub
parent 43e82ed5c7
commit 208ebf54a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
61 changed files with 649 additions and 672 deletions

View file

@ -41,20 +41,6 @@ uint8_t read_pin(uint16_t pin)
return (data & (1<<GET_PIN(pin))) ? 1 : 0;
}
void matrix_init_kb(void) {
#ifdef RGBLIGHT_ENABLE
aw9523b_init(AW9523B_ADDR);
#endif
matrix_init_user();
}
void housekeeping_task_kb(void) {
#ifdef RGBLIGHT_ENABLE
aw9523b_update_pwm_buffers(AW9523B_ADDR);
#endif
}
#ifdef RGBLIGHT_ENABLE
#include "rgblight.h"
#include "ws2812.h"
@ -67,20 +53,35 @@ const aw9523b_led g_aw9523b_leds[AW9523B_RGB_NUM] = {
{AW9523B_P07_PWM, AW9523B_P06_PWM, AW9523B_P05_PWM},
};
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;
void init_custom(void) {
aw9523b_init(AW9523B_ADDR);
ws2812_init();
}
ws2812_setleds(start_led, num);
for (int i = 0; i < num; i++) {
aw9523b_set_color(i, start_led[i].r, start_led[i].g, start_led[i].b);
void set_color_custom(int index, uint8_t red, uint8_t green, uint8_t blue) {
if (index < AW9523B_RGB_NUM) {
aw9523b_set_color(index, red, green, blue);
} else {
ws2812_set_color(index - AW9523B_RGB_NUM, red, green, blue);
}
}
void set_color_all_custom(uint8_t red, uint8_t green, uint8_t blue) {
for (int i = 0; i < RGBLIGHT_LED_COUNT; i++) {
set_color_custom(i, red, green, blue);
}
}
void flush_custom(void) {
aw9523b_update_pwm_buffers(AW9523B_ADDR);
ws2812_flush();
}
const rgblight_driver_t rgblight_driver = {
.init = ws2812_init,
.setleds = setleds_custom,
.init = init_custom,
.set_color = set_color_custom,
.set_color_all = set_color_all_custom,
.flush = flush_custom,
};
#endif

View file

@ -89,5 +89,6 @@
#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2
#define AW9523B_RGB_NUM 4
#define WS2812_LED_COUNT 5
#define EARLY_INIT_PERFORM_BOOTLOADER_JUMP FALSE

View file

@ -27,13 +27,6 @@ uint8_t read_pin(uint16_t pin)
return (data & (1<<GET_PIN(pin))) ? 1 : 0;
}
void matrix_init_kb(void) {
#ifdef RGBLIGHT_ENABLE
rgb_ring_init();
#endif
matrix_init_user();
}
void housekeeping_task_kb(void) {
#ifdef RGBLIGHT_ENABLE
rgb_ring_task();

View file

@ -361,27 +361,22 @@ static void custom_effects(void)
effect_funcs[rgb_ring.effect]();
}
void setleds_custom(rgb_led_t *start_led, uint16_t num_leds)
{
void flush_custom(void) {
if (rgb_ring.state != RING_STATE_QMK) {
return;
}
for (uint8_t i = 0; i < num_leds; i++) {
is31fl3731_set_color(i, start_led[i].r, start_led[i].g, start_led[i].b);
}
is31fl3731_flush();
}
const rgblight_driver_t rgblight_driver = {
.setleds = setleds_custom,
.init = is31fl3731_init_drivers,
.set_color = is31fl3731_set_color,
.set_color_all = is31fl3731_set_color_all,
.flush = flush_custom,
};
void rgb_ring_init(void)
{
is31fl3731_init_drivers();
}
void rgb_ring_task(void)
{
switch (rgb_ring.state) {
@ -397,8 +392,6 @@ void rgb_ring_task(void)
default:
break;
};
is31fl3731_flush();
}
bool process_record_kb(uint16_t keycode, keyrecord_t *record)

View file

@ -19,5 +19,4 @@
#pragma once
void rgb_ring_init(void);
void rgb_ring_task(void);

View file

@ -10,7 +10,7 @@
"no_startup_check": true
},
"rgblight": {
"driver": "custom",
"driver": "ws2812",
"led_count": 7,
"animations": {
"breathing": true,

View file

@ -9,57 +9,6 @@ void bootloader_jump(void) {
NVIC_SystemReset();
}
#ifdef RGBLIGHT_ENABLE
#include <string.h>
#include "rgblight.h"
#include "ws2812.h"
extern rgblight_config_t rgblight_config;
// led 0 for caps lock, led 1 for scroll lock, led 3 for num lock
// led 4 for layer 1, led 5 for layer 2, led 6 for layer 3, led 7 for layer 4
#if RGBLIGHT_LED_COUNT < 7
#error "MUST set the RGBLIGHT_LED_COUNT bigger than 7"
#endif
rgb_led_t noah_leds[RGBLIGHT_LED_COUNT];
static bool noah_led_mode = false;
void setleds_custom(rgb_led_t *ledarray, uint16_t num_leds) {
memset(&noah_leds[0], 0, sizeof(noah_leds));
if (!rgblight_config.enable) {
for (uint8_t i = 0; i < RGBLIGHT_LED_COUNT; i++) {
ledarray[i].r = 0;
ledarray[i].g = 0;
ledarray[i].b = 0;
}
}
if (noah_led_mode) {
led_t led_state = host_keyboard_led_state();
if (led_state.caps_lock) {
noah_leds[0] = ledarray[0];
}
if (led_state.scroll_lock) {
noah_leds[1] = ledarray[1];
}
if (led_state.num_lock) {
noah_leds[2] = ledarray[2];
}
for (int32_t i = 0; i < 4; i++) {
if(layer_state_is(i+1)) {
noah_leds[i + 3] = ledarray[i + 3];
}
}
} else {
memcpy(&noah_leds[0], &ledarray[0], sizeof(noah_leds));
}
ws2812_setleds(noah_leds, RGBLIGHT_LED_COUNT);
}
const rgblight_driver_t rgblight_driver = {
.init = ws2812_init,
.setleds = setleds_custom,
};
#endif
#ifdef RGB_MATRIX_ENABLE
const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
/* Refer to IS31 manual for these locations
@ -150,11 +99,6 @@ const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch(keycode) {
#ifdef RGBLIGHT_ENABLE
case KC_F24: // switch the led mode on or off
noah_led_mode = !noah_led_mode;
return false;
#ifdef RGB_MATRIX_ENABLE
case KC_F13: // toggle rgb matrix
rgb_matrix_toggle();
@ -162,7 +106,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
case KC_F14:
rgb_matrix_step();
return false;
#endif
#endif
default:
break;