Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Features/ws2812 matrix driver (#5418) #13

Merged
merged 3 commits into from
Apr 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
04-12-2019 - Add AltGr/RALT support to Send String (qmk#4046)
04-12-2019 - Add AltGr/RALT support to Send String (qmk#4046)
04-12-2019 - Port DIRECT_PINS from split_common/matrix.c to matrix.c (qmk#5091)
04-12-2019 - Enhancement for Eager debouncing (and Ergodox EZ host sleep fix) (qmk#5621)
04-12-2019 - Enhancement for Eager debouncing (and Ergodox EZ host sleep fix) (qmk#5621)
04-16-2019 - Fix logic for Combo feature (qmk#5610)
04-16-2019 - Fix info.json for Ergodox EZ
04-16-2019 - Fix info.json for Ergodox EZ
04-16-2019 - Add support for WS2812 based RGB Matrix
7 changes: 6 additions & 1 deletion common_features.mk
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
endif
endif

VALID_MATRIX_TYPES := yes IS31FL3731 IS31FL3733 IS31FL3737 custom
VALID_MATRIX_TYPES := yes IS31FL3731 IS31FL3733 IS31FL3737 WS2812 custom

LED_MATRIX_ENABLE ?= no
ifneq ($(strip $(LED_MATRIX_ENABLE)), no)
Expand Down Expand Up @@ -172,6 +172,11 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3737)
SRC += i2c_master.c
endif

ifeq ($(strip $(RGB_MATRIX_ENABLE)), WS2812)
OPT_DEFS += -DWS2812
SRC += ws2812.c
endif

ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
OPT_DEFS += -DTAP_DANCE_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
Expand Down
25 changes: 25 additions & 0 deletions drivers/avr/ws2812.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@
#include <util/delay.h>
#include "debug.h"

#if !defined(LED_ARRAY) && defined(RGB_MATRIX_ENABLE)
// LED color buffer
LED_TYPE led[DRIVER_LED_TOTAL];
#define LED_ARRAY led
#endif

#ifdef RGBW_BB_TWI

// Port for the I2C
Expand Down Expand Up @@ -141,6 +147,25 @@ unsigned char I2C_Write(unsigned char c)

#endif

#ifdef RGB_MATRIX_ENABLE
// Set an led in the buffer to a color
void inline ws2812_setled(int i, uint8_t r, uint8_t g, uint8_t b)
{
led[i].r = r;
led[i].g = g;
led[i].b = b;
}

void ws2812_setled_all (uint8_t r, uint8_t g, uint8_t b)
{
for (int i = 0; i < RGBLED_NUM; i++) {
led[i].r = r;
led[i].g = g;
led[i].b = b;
}
}
#endif

// Setleds for standard RGB
void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds)
{
Expand Down
5 changes: 4 additions & 1 deletion drivers/avr/ws2812.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@

#include "rgblight_types.h"


/* User Interface
*
* Input:
Expand All @@ -43,6 +42,10 @@
* - Send out the LED data
* - Wait 50�s to reset the LEDs
*/
#ifdef RGB_MATRIX_ENABLE
void ws2812_setled (int index, uint8_t r, uint8_t g, uint8_t b);
void ws2812_setled_all (uint8_t r, uint8_t g, uint8_t b);
#endif

void ws2812_setleds (LED_TYPE *ledarray, uint16_t number_of_leds);
void ws2812_setleds_pin (LED_TYPE *ledarray, uint16_t number_of_leds,uint8_t pinmask);
Expand Down
6 changes: 4 additions & 2 deletions quantum/rgb_matrix.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@
#ifdef IS31FL3731
#include "is31fl3731.h"
#elif defined (IS31FL3733)
#include "is31fl3733.h"
#include "is31fl3733.h"
#elif defined (IS31FL3737)
#include "is31fl3737.h"
#include "is31fl3737.h"
#elif defined (WS2812)
#include "ws2812.h"
#endif

#ifndef RGB_MATRIX_LED_FLUSH_LIMIT
Expand Down
21 changes: 21 additions & 0 deletions quantum/rgb_matrix_drivers.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,25 @@ const rgb_matrix_driver_t rgb_matrix_driver = {
};
#endif

#elif defined(WS2812)

extern LED_TYPE led[RGBLED_NUM];

static void flush( void )
{
// Assumes use of RGB_DI_PIN
ws2812_setleds(led, RGBLED_NUM);
}

static void init( void )
{

}

const rgb_matrix_driver_t rgb_matrix_driver = {
.init = init,
.flush = flush,
.set_color = ws2812_setled,
.set_color_all = ws2812_setled_all,
};
#endif
4 changes: 4 additions & 0 deletions quantum/rgblight.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,11 @@ const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90};
rgblight_config_t rgblight_config;
bool is_rgblight_initialized = false;

#ifndef LED_ARRAY
LED_TYPE led[RGBLED_NUM];
#define LED_ARRAY led
#endif

bool rgblight_timer_enabled = false;

static uint8_t clipping_start_pos = 0;
Expand Down