diff options
Diffstat (limited to 'quantum/matrix.c')
-rw-r--r-- | quantum/matrix.c | 196 |
1 files changed, 93 insertions, 103 deletions
diff --git a/quantum/matrix.c b/quantum/matrix.c index 2dab6ae941..3174e07390 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c @@ -1,6 +1,6 @@ /* -Copyright 2012 Jun Wako -Generated by planckkeyboard.com (2014 Jack Humbert) +Copyright 2012 Jun Wako +Copyright 2014 Jack Humbert 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 @@ -15,23 +15,26 @@ 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 <http://www.gnu.org/licenses/>. */ - -/* - * scan matrix - */ #include <stdint.h> #include <stdbool.h> +#if defined(__AVR__) #include <avr/io.h> -#include <util/delay.h> +#endif +#include "wait.h" #include "print.h" #include "debug.h" #include "util.h" #include "matrix.h" -#ifndef DEBOUNCE -# define DEBOUNCE 10 +/* Set 0 if debouncing isn't needed */ + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 #endif -static uint8_t debouncing = DEBOUNCE; +static uint8_t debouncing = DEBOUNCING_DELAY; + +static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; /* matrix state(1:on, 0:off) */ static matrix_row_t matrix[MATRIX_ROWS]; @@ -42,39 +45,85 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS]; static matrix_row_t matrix_reversed_debouncing[MATRIX_COLS]; #endif +#if MATRIX_COLS > 16 + #define SHIFTER 1UL +#else + #define SHIFTER 1 +#endif + static matrix_row_t read_cols(void); static void init_cols(void); static void unselect_rows(void); static void select_row(uint8_t row); __attribute__ ((weak)) -void matrix_init_kb(void) { +void matrix_init_quantum(void) { + matrix_init_kb(); +} + +__attribute__ ((weak)) +void matrix_scan_quantum(void) { + matrix_scan_kb(); +} +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); } __attribute__ ((weak)) void matrix_scan_kb(void) { + matrix_scan_user(); +} +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { } inline -uint8_t matrix_rows(void) -{ +uint8_t matrix_rows(void) { return MATRIX_ROWS; } inline -uint8_t matrix_cols(void) -{ +uint8_t matrix_cols(void) { return MATRIX_COLS; } -void matrix_init(void) -{ +// void matrix_power_up(void) { +// #if DIODE_DIRECTION == COL2ROW +// for (int8_t r = MATRIX_ROWS - 1; r >= 0; --r) { +// /* DDRxn */ +// _SFR_IO8((row_pins[r] >> 4) + 1) |= _BV(row_pins[r] & 0xF); +// toggle_row(r); +// } +// for (int8_t c = MATRIX_COLS - 1; c >= 0; --c) { +// /* PORTxn */ +// _SFR_IO8((col_pins[c] >> 4) + 2) |= _BV(col_pins[c] & 0xF); +// } +// #else +// for (int8_t c = MATRIX_COLS - 1; c >= 0; --c) { +// /* DDRxn */ +// _SFR_IO8((col_pins[c] >> 4) + 1) |= _BV(col_pins[c] & 0xF); +// toggle_col(c); +// } +// for (int8_t r = MATRIX_ROWS - 1; r >= 0; --r) { +// /* PORTxn */ +// _SFR_IO8((row_pins[r] >> 4) + 2) |= _BV(row_pins[r] & 0xF); +// } +// #endif +// } + +void matrix_init(void) { // To use PORTF disable JTAG with writing JTD bit twice within four cycles. - MCUCR |= (1<<JTD); - MCUCR |= (1<<JTD); - + #ifdef __AVR_ATmega32U4__ + MCUCR |= _BV(JTD); + MCUCR |= _BV(JTD); + #endif // initialize row and col unselect_rows(); @@ -86,31 +135,30 @@ void matrix_init(void) matrix_debouncing[i] = 0; } - matrix_init_kb(); + matrix_init_quantum(); } - uint8_t matrix_scan(void) { #if DIODE_DIRECTION == COL2ROW for (uint8_t i = 0; i < MATRIX_ROWS; i++) { select_row(i); - _delay_us(30); // without this wait read unstable value. + wait_us(30); // without this wait read unstable value. matrix_row_t cols = read_cols(); if (matrix_debouncing[i] != cols) { matrix_debouncing[i] = cols; if (debouncing) { debug("bounce!: "); debug_hex(debouncing); debug("\n"); } - debouncing = DEBOUNCE; + debouncing = DEBOUNCING_DELAY; } unselect_rows(); } if (debouncing) { if (--debouncing) { - _delay_ms(1); + wait_ms(1); } else { for (uint8_t i = 0; i < MATRIX_ROWS; i++) { matrix[i] = matrix_debouncing[i]; @@ -120,21 +168,21 @@ uint8_t matrix_scan(void) #else for (uint8_t i = 0; i < MATRIX_COLS; i++) { select_row(i); - _delay_us(30); // without this wait read unstable value. + wait_us(30); // without this wait read unstable value. matrix_row_t rows = read_cols(); if (matrix_reversed_debouncing[i] != rows) { matrix_reversed_debouncing[i] = rows; if (debouncing) { debug("bounce!: "); debug_hex(debouncing); debug("\n"); } - debouncing = DEBOUNCE; + debouncing = DEBOUNCING_DELAY; } unselect_rows(); } if (debouncing) { if (--debouncing) { - _delay_ms(1); + wait_ms(1); } else { for (uint8_t i = 0; i < MATRIX_COLS; i++) { matrix_reversed[i] = matrix_reversed_debouncing[i]; @@ -150,7 +198,7 @@ uint8_t matrix_scan(void) } #endif - matrix_scan_kb(); + matrix_scan_quantum(); return 1; } @@ -194,32 +242,16 @@ uint8_t matrix_key_count(void) static void init_cols(void) { - int B = 0, C = 0, D = 0, E = 0, F = 0; - #if DIODE_DIRECTION == COL2ROW for(int x = 0; x < MATRIX_COLS; x++) { - int col = COLS[x]; + int pin = col_pins[x]; #else for(int x = 0; x < MATRIX_ROWS; x++) { - int col = ROWS[x]; + int pin = row_pins[x]; #endif - if ((col & 0xF0) == 0x20) { - B |= (1<<(col & 0x0F)); - } else if ((col & 0xF0) == 0x30) { - C |= (1<<(col & 0x0F)); - } else if ((col & 0xF0) == 0x40) { - D |= (1<<(col & 0x0F)); - } else if ((col & 0xF0) == 0x50) { - E |= (1<<(col & 0x0F)); - } else if ((col & 0xF0) == 0x60) { - F |= (1<<(col & 0x0F)); - } + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); } - DDRB &= ~(B); PORTB |= (B); - DDRC &= ~(C); PORTC |= (C); - DDRD &= ~(D); PORTD |= (D); - DDRE &= ~(E); PORTE |= (E); - DDRF &= ~(F); PORTF |= (F); } static matrix_row_t read_cols(void) @@ -228,80 +260,38 @@ static matrix_row_t read_cols(void) #if DIODE_DIRECTION == COL2ROW for(int x = 0; x < MATRIX_COLS; x++) { - int col = COLS[x]; + int pin = col_pins[x]; #else for(int x = 0; x < MATRIX_ROWS; x++) { - int col = ROWS[x]; + int pin = row_pins[x]; #endif - - if ((col & 0xF0) == 0x20) { - result |= (PINB&(1<<(col & 0x0F)) ? 0 : (1<<x)); - } else if ((col & 0xF0) == 0x30) { - result |= (PINC&(1<<(col & 0x0F)) ? 0 : (1<<x)); - } else if ((col & 0xF0) == 0x40) { - result |= (PIND&(1<<(col & 0x0F)) ? 0 : (1<<x)); - } else if ((col & 0xF0) == 0x50) { - result |= (PINE&(1<<(col & 0x0F)) ? 0 : (1<<x)); - } else if ((col & 0xF0) == 0x60) { - result |= (PINF&(1<<(col & 0x0F)) ? 0 : (1<<x)); - } + result |= (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) ? 0 : (SHIFTER << x); } return result; } static void unselect_rows(void) { - int B = 0, C = 0, D = 0, E = 0, F = 0; - #if DIODE_DIRECTION == COL2ROW for(int x = 0; x < MATRIX_ROWS; x++) { - int row = ROWS[x]; + int pin = row_pins[x]; #else for(int x = 0; x < MATRIX_COLS; x++) { - int row = COLS[x]; + int pin = col_pins[x]; #endif - if ((row & 0xF0) == 0x20) { - B |= (1<<(row & 0x0F)); - } else if ((row & 0xF0) == 0x30) { - C |= (1<<(row & 0x0F)); - } else if ((row & 0xF0) == 0x40) { - D |= (1<<(row & 0x0F)); - } else if ((row & 0xF0) == 0x50) { - E |= (1<<(row & 0x0F)); - } else if ((row & 0xF0) == 0x60) { - F |= (1<<(row & 0x0F)); - } + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); } - DDRB &= ~(B); PORTB |= (B); - DDRC &= ~(C); PORTC |= (C); - DDRD &= ~(D); PORTD |= (D); - DDRE &= ~(E); PORTE |= (E); - DDRF &= ~(F); PORTF |= (F); } static void select_row(uint8_t row) { #if DIODE_DIRECTION == COL2ROW - int row_pin = ROWS[row]; + int pin = row_pins[row]; #else - int row_pin = COLS[row]; + int pin = col_pins[row]; #endif - - if ((row_pin & 0xF0) == 0x20) { - DDRB |= (1<<(row_pin & 0x0F)); - PORTB &= ~(1<<(row_pin & 0x0F)); - } else if ((row_pin & 0xF0) == 0x30) { - DDRC |= (1<<(row_pin & 0x0F)); - PORTC &= ~(1<<(row_pin & 0x0F)); - } else if ((row_pin & 0xF0) == 0x40) { - DDRD |= (1<<(row_pin & 0x0F)); - PORTD &= ~(1<<(row_pin & 0x0F)); - } else if ((row_pin & 0xF0) == 0x50) { - DDRE |= (1<<(row_pin & 0x0F)); - PORTE &= ~(1<<(row_pin & 0x0F)); - } else if ((row_pin & 0xF0) == 0x60) { - DDRF |= (1<<(row_pin & 0x0F)); - PORTF &= ~(1<<(row_pin & 0x0F)); - } -}
\ No newline at end of file + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); +} |