From a858ea4ca8d9a57a88737e74657eac36eae5128f Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Fri, 8 Nov 2019 22:49:23 -0800 Subject: [PATCH 1/7] Move Ergodox EZ RGB code to custom driver Also implements full addressing of Ergodox EZ's LED Strip, as written by seebs Co-authored-by: Seebs --- keyboards/ergodox_ez/config.h | 12 +- keyboards/ergodox_ez/post_config.h | 20 ++ keyboards/ergodox_ez/rules.mk | 5 +- keyboards/ergodox_ez/ws2812_bb_i2c.c | 356 +++++++++++++++++++++++++++ quantum/rgblight.c | 10 +- 5 files changed, 393 insertions(+), 10 deletions(-) create mode 100644 keyboards/ergodox_ez/post_config.h create mode 100644 keyboards/ergodox_ez/ws2812_bb_i2c.c diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h index bb51ec3215fd..e60101e5e2ea 100644 --- a/keyboards/ergodox_ez/config.h +++ b/keyboards/ergodox_ez/config.h @@ -75,17 +75,21 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D7 #define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 15 // Number of LEDs #define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_SAT_STEP 255 #define RGBLIGHT_VAL_STEP 12 +// Pick one of the modes +// Defaults to 15 mirror, for legacy behavior + +// #define ERGODOX_LED_15 // Addresses 15 LEDs, but same position on both halves +// #define ERGODOX_LED_15_MIRROR // Addresses 15 LEDs, but are mirrored +// #define ERGODOX_LED_30 // Addresses all 30 LED individually + /* fix space cadet rollover issue */ #define DISABLE_SPACE_CADET_ROLLOVER -#define RGBW_BB_TWI - -#define RGBW 1 +#define RGBW #define RGBLIGHT_SLEEP diff --git a/keyboards/ergodox_ez/post_config.h b/keyboards/ergodox_ez/post_config.h new file mode 100644 index 000000000000..526cc8c41784 --- /dev/null +++ b/keyboards/ergodox_ez/post_config.h @@ -0,0 +1,20 @@ +#pragma once + +#if !defined(ERGODOX_LED_15) && !defined(ERGODOX_LED_30) +// if no value is defined, assume previous behavior +// # define ERGODOX_LED_15 +// # define ERGODOX_LED_30 +# define ERGODOX_LED_15_MIRROR +#endif + +#if (defined(ERGODOX_LED_30) + defined(ERGODOX_LED_15) + defined(ERGODOX_LED_15_MIRROR)) != 1 +# error "You must only define one of the ERGODOX_LED options." +#endif + +#ifdef ERGODOX_LED_30 +// If using 30 LEDs, then define that many +# define RGBLED_NUM 30 // Number of LEDs +#else +// If not, then only define 15 +# define RGBLED_NUM 15 // Number of LEDs +#endif diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index dbc35f6836fd..215296c5e503 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -31,11 +31,14 @@ SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard SLEEP_LED_ENABLE = no API_SYSEX_ENABLE = no RGBLIGHT_ENABLE = yes +RGBLIGHT_CUSTOM_DRIVER = yes + RGB_MATRIX_ENABLE = no # enable later DEBOUNCE_TYPE = eager_pr # project specific files -SRC += matrix.c +SRC += matrix.c \ + ws2812_bb_i2c.c QUANTUM_LIB_SRC += i2c_master.c LAYOUTS = ergodox diff --git a/keyboards/ergodox_ez/ws2812_bb_i2c.c b/keyboards/ergodox_ez/ws2812_bb_i2c.c new file mode 100644 index 000000000000..5c8ada5cb829 --- /dev/null +++ b/keyboards/ergodox_ez/ws2812_bb_i2c.c @@ -0,0 +1,356 @@ +/* + * light weight WS2812 lib V2.0b + * + * Controls WS2811/WS2812/WS2812B RGB-LEDs + * Author: Tim (cpldcpu@gmail.com) + * + * Jan 18th, 2014 v2.0b Initial Version + * Nov 29th, 2015 v2.3 Added SK6812RGBW support + * + * 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 . + */ +#ifdef RGBLIGHT_ENABLE + +# include "ws2812.h" +# include +# include +# include +# include "rgblight.h" + +extern uint8_t clipping_start_pos; +extern uint8_t clipping_num_leds; +extern uint8_t effect_start_pos; +extern uint8_t effect_end_pos; +extern uint8_t effect_num_leds; +extern rgblight_config_t rgblight_config; + +/* + * Forward declare internal functions + * + * The functions take a byte-array and send to the data output as WS2812 bitstream. + * The length is the number of bytes to send - three per LED. + */ + +void ws2812_sendarray(uint8_t *array, uint16_t length); +void ws2812_sendarray_mask(uint8_t *array, uint16_t length, uint8_t pinmask); + +// Port for the I2C +# define I2C_DDR DDRD +# define I2C_PIN PIND +# define I2C_PORT PORTD + +// Pins to be used in the bit banging +# define I2C_CLK 0 +# define I2C_DAT 1 + +# define I2C_DATA_HI() \ + I2C_DDR &= ~(1 << I2C_DAT); \ + I2C_PORT |= (1 << I2C_DAT); +# define I2C_DATA_LO() \ + I2C_DDR |= (1 << I2C_DAT); \ + I2C_PORT &= ~(1 << I2C_DAT); + +# define I2C_CLOCK_HI() \ + I2C_DDR &= ~(1 << I2C_CLK); \ + I2C_PORT |= (1 << I2C_CLK); +# define I2C_CLOCK_LO() \ + I2C_DDR |= (1 << I2C_CLK); \ + I2C_PORT &= ~(1 << I2C_CLK); + +# define I2C_DELAY 1 + +void I2C_WriteBit(unsigned char c) { + if (c > 0) { + I2C_DATA_HI(); + } else { + I2C_DATA_LO(); + } + + I2C_CLOCK_HI(); + _delay_us(I2C_DELAY); + + I2C_CLOCK_LO(); + _delay_us(I2C_DELAY); + + if (c > 0) { + I2C_DATA_LO(); + } + + _delay_us(I2C_DELAY); +} + +// Inits bitbanging port, must be called before using the functions below +// +void I2C_Init(void) { + I2C_PORT &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); + + I2C_CLOCK_HI(); + I2C_DATA_HI(); + + _delay_us(I2C_DELAY); +} + +// Send a START Condition +// +void I2C_Start(void) { + // set both to high at the same time + I2C_DDR &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); + _delay_us(I2C_DELAY); + + I2C_DATA_LO(); + _delay_us(I2C_DELAY); + + I2C_CLOCK_LO(); + _delay_us(I2C_DELAY); +} + +// Send a STOP Condition +// +void I2C_Stop(void) { + I2C_CLOCK_HI(); + _delay_us(I2C_DELAY); + + I2C_DATA_HI(); + _delay_us(I2C_DELAY); +} + +// write a byte to the I2C slave device +// +unsigned char I2C_Write(unsigned char c) { + for (char i = 0; i < 8; i++) { + I2C_WriteBit(c & 128); + + c <<= 1; + } + + I2C_WriteBit(0); + _delay_us(I2C_DELAY); + _delay_us(I2C_DELAY); + + // _delay_us(I2C_DELAY); + // return I2C_ReadBit(); + return 0; +} + +// Setleds for standard RGB +void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) { + // ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin)); + ws2812_setleds_pin(ledarray, leds, _BV(RGB_DI_PIN & 0xF)); +} + +void inline ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask) { + uint8_t sreg_prev, twcr_prev; + sreg_prev = SREG; + twcr_prev = TWCR; + cli(); + TWCR &= ~(1 << TWEN); + I2C_Init(); + I2C_Start(); + I2C_Write(0x84); + int i = 0; +# if defined(ERGODOX_LED_30) + // prevent right-half code from trying to bitbang all 30 + // so with 30 LEDs, we count from 29 to 15 here, and the + // other half does 0 to 14. + leds = leds / 2; + for (i = leds + leds - 1; i >= leds; --i) +# elif defined(ERGODOX_LED_15_MIRROR) + for (i = 0; i < leds; ++i) +# else // ERGDOX_LED_15 non-mirrored + for (i = leds - 1; i >= 0; --i) +# endif + { + uint8_t *data = (uint8_t *)(ledarray + i); + I2C_Write(*data++); + I2C_Write(*data++); + I2C_Write(*data++); + I2C_Write(*data++); + } + I2C_Stop(); + SREG = sreg_prev; + TWCR = twcr_prev; + // ws2812_DDRREG |= pinmask; // Enable DDR + // new universal format (DDR) + _SFR_IO8((RGB_DI_PIN >> 4) + 1) |= pinmask; + + // note, in the 30-LED ergodox case, "leds" was already halved, so + // we only send the first half + + ws2812_sendarray_mask((uint8_t *)ledarray, leds * sizeof(LED_TYPE), pinmask); +} + +void rgblight_set(void) { + LED_TYPE *start_led; + uint16_t num_leds = clipping_num_leds; + + if (!rgblight_config.enable) { + for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) { + led[i].r = 0; + led[i].g = 0; + led[i].b = 0; + led[i].w = 0; + } + } +# ifdef RGBLIGHT_LED_MAP + LED_TYPE led0[RGBLED_NUM]; + for (uint8_t i = 0; i < RGBLED_NUM; i++) { + led0[i] = led[pgm_read_byte(&led_map[i])]; + } + start_led = led0 + clipping_start_pos; +# else + start_led = led + clipping_start_pos; +# endif + ws2812_setleds(start_led, num_leds); +} + +void ws2812_sendarray(uint8_t *data, uint16_t datlen) { ws2812_sendarray_mask(data, datlen, _BV(RGB_DI_PIN & 0xF)); } + +/* + This routine writes an array of bytes with RGB values to the Dataout pin + using the fast 800kHz clockless WS2811/2812 protocol. +*/ + +// Timing in ns +# define w_zeropulse 350 +# define w_onepulse 900 +# define w_totalperiod 1250 + +// Fixed cycles used by the inner loop +# define w_fixedlow 2 +# define w_fixedhigh 4 +# define w_fixedtotal 8 + +// Insert NOPs to match the timing, if possible +# define w_zerocycles (((F_CPU / 1000) * w_zeropulse) / 1000000) +# define w_onecycles (((F_CPU / 1000) * w_onepulse + 500000) / 1000000) +# define w_totalcycles (((F_CPU / 1000) * w_totalperiod + 500000) / 1000000) + +// w1 - nops between rising edge and falling edge - low +# define w1 (w_zerocycles - w_fixedlow) +// w2 nops between fe low and fe high +# define w2 (w_onecycles - w_fixedhigh - w1) +// w3 nops to complete loop +# define w3 (w_totalcycles - w_fixedtotal - w1 - w2) + +# if w1 > 0 +# define w1_nops w1 +# else +# define w1_nops 0 +# endif + +// The only critical timing parameter is the minimum pulse length of the "0" +// Warn or throw error if this timing can not be met with current F_CPU settings. +# define w_lowtime ((w1_nops + w_fixedlow) * 1000000) / (F_CPU / 1000) +# if w_lowtime > 550 +# error "Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?" +# elif w_lowtime > 450 +# warning "Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S)." +# warning "Please consider a higher clockspeed, if possible" +# endif + +# if w2 > 0 +# define w2_nops w2 +# else +# define w2_nops 0 +# endif + +# if w3 > 0 +# define w3_nops w3 +# else +# define w3_nops 0 +# endif + +# define w_nop1 "nop \n\t" +# define w_nop2 "rjmp .+0 \n\t" +# define w_nop4 w_nop2 w_nop2 +# define w_nop8 w_nop4 w_nop4 +# define w_nop16 w_nop8 w_nop8 + +void inline ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t maskhi) { + uint8_t curbyte, ctr, masklo; + uint8_t sreg_prev; + + // masklo =~maskhi&ws2812_PORTREG; + // maskhi |= ws2812_PORTREG; + masklo = ~maskhi & _SFR_IO8((RGB_DI_PIN >> 4) + 2); + maskhi |= _SFR_IO8((RGB_DI_PIN >> 4) + 2); + sreg_prev = SREG; + cli(); + + while (datlen--) { + curbyte = (*data++); + + asm volatile(" ldi %0,8 \n\t" + "loop%=: \n\t" + " out %2,%3 \n\t" // '1' [01] '0' [01] - re +# if (w1_nops & 1) + w_nop1 +# endif +# if (w1_nops & 2) + w_nop2 +# endif +# if (w1_nops & 4) + w_nop4 +# endif +# if (w1_nops & 8) + w_nop8 +# endif +# if (w1_nops & 16) + w_nop16 +# endif + " sbrs %1,7 \n\t" // '1' [03] '0' [02] + " out %2,%4 \n\t" // '1' [--] '0' [03] - fe-low + " lsl %1 \n\t" // '1' [04] '0' [04] +# if (w2_nops & 1) + w_nop1 +# endif +# if (w2_nops & 2) + w_nop2 +# endif +# if (w2_nops & 4) + w_nop4 +# endif +# if (w2_nops & 8) + w_nop8 +# endif +# if (w2_nops & 16) + w_nop16 +# endif + " out %2,%4 \n\t" // '1' [+1] '0' [+1] - fe-high +# if (w3_nops & 1) + w_nop1 +# endif +# if (w3_nops & 2) + w_nop2 +# endif +# if (w3_nops & 4) + w_nop4 +# endif +# if (w3_nops & 8) + w_nop8 +# endif +# if (w3_nops & 16) + w_nop16 +# endif + + " dec %0 \n\t" // '1' [+2] '0' [+2] + " brne loop%=\n\t" // '1' [+3] '0' [+4] + : "=&d"(ctr) + : "r"(curbyte), "I"(_SFR_IO_ADDR(_SFR_IO8((RGB_DI_PIN >> 4) + 2))), "r"(maskhi), "r"(masklo)); + } + + SREG = sreg_prev; +} + +#endif // RGBLIGHT_ENABLE diff --git a/quantum/rgblight.c b/quantum/rgblight.c index a4cbe513e17b..228037350bf3 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -95,11 +95,11 @@ LED_TYPE led[RGBLED_NUM]; # define LED_ARRAY led #endif -static uint8_t clipping_start_pos = 0; -static uint8_t clipping_num_leds = RGBLED_NUM; -static uint8_t effect_start_pos = 0; -static uint8_t effect_end_pos = RGBLED_NUM; -static uint8_t effect_num_leds = RGBLED_NUM; +uint8_t clipping_start_pos = 0; +uint8_t clipping_num_leds = RGBLED_NUM; +uint8_t effect_start_pos = 0; +uint8_t effect_end_pos = RGBLED_NUM; +uint8_t effect_num_leds = RGBLED_NUM; void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) { clipping_start_pos = start_pos; From cae914c8e95642d842eb11c3247be816214d4e90 Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Fri, 8 Nov 2019 22:51:33 -0800 Subject: [PATCH 2/7] Make Clipping range accessible for custom drivers --- keyboards/ergodox_ez/ws2812_bb_i2c.c | 5 ----- quantum/rgblight.c | 8 ++++++++ quantum/rgblight.h | 8 ++++++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/keyboards/ergodox_ez/ws2812_bb_i2c.c b/keyboards/ergodox_ez/ws2812_bb_i2c.c index 5c8ada5cb829..2eaf1956fe49 100644 --- a/keyboards/ergodox_ez/ws2812_bb_i2c.c +++ b/keyboards/ergodox_ez/ws2812_bb_i2c.c @@ -28,11 +28,6 @@ # include # include "rgblight.h" -extern uint8_t clipping_start_pos; -extern uint8_t clipping_num_leds; -extern uint8_t effect_start_pos; -extern uint8_t effect_end_pos; -extern uint8_t effect_num_leds; extern rgblight_config_t rgblight_config; /* diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 228037350bf3..a68e88cea988 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -95,11 +95,19 @@ LED_TYPE led[RGBLED_NUM]; # define LED_ARRAY led #endif +#ifndef RGBLIGHT_CUSTOM_DRIVER +static uint8_t clipping_start_pos = 0; +static uint8_t clipping_num_leds = RGBLED_NUM; +static uint8_t effect_start_pos = 0; +static uint8_t effect_end_pos = RGBLED_NUM; +static uint8_t effect_num_leds = RGBLED_NUM; +#else uint8_t clipping_start_pos = 0; uint8_t clipping_num_leds = RGBLED_NUM; uint8_t effect_start_pos = 0; uint8_t effect_end_pos = RGBLED_NUM; uint8_t effect_num_leds = RGBLED_NUM; +#endif void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) { clipping_start_pos = start_pos; diff --git a/quantum/rgblight.h b/quantum/rgblight.h index e3aa098e4db1..175d4536aa45 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -149,6 +149,14 @@ extern const uint8_t RGBLED_KNIGHT_INTERVALS[3] PROGMEM; extern const uint16_t RGBLED_RGBTEST_INTERVALS[1] PROGMEM; extern bool is_rgblight_initialized; +#ifdef RGBLIGHT_CUSTOM_DRIVER +extern uint8_t clipping_start_pos; +extern uint8_t clipping_num_leds; +extern uint8_t effect_start_pos; +extern uint8_t effect_end_pos; +extern uint8_t effect_num_leds; +#endif + // Should stay in sycn with rgb matrix config as we reuse eeprom storage for both (for now) typedef union { uint32_t raw; From b0d11d29f732d468b8aa87be08b10950bfec7492 Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Fri, 8 Nov 2019 22:59:03 -0800 Subject: [PATCH 3/7] Remove RGBW_BB_TWI from driver and docs --- drivers/avr/ws2812.c | 129 +------------------------------------------ 1 file changed, 2 insertions(+), 127 deletions(-) diff --git a/drivers/avr/ws2812.c b/drivers/avr/ws2812.c index dc7e8d48a824..82d985c20acd 100644 --- a/drivers/avr/ws2812.c +++ b/drivers/avr/ws2812.c @@ -36,108 +36,6 @@ void ws2812_sendarray(uint8_t *array, uint16_t length); void ws2812_sendarray_mask(uint8_t *array, uint16_t length, uint8_t pinmask); -#ifdef RGBW_BB_TWI - -// Port for the I2C -# define I2C_DDR DDRD -# define I2C_PIN PIND -# define I2C_PORT PORTD - -// Pins to be used in the bit banging -# define I2C_CLK 0 -# define I2C_DAT 1 - -# define I2C_DATA_HI() \ - I2C_DDR &= ~(1 << I2C_DAT); \ - I2C_PORT |= (1 << I2C_DAT); -# define I2C_DATA_LO() \ - I2C_DDR |= (1 << I2C_DAT); \ - I2C_PORT &= ~(1 << I2C_DAT); - -# define I2C_CLOCK_HI() \ - I2C_DDR &= ~(1 << I2C_CLK); \ - I2C_PORT |= (1 << I2C_CLK); -# define I2C_CLOCK_LO() \ - I2C_DDR |= (1 << I2C_CLK); \ - I2C_PORT &= ~(1 << I2C_CLK); - -# define I2C_DELAY 1 - -void I2C_WriteBit(unsigned char c) { - if (c > 0) { - I2C_DATA_HI(); - } else { - I2C_DATA_LO(); - } - - I2C_CLOCK_HI(); - _delay_us(I2C_DELAY); - - I2C_CLOCK_LO(); - _delay_us(I2C_DELAY); - - if (c > 0) { - I2C_DATA_LO(); - } - - _delay_us(I2C_DELAY); -} - -// Inits bitbanging port, must be called before using the functions below -// -void I2C_Init(void) { - I2C_PORT &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); - - I2C_CLOCK_HI(); - I2C_DATA_HI(); - - _delay_us(I2C_DELAY); -} - -// Send a START Condition -// -void I2C_Start(void) { - // set both to high at the same time - I2C_DDR &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); - _delay_us(I2C_DELAY); - - I2C_DATA_LO(); - _delay_us(I2C_DELAY); - - I2C_CLOCK_LO(); - _delay_us(I2C_DELAY); -} - -// Send a STOP Condition -// -void I2C_Stop(void) { - I2C_CLOCK_HI(); - _delay_us(I2C_DELAY); - - I2C_DATA_HI(); - _delay_us(I2C_DELAY); -} - -// write a byte to the I2C slave device -// -unsigned char I2C_Write(unsigned char c) { - for (char i = 0; i < 8; i++) { - I2C_WriteBit(c & 128); - - c <<= 1; - } - - I2C_WriteBit(0); - _delay_us(I2C_DELAY); - _delay_us(I2C_DELAY); - - // _delay_us(I2C_DELAY); - // return I2C_ReadBit(); - return 0; -} - -#endif - // Setleds for standard RGB void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) { // ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin)); @@ -145,38 +43,15 @@ void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) { } void inline ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask) { -#ifdef RGBW_BB_TWI - uint8_t sreg_prev, twcr_prev; - sreg_prev = SREG; - twcr_prev = TWCR; - cli(); - TWCR &= ~(1 << TWEN); - I2C_Init(); - I2C_Start(); - I2C_Write(0x84); - uint16_t datlen = leds << 2; - uint8_t curbyte; - uint8_t *data = (uint8_t *)ledarray; - while (datlen--) { - curbyte = *data++; - I2C_Write(curbyte); - } - I2C_Stop(); - SREG = sreg_prev; - TWCR = twcr_prev; -#endif - // ws2812_DDRREG |= pinmask; // Enable DDR // new universal format (DDR) _SFR_IO8((RGB_DI_PIN >> 4) + 1) |= pinmask; ws2812_sendarray_mask((uint8_t *)ledarray, leds * sizeof(LED_TYPE), pinmask); -#ifndef RGBW_BB_TWI -# ifdef RGBW +#ifdef RGBW _delay_us(80); -# else +#else _delay_us(50); -# endif #endif } From a5164951746d843aa9b86fccd4c11397a8a2cc6b Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Mon, 11 Nov 2019 14:20:08 -0800 Subject: [PATCH 4/7] Revert changes to clipping range support --- quantum/rgblight.c | 8 -------- quantum/rgblight.h | 8 -------- 2 files changed, 16 deletions(-) diff --git a/quantum/rgblight.c b/quantum/rgblight.c index a68e88cea988..a4cbe513e17b 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -95,19 +95,11 @@ LED_TYPE led[RGBLED_NUM]; # define LED_ARRAY led #endif -#ifndef RGBLIGHT_CUSTOM_DRIVER static uint8_t clipping_start_pos = 0; static uint8_t clipping_num_leds = RGBLED_NUM; static uint8_t effect_start_pos = 0; static uint8_t effect_end_pos = RGBLED_NUM; static uint8_t effect_num_leds = RGBLED_NUM; -#else -uint8_t clipping_start_pos = 0; -uint8_t clipping_num_leds = RGBLED_NUM; -uint8_t effect_start_pos = 0; -uint8_t effect_end_pos = RGBLED_NUM; -uint8_t effect_num_leds = RGBLED_NUM; -#endif void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) { clipping_start_pos = start_pos; diff --git a/quantum/rgblight.h b/quantum/rgblight.h index 175d4536aa45..e3aa098e4db1 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -149,14 +149,6 @@ extern const uint8_t RGBLED_KNIGHT_INTERVALS[3] PROGMEM; extern const uint16_t RGBLED_RGBTEST_INTERVALS[1] PROGMEM; extern bool is_rgblight_initialized; -#ifdef RGBLIGHT_CUSTOM_DRIVER -extern uint8_t clipping_start_pos; -extern uint8_t clipping_num_leds; -extern uint8_t effect_start_pos; -extern uint8_t effect_end_pos; -extern uint8_t effect_num_leds; -#endif - // Should stay in sycn with rgb matrix config as we reuse eeprom storage for both (for now) typedef union { uint32_t raw; From 364b2d399f8e30e5d29ecd1e27e65a0d226e633a Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Mon, 11 Nov 2019 14:40:19 -0800 Subject: [PATCH 5/7] Use just rgblight_set instead of full custom driver --- keyboards/ergodox_ez/led_bb_i2c.c | 194 +++++++++++++++ keyboards/ergodox_ez/rules.mk | 3 +- keyboards/ergodox_ez/ws2812_bb_i2c.c | 351 --------------------------- 3 files changed, 196 insertions(+), 352 deletions(-) create mode 100644 keyboards/ergodox_ez/led_bb_i2c.c delete mode 100644 keyboards/ergodox_ez/ws2812_bb_i2c.c diff --git a/keyboards/ergodox_ez/led_bb_i2c.c b/keyboards/ergodox_ez/led_bb_i2c.c new file mode 100644 index 000000000000..f570b21650ff --- /dev/null +++ b/keyboards/ergodox_ez/led_bb_i2c.c @@ -0,0 +1,194 @@ +/* + * light weight WS2812 lib V2.0b + * + * Controls WS2811/WS2812/WS2812B RGB-LEDs + * Author: Tim (cpldcpu@gmail.com) + * + * Jan 18th, 2014 v2.0b Initial Version + * Nov 29th, 2015 v2.3 Added SK6812RGBW support + * + * 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 . + */ +#ifdef RGBLIGHT_ENABLE + +# include "ws2812.h" +# include +# include +# include +# include "rgblight.h" + +extern rgblight_config_t rgblight_config; + +/* + * Forward declare internal functions + * + * The functions take a byte-array and send to the data output as WS2812 bitstream. + * The length is the number of bytes to send - three per LED. + */ + +void ws2812_sendarray(uint8_t *array, uint16_t length); +void ws2812_sendarray_mask(uint8_t *array, uint16_t length, uint8_t pinmask); + +// Port for the I2C +# define I2C_DDR DDRD +# define I2C_PIN PIND +# define I2C_PORT PORTD + +// Pins to be used in the bit banging +# define I2C_CLK 0 +# define I2C_DAT 1 + +# define I2C_DATA_HI() \ + I2C_DDR &= ~(1 << I2C_DAT); \ + I2C_PORT |= (1 << I2C_DAT); +# define I2C_DATA_LO() \ + I2C_DDR |= (1 << I2C_DAT); \ + I2C_PORT &= ~(1 << I2C_DAT); + +# define I2C_CLOCK_HI() \ + I2C_DDR &= ~(1 << I2C_CLK); \ + I2C_PORT |= (1 << I2C_CLK); +# define I2C_CLOCK_LO() \ + I2C_DDR |= (1 << I2C_CLK); \ + I2C_PORT &= ~(1 << I2C_CLK); + +# define I2C_DELAY 1 + +void I2C_WriteBit(unsigned char c) { + if (c > 0) { + I2C_DATA_HI(); + } else { + I2C_DATA_LO(); + } + + I2C_CLOCK_HI(); + _delay_us(I2C_DELAY); + + I2C_CLOCK_LO(); + _delay_us(I2C_DELAY); + + if (c > 0) { + I2C_DATA_LO(); + } + + _delay_us(I2C_DELAY); +} + +// Inits bitbanging port, must be called before using the functions below +// +void I2C_Init(void) { + I2C_PORT &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); + + I2C_CLOCK_HI(); + I2C_DATA_HI(); + + _delay_us(I2C_DELAY); +} + +// Send a START Condition +// +void I2C_Start(void) { + // set both to high at the same time + I2C_DDR &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); + _delay_us(I2C_DELAY); + + I2C_DATA_LO(); + _delay_us(I2C_DELAY); + + I2C_CLOCK_LO(); + _delay_us(I2C_DELAY); +} + +// Send a STOP Condition +// +void I2C_Stop(void) { + I2C_CLOCK_HI(); + _delay_us(I2C_DELAY); + + I2C_DATA_HI(); + _delay_us(I2C_DELAY); +} + +// write a byte to the I2C slave device +// +unsigned char I2C_Write(unsigned char c) { + for (char i = 0; i < 8; i++) { + I2C_WriteBit(c & 128); + + c <<= 1; + } + + I2C_WriteBit(0); + _delay_us(I2C_DELAY); + _delay_us(I2C_DELAY); + + // _delay_us(I2C_DELAY); + // return I2C_ReadBit(); + return 0; +} + + + +void rgblight_set(void) { + if (!rgblight_config.enable) { + for (uint8_t i = 0; i < RGBLED_NUM; i++) { + led[i].r = 0; + led[i].g = 0; + led[i].b = 0; +#ifdef RGBW + led[i].w = 0; +#endif + } + } + + + uint8_t sreg_prev, twcr_prev; + uint8_t led_num = RGBLED_NUM; + sreg_prev = SREG; + twcr_prev = TWCR; + cli(); + TWCR &= ~(1 << TWEN); + I2C_Init(); + I2C_Start(); + I2C_Write(0x84); + int i = 0; +# if defined(ERGODOX_LED_30) + // prevent right-half code from trying to bitbang all 30 + // so with 30 LEDs, we count from 29 to 15 here, and the + // other half does 0 to 14. + led_num = RGBLED_NUM / 2; + for (i = led_num + led_num - 1; i >= led_num; --i) +# elif defined(ERGODOX_LED_15_MIRROR) + for (i = 0; i < led_num; ++i) +# else // ERGDOX_LED_15 non-mirrored + for (i = led_num - 1; i >= 0; --i) +# endif + { + uint8_t *data = (uint8_t *)(led + i); + I2C_Write(*data++); + I2C_Write(*data++); + I2C_Write(*data++); +#ifdef RGBW + I2C_Write(*data++); +#endif + } + I2C_Stop(); + SREG = sreg_prev; + TWCR = twcr_prev; + + ws2812_setleds(led, RGBLED_NUM); +} + + +#endif // RGBLIGHT_ENABLE diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index 215296c5e503..0e627ecb7ce0 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -38,7 +38,8 @@ DEBOUNCE_TYPE = eager_pr # project specific files SRC += matrix.c \ - ws2812_bb_i2c.c + ws2812.c \ + led_bb_i2c.c QUANTUM_LIB_SRC += i2c_master.c LAYOUTS = ergodox diff --git a/keyboards/ergodox_ez/ws2812_bb_i2c.c b/keyboards/ergodox_ez/ws2812_bb_i2c.c deleted file mode 100644 index 2eaf1956fe49..000000000000 --- a/keyboards/ergodox_ez/ws2812_bb_i2c.c +++ /dev/null @@ -1,351 +0,0 @@ -/* - * light weight WS2812 lib V2.0b - * - * Controls WS2811/WS2812/WS2812B RGB-LEDs - * Author: Tim (cpldcpu@gmail.com) - * - * Jan 18th, 2014 v2.0b Initial Version - * Nov 29th, 2015 v2.3 Added SK6812RGBW support - * - * 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 . - */ -#ifdef RGBLIGHT_ENABLE - -# include "ws2812.h" -# include -# include -# include -# include "rgblight.h" - -extern rgblight_config_t rgblight_config; - -/* - * Forward declare internal functions - * - * The functions take a byte-array and send to the data output as WS2812 bitstream. - * The length is the number of bytes to send - three per LED. - */ - -void ws2812_sendarray(uint8_t *array, uint16_t length); -void ws2812_sendarray_mask(uint8_t *array, uint16_t length, uint8_t pinmask); - -// Port for the I2C -# define I2C_DDR DDRD -# define I2C_PIN PIND -# define I2C_PORT PORTD - -// Pins to be used in the bit banging -# define I2C_CLK 0 -# define I2C_DAT 1 - -# define I2C_DATA_HI() \ - I2C_DDR &= ~(1 << I2C_DAT); \ - I2C_PORT |= (1 << I2C_DAT); -# define I2C_DATA_LO() \ - I2C_DDR |= (1 << I2C_DAT); \ - I2C_PORT &= ~(1 << I2C_DAT); - -# define I2C_CLOCK_HI() \ - I2C_DDR &= ~(1 << I2C_CLK); \ - I2C_PORT |= (1 << I2C_CLK); -# define I2C_CLOCK_LO() \ - I2C_DDR |= (1 << I2C_CLK); \ - I2C_PORT &= ~(1 << I2C_CLK); - -# define I2C_DELAY 1 - -void I2C_WriteBit(unsigned char c) { - if (c > 0) { - I2C_DATA_HI(); - } else { - I2C_DATA_LO(); - } - - I2C_CLOCK_HI(); - _delay_us(I2C_DELAY); - - I2C_CLOCK_LO(); - _delay_us(I2C_DELAY); - - if (c > 0) { - I2C_DATA_LO(); - } - - _delay_us(I2C_DELAY); -} - -// Inits bitbanging port, must be called before using the functions below -// -void I2C_Init(void) { - I2C_PORT &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); - - I2C_CLOCK_HI(); - I2C_DATA_HI(); - - _delay_us(I2C_DELAY); -} - -// Send a START Condition -// -void I2C_Start(void) { - // set both to high at the same time - I2C_DDR &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); - _delay_us(I2C_DELAY); - - I2C_DATA_LO(); - _delay_us(I2C_DELAY); - - I2C_CLOCK_LO(); - _delay_us(I2C_DELAY); -} - -// Send a STOP Condition -// -void I2C_Stop(void) { - I2C_CLOCK_HI(); - _delay_us(I2C_DELAY); - - I2C_DATA_HI(); - _delay_us(I2C_DELAY); -} - -// write a byte to the I2C slave device -// -unsigned char I2C_Write(unsigned char c) { - for (char i = 0; i < 8; i++) { - I2C_WriteBit(c & 128); - - c <<= 1; - } - - I2C_WriteBit(0); - _delay_us(I2C_DELAY); - _delay_us(I2C_DELAY); - - // _delay_us(I2C_DELAY); - // return I2C_ReadBit(); - return 0; -} - -// Setleds for standard RGB -void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) { - // ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin)); - ws2812_setleds_pin(ledarray, leds, _BV(RGB_DI_PIN & 0xF)); -} - -void inline ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask) { - uint8_t sreg_prev, twcr_prev; - sreg_prev = SREG; - twcr_prev = TWCR; - cli(); - TWCR &= ~(1 << TWEN); - I2C_Init(); - I2C_Start(); - I2C_Write(0x84); - int i = 0; -# if defined(ERGODOX_LED_30) - // prevent right-half code from trying to bitbang all 30 - // so with 30 LEDs, we count from 29 to 15 here, and the - // other half does 0 to 14. - leds = leds / 2; - for (i = leds + leds - 1; i >= leds; --i) -# elif defined(ERGODOX_LED_15_MIRROR) - for (i = 0; i < leds; ++i) -# else // ERGDOX_LED_15 non-mirrored - for (i = leds - 1; i >= 0; --i) -# endif - { - uint8_t *data = (uint8_t *)(ledarray + i); - I2C_Write(*data++); - I2C_Write(*data++); - I2C_Write(*data++); - I2C_Write(*data++); - } - I2C_Stop(); - SREG = sreg_prev; - TWCR = twcr_prev; - // ws2812_DDRREG |= pinmask; // Enable DDR - // new universal format (DDR) - _SFR_IO8((RGB_DI_PIN >> 4) + 1) |= pinmask; - - // note, in the 30-LED ergodox case, "leds" was already halved, so - // we only send the first half - - ws2812_sendarray_mask((uint8_t *)ledarray, leds * sizeof(LED_TYPE), pinmask); -} - -void rgblight_set(void) { - LED_TYPE *start_led; - uint16_t num_leds = clipping_num_leds; - - if (!rgblight_config.enable) { - for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) { - led[i].r = 0; - led[i].g = 0; - led[i].b = 0; - led[i].w = 0; - } - } -# ifdef RGBLIGHT_LED_MAP - LED_TYPE led0[RGBLED_NUM]; - for (uint8_t i = 0; i < RGBLED_NUM; i++) { - led0[i] = led[pgm_read_byte(&led_map[i])]; - } - start_led = led0 + clipping_start_pos; -# else - start_led = led + clipping_start_pos; -# endif - ws2812_setleds(start_led, num_leds); -} - -void ws2812_sendarray(uint8_t *data, uint16_t datlen) { ws2812_sendarray_mask(data, datlen, _BV(RGB_DI_PIN & 0xF)); } - -/* - This routine writes an array of bytes with RGB values to the Dataout pin - using the fast 800kHz clockless WS2811/2812 protocol. -*/ - -// Timing in ns -# define w_zeropulse 350 -# define w_onepulse 900 -# define w_totalperiod 1250 - -// Fixed cycles used by the inner loop -# define w_fixedlow 2 -# define w_fixedhigh 4 -# define w_fixedtotal 8 - -// Insert NOPs to match the timing, if possible -# define w_zerocycles (((F_CPU / 1000) * w_zeropulse) / 1000000) -# define w_onecycles (((F_CPU / 1000) * w_onepulse + 500000) / 1000000) -# define w_totalcycles (((F_CPU / 1000) * w_totalperiod + 500000) / 1000000) - -// w1 - nops between rising edge and falling edge - low -# define w1 (w_zerocycles - w_fixedlow) -// w2 nops between fe low and fe high -# define w2 (w_onecycles - w_fixedhigh - w1) -// w3 nops to complete loop -# define w3 (w_totalcycles - w_fixedtotal - w1 - w2) - -# if w1 > 0 -# define w1_nops w1 -# else -# define w1_nops 0 -# endif - -// The only critical timing parameter is the minimum pulse length of the "0" -// Warn or throw error if this timing can not be met with current F_CPU settings. -# define w_lowtime ((w1_nops + w_fixedlow) * 1000000) / (F_CPU / 1000) -# if w_lowtime > 550 -# error "Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?" -# elif w_lowtime > 450 -# warning "Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S)." -# warning "Please consider a higher clockspeed, if possible" -# endif - -# if w2 > 0 -# define w2_nops w2 -# else -# define w2_nops 0 -# endif - -# if w3 > 0 -# define w3_nops w3 -# else -# define w3_nops 0 -# endif - -# define w_nop1 "nop \n\t" -# define w_nop2 "rjmp .+0 \n\t" -# define w_nop4 w_nop2 w_nop2 -# define w_nop8 w_nop4 w_nop4 -# define w_nop16 w_nop8 w_nop8 - -void inline ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t maskhi) { - uint8_t curbyte, ctr, masklo; - uint8_t sreg_prev; - - // masklo =~maskhi&ws2812_PORTREG; - // maskhi |= ws2812_PORTREG; - masklo = ~maskhi & _SFR_IO8((RGB_DI_PIN >> 4) + 2); - maskhi |= _SFR_IO8((RGB_DI_PIN >> 4) + 2); - sreg_prev = SREG; - cli(); - - while (datlen--) { - curbyte = (*data++); - - asm volatile(" ldi %0,8 \n\t" - "loop%=: \n\t" - " out %2,%3 \n\t" // '1' [01] '0' [01] - re -# if (w1_nops & 1) - w_nop1 -# endif -# if (w1_nops & 2) - w_nop2 -# endif -# if (w1_nops & 4) - w_nop4 -# endif -# if (w1_nops & 8) - w_nop8 -# endif -# if (w1_nops & 16) - w_nop16 -# endif - " sbrs %1,7 \n\t" // '1' [03] '0' [02] - " out %2,%4 \n\t" // '1' [--] '0' [03] - fe-low - " lsl %1 \n\t" // '1' [04] '0' [04] -# if (w2_nops & 1) - w_nop1 -# endif -# if (w2_nops & 2) - w_nop2 -# endif -# if (w2_nops & 4) - w_nop4 -# endif -# if (w2_nops & 8) - w_nop8 -# endif -# if (w2_nops & 16) - w_nop16 -# endif - " out %2,%4 \n\t" // '1' [+1] '0' [+1] - fe-high -# if (w3_nops & 1) - w_nop1 -# endif -# if (w3_nops & 2) - w_nop2 -# endif -# if (w3_nops & 4) - w_nop4 -# endif -# if (w3_nops & 8) - w_nop8 -# endif -# if (w3_nops & 16) - w_nop16 -# endif - - " dec %0 \n\t" // '1' [+2] '0' [+2] - " brne loop%=\n\t" // '1' [+3] '0' [+4] - : "=&d"(ctr) - : "r"(curbyte), "I"(_SFR_IO_ADDR(_SFR_IO8((RGB_DI_PIN >> 4) + 2))), "r"(maskhi), "r"(masklo)); - } - - SREG = sreg_prev; -} - -#endif // RGBLIGHT_ENABLE From c4759af04e82498d513e97cde61f42c071315489 Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Mon, 11 Nov 2019 15:31:50 -0800 Subject: [PATCH 6/7] Convert to i2c_master commands --- keyboards/ergodox_ez/led_bb_i2c.c | 121 +++--------------------------- 1 file changed, 9 insertions(+), 112 deletions(-) diff --git a/keyboards/ergodox_ez/led_bb_i2c.c b/keyboards/ergodox_ez/led_bb_i2c.c index f570b21650ff..72a5d8f16170 100644 --- a/keyboards/ergodox_ez/led_bb_i2c.c +++ b/keyboards/ergodox_ez/led_bb_i2c.c @@ -27,6 +27,8 @@ # include # include # include "rgblight.h" +# include "i2c_master.h" +# include "ergodox_ez.h" extern rgblight_config_t rgblight_config; @@ -40,103 +42,6 @@ extern rgblight_config_t rgblight_config; void ws2812_sendarray(uint8_t *array, uint16_t length); void ws2812_sendarray_mask(uint8_t *array, uint16_t length, uint8_t pinmask); -// Port for the I2C -# define I2C_DDR DDRD -# define I2C_PIN PIND -# define I2C_PORT PORTD - -// Pins to be used in the bit banging -# define I2C_CLK 0 -# define I2C_DAT 1 - -# define I2C_DATA_HI() \ - I2C_DDR &= ~(1 << I2C_DAT); \ - I2C_PORT |= (1 << I2C_DAT); -# define I2C_DATA_LO() \ - I2C_DDR |= (1 << I2C_DAT); \ - I2C_PORT &= ~(1 << I2C_DAT); - -# define I2C_CLOCK_HI() \ - I2C_DDR &= ~(1 << I2C_CLK); \ - I2C_PORT |= (1 << I2C_CLK); -# define I2C_CLOCK_LO() \ - I2C_DDR |= (1 << I2C_CLK); \ - I2C_PORT &= ~(1 << I2C_CLK); - -# define I2C_DELAY 1 - -void I2C_WriteBit(unsigned char c) { - if (c > 0) { - I2C_DATA_HI(); - } else { - I2C_DATA_LO(); - } - - I2C_CLOCK_HI(); - _delay_us(I2C_DELAY); - - I2C_CLOCK_LO(); - _delay_us(I2C_DELAY); - - if (c > 0) { - I2C_DATA_LO(); - } - - _delay_us(I2C_DELAY); -} - -// Inits bitbanging port, must be called before using the functions below -// -void I2C_Init(void) { - I2C_PORT &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); - - I2C_CLOCK_HI(); - I2C_DATA_HI(); - - _delay_us(I2C_DELAY); -} - -// Send a START Condition -// -void I2C_Start(void) { - // set both to high at the same time - I2C_DDR &= ~((1 << I2C_DAT) | (1 << I2C_CLK)); - _delay_us(I2C_DELAY); - - I2C_DATA_LO(); - _delay_us(I2C_DELAY); - - I2C_CLOCK_LO(); - _delay_us(I2C_DELAY); -} - -// Send a STOP Condition -// -void I2C_Stop(void) { - I2C_CLOCK_HI(); - _delay_us(I2C_DELAY); - - I2C_DATA_HI(); - _delay_us(I2C_DELAY); -} - -// write a byte to the I2C slave device -// -unsigned char I2C_Write(unsigned char c) { - for (char i = 0; i < 8; i++) { - I2C_WriteBit(c & 128); - - c <<= 1; - } - - I2C_WriteBit(0); - _delay_us(I2C_DELAY); - _delay_us(I2C_DELAY); - - // _delay_us(I2C_DELAY); - // return I2C_ReadBit(); - return 0; -} @@ -153,15 +58,9 @@ void rgblight_set(void) { } - uint8_t sreg_prev, twcr_prev; uint8_t led_num = RGBLED_NUM; - sreg_prev = SREG; - twcr_prev = TWCR; - cli(); - TWCR &= ~(1 << TWEN); - I2C_Init(); - I2C_Start(); - I2C_Write(0x84); + i2c_init(); + i2c_start(0x84, ERGODOX_EZ_I2C_TIMEOUT); int i = 0; # if defined(ERGODOX_LED_30) // prevent right-half code from trying to bitbang all 30 @@ -176,16 +75,14 @@ void rgblight_set(void) { # endif { uint8_t *data = (uint8_t *)(led + i); - I2C_Write(*data++); - I2C_Write(*data++); - I2C_Write(*data++); + i2c_write(*data++, ERGODOX_EZ_I2C_TIMEOUT); + i2c_write(*data++, ERGODOX_EZ_I2C_TIMEOUT); + i2c_write(*data++, ERGODOX_EZ_I2C_TIMEOUT); #ifdef RGBW - I2C_Write(*data++); + i2c_write(*data++, ERGODOX_EZ_I2C_TIMEOUT); #endif } - I2C_Stop(); - SREG = sreg_prev; - TWCR = twcr_prev; + i2c_stop(); ws2812_setleds(led, RGBLED_NUM); } From 83139ece49297f931ea97140abe4f62ba1f91cba Mon Sep 17 00:00:00 2001 From: Drashna Jael're Date: Mon, 11 Nov 2019 21:12:20 -0800 Subject: [PATCH 7/7] Rename rgblight driver and clean up includes --- keyboards/ergodox_ez/{led_bb_i2c.c => led_i2c.c} | 7 +------ keyboards/ergodox_ez/rules.mk | 3 +-- 2 files changed, 2 insertions(+), 8 deletions(-) rename keyboards/ergodox_ez/{led_bb_i2c.c => led_i2c.c} (93%) diff --git a/keyboards/ergodox_ez/led_bb_i2c.c b/keyboards/ergodox_ez/led_i2c.c similarity index 93% rename from keyboards/ergodox_ez/led_bb_i2c.c rename to keyboards/ergodox_ez/led_i2c.c index 72a5d8f16170..3e75a8cd08ba 100644 --- a/keyboards/ergodox_ez/led_bb_i2c.c +++ b/keyboards/ergodox_ez/led_i2c.c @@ -22,12 +22,7 @@ */ #ifdef RGBLIGHT_ENABLE -# include "ws2812.h" -# include -# include -# include -# include "rgblight.h" -# include "i2c_master.h" +# include "ws2812.c" # include "ergodox_ez.h" extern rgblight_config_t rgblight_config; diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index 0e627ecb7ce0..fd8f5722d394 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -38,8 +38,7 @@ DEBOUNCE_TYPE = eager_pr # project specific files SRC += matrix.c \ - ws2812.c \ - led_bb_i2c.c + led_i2c.c QUANTUM_LIB_SRC += i2c_master.c LAYOUTS = ergodox