diff options
author | Erez Zukerman <bulk@ezuk.org> | 2018-07-03 20:06:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-03 20:06:36 +0200 |
commit | 9c2dde98e2b963704eb7cb87f6c53c52599fba53 (patch) | |
tree | ced26f98b401d83aee69a6ee3b17bf9fbc6ad556 /keyboards/ergodox_ez | |
parent | a7df902734b6aa8975e3a62a07ddb5544fd4ae85 (diff) | |
parent | 08283f61244479743c4ff5ecba39bd0264979d77 (diff) | |
download | qmk_firmware-9c2dde98e2b963704eb7cb87f6c53c52599fba53.tar.gz qmk_firmware-9c2dde98e2b963704eb7cb87f6c53c52599fba53.tar.xz |
Merge pull request #3229 from qmk/hf/shinydox
Adds I2C timeout and return values, adds support for future RGB Ergodox EZ
Diffstat (limited to 'keyboards/ergodox_ez')
-rw-r--r-- | keyboards/ergodox_ez/config.h | 14 | ||||
-rw-r--r-- | keyboards/ergodox_ez/ergodox_ez.c | 169 | ||||
-rw-r--r-- | keyboards/ergodox_ez/ergodox_ez.h | 5 | ||||
-rw-r--r-- | keyboards/ergodox_ez/matrix.c | 24 | ||||
-rw-r--r-- | keyboards/ergodox_ez/rules.mk | 7 |
5 files changed, 179 insertions, 40 deletions
diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h index ae70c4f2e..1285cbe1c 100644 --- a/keyboards/ergodox_ez/config.h +++ b/keyboards/ergodox_ez/config.h @@ -81,10 +81,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. /* fix space cadet rollover issue */ #define DISABLE_SPACE_CADET_ROLLOVER -// #define RGB_MIDI -#define RGBW_BB_TWI +// #define RGBW_BB_TWI -#define RGBW 1 +// #define RGBW 1 /* "debounce" is measured in keyboard scans. Some users reported * needing values as high as 15, which was at the time around 50ms. @@ -102,6 +101,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define USB_MAX_POWER_CONSUMPTION 500 +// RGB backlight +#define DRIVER_ADDR_1 0b1110100 +#define DRIVER_ADDR_2 0b1110111 +#define DRIVER_COUNT 2 +#define DRIVER_1_LED_TOTAL 24 +#define DRIVER_2_LED_TOTAL 24 +#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL +#define RGB_MATRIX_SKIP_FRAMES 10 + // #define RGBLIGHT_COLOR_LAYER_0 0x00, 0x00, 0xFF /* #define RGBLIGHT_COLOR_LAYER_1 0x00, 0x00, 0xFF */ /* #define RGBLIGHT_COLOR_LAYER_2 0xFF, 0x00, 0x00 */ diff --git a/keyboards/ergodox_ez/ergodox_ez.c b/keyboards/ergodox_ez/ergodox_ez.c index 437411856..61f910711 100644 --- a/keyboards/ergodox_ez/ergodox_ez.c +++ b/keyboards/ergodox_ez/ergodox_ez.c @@ -1,6 +1,4 @@ #include QMK_KEYBOARD_H -#include "i2cmaster.h" - extern inline void ergodox_board_led_on(void); extern inline void ergodox_right_led_1_on(void); @@ -24,9 +22,8 @@ extern inline void ergodox_right_led_set(uint8_t led, uint8_t n); extern inline void ergodox_led_all_set(uint8_t n); - bool i2c_initialized = 0; -uint8_t mcp23018_status = 0x20; +i2c_status_t mcp23018_status = 0x20; void matrix_init_kb(void) { // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md") @@ -114,33 +111,36 @@ uint8_t init_mcp23018(void) { // uint8_t sreg_prev; // sreg_prev=SREG; // cli(); + if (i2c_initialized == 0) { i2c_init(); // on pins D(1,0) i2c_initialized = true; _delay_ms(1000); } + // i2c_init(); // on pins D(1,0) + // _delay_ms(1000); // set pin direction // - unused : input : 1 // - input : input : 1 // - driving : output : 0 - mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out; - i2c_stop(); + mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(IODIRA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b00000000, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b00111111, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + i2c_stop(ERGODOX_EZ_I2C_TIMEOUT); // set pull-up // - unused : on : 1 // - input : on : 1 // - driving : off : 0 - mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out; + mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(GPPUA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b00000000, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b00111111, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; out: - i2c_stop(); + i2c_stop(ERGODOX_EZ_I2C_TIMEOUT); #ifdef LEFT_LEDS if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update(); @@ -164,22 +164,22 @@ uint8_t ergodox_left_leds_update(void) { // - unused : hi-Z : 1 // - input : hi-Z : 1 // - driving : hi-Z : 1 - mcp23018_status = i2c_start(I2C_ADDR_WRITE); + mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(OLATA); + mcp23018_status = i2c_write(OLATA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; mcp23018_status = i2c_write(0b11111111 - & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT) - ); + & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT), + ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; mcp23018_status = i2c_write(0b11111111 & ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT) - & ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT) - ); + & ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT), + ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; out: - i2c_stop(); + i2c_stop(ERGODOX_EZ_I2C_TIMEOUT); return mcp23018_status; } #endif @@ -207,3 +207,130 @@ const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}}, }; #endif + +#ifdef RGB_MATRIX_ENABLE +const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { +/* driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, C3_1, C2_1, C4_1}, // LED1 on right + {0, C6_1, C5_1, C7_1}, // LED2 + {0, C4_2, C3_2, C5_2}, // LED3 + {0, C7_2, C6_2, C8_2}, // LED4 + {0, C2_3, C1_3, C3_3}, // LED5 + {0, C5_3, C4_3, C6_3}, // LED6 + {0, C8_3, C7_3, C9_3}, // LED7 + {0, C2_4, C1_4, C3_4}, // LED8 + {0, C6_4, C5_4, C7_4}, // LED9 + {0, C2_5, C1_5, C3_5}, // LED10 + {0, C7_5, C6_5, C8_5}, // LED11 + {0, C2_6, C1_6, C3_6}, // LED12 + {0, C5_6, C4_6, C6_6}, // LED13 + {0, C8_6, C7_6, C9_6}, // LED14 + {0, C2_7, C1_7, C3_7}, // LED15 + {0, C5_7, C4_7, C6_7}, // LED16 + {0, C2_8, C1_8, C3_8}, // LED17 + {0, C5_8, C4_8, C6_8}, // LED18 + + {0, C3_9, C2_9, C4_9}, // LED19 + {0, C6_9, C5_9, C7_9}, // LED20 + {0, C4_10, C3_10, C5_10}, // LED21 + {0, C7_10, C6_10, C8_10}, // LED22 + {0, C2_11, C1_11, C3_11}, // LED23 + {0, C5_11, C4_11, C6_11}, // LED24 + + {1, C3_1, C2_1, C4_1}, // LED1 on left + {1, C6_1, C5_1, C7_1}, // LED2 + {1, C4_2, C3_2, C5_2}, // LED3 + {1, C7_2, C6_2, C8_2}, // LED4 + {1, C2_3, C1_3, C3_3}, // LED5 + {1, C5_3, C4_3, C6_3}, // LED6 + {1, C8_3, C7_3, C9_3}, // LED7 + {1, C2_4, C1_4, C3_4}, // LED8 + {1, C6_4, C5_4, C7_4}, // LED9 + {1, C2_5, C1_5, C3_5}, // LED10 + {1, C7_5, C6_5, C8_5}, // LED11 + {1, C2_6, C1_6, C3_6}, // LED12 + {1, C5_6, C4_6, C6_6}, // LED13 + {1, C8_6, C7_6, C9_6}, // LED14 + {1, C2_7, C1_7, C3_7}, // LED15 + {1, C5_7, C4_7, C6_7}, // LED16 + {1, C2_8, C1_8, C3_8}, // LED17 + {1, C5_8, C4_8, C6_8}, // LED18 + + {1, C3_9, C2_9, C4_9}, // LED19 + {1, C6_9, C5_9, C7_9}, // LED20 + {1, C4_10, C3_10, C5_10}, // LED21 + {1, C7_10, C6_10, C8_10}, // LED22 + {1, C2_11, C1_11, C3_11}, // LED23 + {1, C5_11, C4_11, C6_11} // LED24 +}; + + +const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { + + /*{row | col << 4} + | {x=0..224, y=0..64} + | | modifier + | | | */ + {{0|(0<<4)}, {24.9*5, 16*0}, 0}, // LED 1 on right + {{0|(1<<4)}, {24.9*6, 16*0}, 0}, // LED 2 + {{0|(2<<4)}, {24.9*7, 16*0}, 0}, // LED 3 + {{0|(3<<4)}, {24.9*8, 16*0}, 0}, // LED 4 + {{0|(4<<4)}, {24.9*9, 16*0}, 0}, // LED 5 + + {{1|(5<<4)}, {24.9*5, 16*1}, 0}, // LED 6 + {{1|(6<<4)}, {24.9*6, 16*1}, 0}, // LED 7 + {{1|(7<<4)}, {24.9*7, 16*1}, 0}, // LED 8 + {{1|(8<<4)}, {24.9*8, 16*1}, 0}, // LED 9 + {{1|(9<<4)}, {24.9*9, 16*1}, 0}, // LED 10 + + {{2|(5<<4)}, {24.9*5, 16*2}, 0}, // LED 11 + {{2|(6<<4)}, {24.9*6, 16*2}, 0}, // LED 12 + {{2|(7<<4)}, {24.9*7, 16*2}, 0}, // LED 13 + {{2|(8<<4)}, {24.9*8, 16*2}, 0}, // LED 14 + {{2|(9<<4)}, {24.9*9, 16*2}, 0}, // LED 15 + + {{3|(5<<4)}, {24.9*5, 16*2}, 0}, // LED 16 + {{3|(6<<4)}, {24.9*6, 16*2}, 0}, // LED 17 + {{3|(7<<4)}, {24.9*7, 16*2}, 0}, // LED 18 + {{3|(8<<4)}, {24.9*8, 16*2}, 0}, // LED 19 + {{3|(9<<4)}, {24.9*9, 16*2}, 0}, // LED 20 + + {{4|(6<<4)}, {24.9*6, 16*2}, 0}, // LED 21 + {{4|(7<<4)}, {24.9*7, 16*2}, 0}, // LED 22 + {{4|(8<<4)}, {24.9*8, 16*2}, 0}, // LED 23 + {{4|(9<<4)}, {24.9*9, 16*2}, 0}, // LED 24 + + {{0|(0<<4)}, {24.9*4, 16*0}, 0}, // LED 1 on left + {{0|(1<<4)}, {24.9*3, 16*0}, 0}, // LED 2 + {{0|(2<<4)}, {24.9*2, 16*0}, 0}, // LED 3 + {{0|(3<<4)}, {24.9*1, 16*0}, 0}, // LED 4 + {{0|(4<<4)}, {24.9*0, 16*0}, 0}, // LED 5 + + {{1|(5<<4)}, {24.9*4, 16*1}, 0}, // LED 6 + {{1|(6<<4)}, {24.9*3, 16*1}, 0}, // LED 7 + {{1|(7<<4)}, {24.9*2, 16*1}, 0}, // LED 8 + {{1|(8<<4)}, {24.9*1, 16*1}, 0}, // LED 9 + {{1|(9<<4)}, {24.9*0, 16*1}, 0}, // LED 10 + + {{2|(5<<4)}, {24.9*4, 16*2}, 0}, // LED 11 + {{2|(6<<4)}, {24.9*3, 16*2}, 0}, // LED 12 + {{2|(7<<4)}, {24.9*2, 16*2}, 0}, // LED 13 + {{2|(8<<4)}, {24.9*1, 16*2}, 0}, // LED 14 + {{2|(9<<4)}, {24.9*0, 16*2}, 0}, // LED 15 + + {{3|(5<<4)}, {24.9*4, 16*2}, 0}, // LED 16 + {{3|(6<<4)}, {24.9*3, 16*2}, 0}, // LED 17 + {{3|(7<<4)}, {24.9*2, 16*2}, 0}, // LED 18 + {{3|(8<<4)}, {24.9*1, 16*2}, 0}, // LED 19 + {{3|(9<<4)}, {24.9*0, 16*2}, 0}, // LED 20 + + {{4|(6<<4)}, {24.9*3, 16*2}, 0}, // LED 21 + {{4|(7<<4)}, {24.9*2, 16*2}, 0}, // LED 22 + {{4|(8<<4)}, {24.9*1, 16*2}, 0}, // LED 23 + {{4|(9<<4)}, {24.9*0, 16*2}, 0}, // LED 24 +}; +#endif diff --git a/keyboards/ergodox_ez/ergodox_ez.h b/keyboards/ergodox_ez/ergodox_ez.h index 985dcfae5..383702b95 100644 --- a/keyboards/ergodox_ez/ergodox_ez.h +++ b/keyboards/ergodox_ez/ergodox_ez.h @@ -4,7 +4,7 @@ #include "quantum.h" #include <stdint.h> #include <stdbool.h> -#include "i2cmaster.h" +#include "i2c_master.h" #include <util/delay.h> #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) @@ -23,7 +23,8 @@ #define OLATA 0x14 // output latch register #define OLATB 0x15 -extern uint8_t mcp23018_status; +extern i2c_status_t mcp23018_status; +#define ERGODOX_EZ_I2C_TIMEOUT 100 void init_ergodox(void); void ergodox_blink_all_leds(void); diff --git a/keyboards/ergodox_ez/matrix.c b/keyboards/ergodox_ez/matrix.c index e10171133..2e95c83b6 100644 --- a/keyboards/ergodox_ez/matrix.c +++ b/keyboards/ergodox_ez/matrix.c @@ -34,7 +34,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "util.h" #include "matrix.h" #include QMK_KEYBOARD_H -#include "i2cmaster.h" #ifdef DEBUG_MATRIX_SCAN_RATE #include "timer.h" #endif @@ -70,6 +69,7 @@ static void unselect_rows(void); static void select_row(uint8_t row); static uint8_t mcp23018_reset_loop; +// static uint16_t mcp23018_reset_loop; #ifdef DEBUG_MATRIX_SCAN_RATE uint32_t matrix_timer; @@ -177,6 +177,7 @@ uint8_t matrix_scan(void) { if (mcp23018_status) { // if there was an error if (++mcp23018_reset_loop == 0) { + // if (++mcp23018_reset_loop >= 1300) { // since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans // this will be approx bit more frequent than once per second print("trying to reset mcp23018\n"); @@ -294,13 +295,14 @@ static matrix_row_t read_cols(uint8_t row) return 0; } else { uint8_t data = 0; - mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(GPIOB); if (mcp23018_status) goto out; - mcp23018_status = i2c_start(I2C_ADDR_READ); if (mcp23018_status) goto out; - data = i2c_readNak(); - data = ~data; + mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(GPIOB, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_start(I2C_ADDR_READ, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_read_nack(ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status < 0) goto out; + data = ~((uint8_t)mcp23018_status); + mcp23018_status = I2C_STATUS_SUCCESS; out: - i2c_stop(); + i2c_stop(ERGODOX_EZ_I2C_TIMEOUT); return data; } } else { @@ -349,11 +351,11 @@ static void select_row(uint8_t row) } else { // set active row low : 0 // set other rows hi-Z : 1 - mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(0xFF & ~(1<<row)); if (mcp23018_status) goto out; + mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(GPIOA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0xFF & ~(1<<row), ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out; out: - i2c_stop(); + i2c_stop(ERGODOX_EZ_I2C_TIMEOUT); } } else { // select on teensy diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index 5ee9d5cb8..0e0b3cdef 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -15,8 +15,8 @@ #---------------------------------------------------------------------------- # # project specific files -SRC = twimaster.c \ - matrix.c +SRC = matrix.c \ + i2c_master.c # MCU name MCU = atmega32u4 @@ -82,6 +82,7 @@ UNICODE_ENABLE = yes # Unicode SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard SLEEP_LED_ENABLE = no API_SYSEX_ENABLE = no -RGBLIGHT_ENABLE = yes +RGBLIGHT_ENABLE = no +RGB_MATRIX_ENABLE = yes LAYOUTS = ergodox |