diff options
-rwxr-xr-x | drivers/avr/i2c_master.c | 42 | ||||
-rw-r--r-- | drivers/avr/is31fl3731.c | 7 | ||||
-rw-r--r-- | keyboards/ergodox_ez/config.h | 9 | ||||
-rw-r--r-- | keyboards/ergodox_ez/ergodox_ez.c | 142 | ||||
-rw-r--r-- | keyboards/ergodox_ez/ergodox_ez.h | 2 | ||||
-rw-r--r-- | keyboards/ergodox_ez/matrix.c | 9 | ||||
-rw-r--r-- | keyboards/ergodox_ez/rules.mk | 7 |
7 files changed, 182 insertions, 36 deletions
diff --git a/drivers/avr/i2c_master.c b/drivers/avr/i2c_master.c index f4a4bb7b0..bcf92153c 100755 --- a/drivers/avr/i2c_master.c +++ b/drivers/avr/i2c_master.c @@ -13,32 +13,34 @@ void i2c_init(void) { + TWSR = 0; /* no prescaler */ TWBR = (uint8_t)TWBR_val; + //TWBR = 10; } uint8_t i2c_start(uint8_t address) { // reset TWI control register - TWCR = 0; - // transmit START condition + //TWCR = 0; + // transmit START condition TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); - + // check if the start condition was successfully transmitted - if((TWSR & 0xF8) != TW_START){ return 1; } - + if(((TW_STATUS & 0xF8) != TW_START) && ((TW_STATUS & 0xF8) != TW_REP_START)){ return 1; } + // load slave address into data register TWDR = address; // start transmission of address TWCR = (1<<TWINT) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); - + // check if the device has acknowledged the READ / WRITE mode uint8_t twst = TW_STATUS & 0xF8; if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1; - + return 0; } @@ -50,17 +52,17 @@ uint8_t i2c_write(uint8_t data) TWCR = (1<<TWINT) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); - - if( (TWSR & 0xF8) != TW_MT_DATA_ACK ){ return 1; } - + + if( (TW_STATUS & 0xF8) != TW_MT_DATA_ACK ){ return 1; } + return 0; } uint8_t i2c_read_ack(void) { - + // start TWI module and acknowledge data after reception - TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); + TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); // return received data from TWDR @@ -69,7 +71,7 @@ uint8_t i2c_read_ack(void) uint8_t i2c_read_nack(void) { - + // start receiving without acknowledging reception TWCR = (1<<TWINT) | (1<<TWEN); // wait for end of transmission @@ -81,29 +83,29 @@ uint8_t i2c_read_nack(void) uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length) { if (i2c_start(address | I2C_WRITE)) return 1; - + for (uint16_t i = 0; i < length; i++) { if (i2c_write(data[i])) return 1; } - + i2c_stop(); - + return 0; } uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length) { if (i2c_start(address | I2C_READ)) return 1; - + for (uint16_t i = 0; i < (length-1); i++) { data[i] = i2c_read_ack(); } data[(length-1)] = i2c_read_nack(); - + i2c_stop(); - + return 0; } @@ -146,4 +148,6 @@ void i2c_stop(void) { // transmit STOP condition TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); + // wait until stop condition is executed and bus released + while(TWCR & (1<<TWSTO)); } diff --git a/drivers/avr/is31fl3731.c b/drivers/avr/is31fl3731.c index c7a99e3a3..13dfe6eaf 100644 --- a/drivers/avr/is31fl3731.c +++ b/drivers/avr/is31fl3731.c @@ -84,7 +84,8 @@ void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data ) g_twi_transfer_buffer[1] = data; //Transmit data until succesful - while(i2c_transmit(addr << 1, g_twi_transfer_buffer,2) != 0); + //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,2) != 0); + i2c_transmit(addr << 1, g_twi_transfer_buffer,2); } void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) @@ -108,7 +109,9 @@ void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) } //Transmit buffer until succesful - while(i2c_transmit(addr << 1, g_twi_transfer_buffer,17) != 0); + //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,17) != 0); + i2c_transmit(addr << 1, g_twi_transfer_buffer,17); + } } diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h index ae70c4f2e..3dfe8733c 100644 --- a/keyboards/ergodox_ez/config.h +++ b/keyboards/ergodox_ez/config.h @@ -102,6 +102,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..b393d73d7 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); @@ -114,11 +112,14 @@ 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); - } + + // 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 @@ -207,3 +208,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 eda6d767c..3ffc32553 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)) diff --git a/keyboards/ergodox_ez/matrix.c b/keyboards/ergodox_ez/matrix.c index e10171133..6660af46a 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 @@ -69,7 +68,8 @@ static void init_cols(void); static void unselect_rows(void); static void select_row(uint8_t row); -static uint8_t mcp23018_reset_loop; +// static uint8_t mcp23018_reset_loop; +static uint16_t mcp23018_reset_loop; #ifdef DEBUG_MATRIX_SCAN_RATE uint32_t matrix_timer; @@ -176,7 +176,8 @@ void debounce_report(matrix_row_t change, uint8_t row) { uint8_t matrix_scan(void) { if (mcp23018_status) { // if there was an error - if (++mcp23018_reset_loop == 0) { + // 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"); @@ -297,7 +298,7 @@ static matrix_row_t read_cols(uint8_t row) 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 = i2c_read_nack(); data = ~data; out: i2c_stop(); 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 |