diff options
| author | IBNobody <ibnobody@gmail.com> | 2016-10-29 10:39:03 -0500 |
|---|---|---|
| committer | IBNobody <ibnobody@gmail.com> | 2016-10-29 10:39:03 -0500 |
| commit | 32f88c07173b795c6981c779057dceba00aeb1cb (patch) | |
| tree | bf372a8afead88128f68d373435025a16fbf53c2 /quantum/matrix.c | |
| parent | 4c6960835c0a6e29670dabdc27117d7d3c7f99f5 (diff) | |
| download | qmk_firmware-32f88c07173b795c6981c779057dceba00aeb1cb.tar.gz qmk_firmware-32f88c07173b795c6981c779057dceba00aeb1cb.zip | |
Made scanning more efficient
Diffstat (limited to 'quantum/matrix.c')
| -rw-r--r-- | quantum/matrix.c | 55 |
1 files changed, 24 insertions, 31 deletions
diff --git a/quantum/matrix.c b/quantum/matrix.c index 1bacea1be..f45b251e4 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c | |||
| @@ -61,24 +61,18 @@ static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | |||
| 61 | static matrix_row_t matrix[MATRIX_ROWS]; | 61 | static matrix_row_t matrix[MATRIX_ROWS]; |
| 62 | 62 | ||
| 63 | static matrix_row_t matrix_raw[MATRIX_ROWS]; | 63 | static matrix_row_t matrix_raw[MATRIX_ROWS]; |
| 64 | static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | ||
| 64 | 65 | ||
| 65 | 66 | ||
| 66 | #if DIODE_DIRECTION == COL2ROW | ||
| 67 | static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | ||
| 68 | #else // ROW2COL | ||
| 69 | static matrix_col_t matrix_transposed[MATRIX_COLS]; | ||
| 70 | static matrix_col_t matrix_transposed_debouncing[MATRIX_COLS]; | ||
| 71 | #endif | ||
| 72 | |||
| 73 | #if (DIODE_DIRECTION == COL2ROW) | 67 | #if (DIODE_DIRECTION == COL2ROW) |
| 74 | static void init_cols(void); | 68 | static void init_cols(void); |
| 75 | static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) | 69 | static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); |
| 76 | static void unselect_rows(void); | 70 | static void unselect_rows(void); |
| 77 | static void select_row(uint8_t row); | 71 | static void select_row(uint8_t row); |
| 78 | static void unselect_row(uint8_t row); | 72 | static void unselect_row(uint8_t row); |
| 79 | #else // ROW2COL | 73 | #else // ROW2COL |
| 80 | static void init_rows(void); | 74 | static void init_rows(void); |
| 81 | static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | 75 | static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); |
| 82 | static void unselect_cols(void); | 76 | static void unselect_cols(void); |
| 83 | static void unselect_col(uint8_t col); | 77 | static void unselect_col(uint8_t col); |
| 84 | static void select_col(uint8_t col); | 78 | static void select_col(uint8_t col); |
| @@ -158,30 +152,18 @@ void matrix_init(void) { | |||
| 158 | #if (DIODE_DIRECTION == COL2ROW) | 152 | #if (DIODE_DIRECTION == COL2ROW) |
| 159 | unselect_rows(); | 153 | unselect_rows(); |
| 160 | init_cols(); | 154 | init_cols(); |
| 161 | |||
| 162 | // initialize matrix state: all keys off | ||
| 163 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { | ||
| 164 | matrix[i] = 0; | ||
| 165 | matrix_raw[i] = 0; | ||
| 166 | matrix_debouncing[i] = 0; | ||
| 167 | } | ||
| 168 | |||
| 169 | #else // ROW2COL | 155 | #else // ROW2COL |
| 170 | unselect_cols(); | 156 | unselect_cols(); |
| 171 | init_rows(); | 157 | init_rows(); |
| 158 | #endif | ||
| 172 | 159 | ||
| 173 | // initialize matrix state: all keys off | 160 | // initialize matrix state: all keys off |
| 174 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { | 161 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { |
| 175 | matrix_raw[i] = 0; | ||
| 176 | matrix[i] = 0; | 162 | matrix[i] = 0; |
| 163 | matrix_raw[i] = 0; | ||
| 164 | matrix_debouncing[i] = 0; | ||
| 177 | } | 165 | } |
| 178 | 166 | ||
| 179 | // initialize matrix state: all keys off | ||
| 180 | for (uint8_t i=0; i < MATRIX_COLS; i++) { | ||
| 181 | matrix_transposed_debouncing[i] = 0; | ||
| 182 | } | ||
| 183 | #endif | ||
| 184 | |||
| 185 | matrix_init_quantum(); | 167 | matrix_init_quantum(); |
| 186 | } | 168 | } |
| 187 | 169 | ||
| @@ -262,7 +244,7 @@ uint8_t matrix_scan(void) | |||
| 262 | #endif | 244 | #endif |
| 263 | 245 | ||
| 264 | matrix_scan_quantum(); | 246 | matrix_scan_quantum(); |
| 265 | 247 | // matrix_print(); | |
| 266 | return 1; | 248 | return 1; |
| 267 | } | 249 | } |
| 268 | 250 | ||
| @@ -342,6 +324,9 @@ static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) | |||
| 342 | // Populate the matrix row with the state of the col pin | 324 | // Populate the matrix row with the state of the col pin |
| 343 | current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); | 325 | current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); |
| 344 | } | 326 | } |
| 327 | |||
| 328 | // Unselect row | ||
| 329 | unselect_row(current_row); | ||
| 345 | } | 330 | } |
| 346 | 331 | ||
| 347 | static void select_row(uint8_t row) | 332 | static void select_row(uint8_t row) |
| @@ -388,13 +373,21 @@ static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | |||
| 388 | // For each row... | 373 | // For each row... |
| 389 | for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) { | 374 | for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) { |
| 390 | 375 | ||
| 391 | // Select the row pin to read (active low) | 376 | // Check row pin state |
| 392 | uint8_t pin = row_pins[row_index]; | 377 | if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) |
| 393 | uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); | 378 | { |
| 394 | 379 | // Pin LO, set col bit | |
| 395 | // Populate the matrix row with the state of the col pin | 380 | current_matrix[row_index] |= (ROW_SHIFTER << current_col); |
| 396 | current_matrix[row_index] &= pin_state ? ~(ROW_SHIFTER << current_col) : 0; | 381 | } |
| 382 | else | ||
| 383 | { | ||
| 384 | // Pin HI, clear col bit | ||
| 385 | current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); | ||
| 386 | } | ||
| 397 | } | 387 | } |
| 388 | |||
| 389 | // Unselect col | ||
| 390 | unselect_col(current_col); | ||
| 398 | } | 391 | } |
| 399 | 392 | ||
| 400 | static void select_col(uint8_t col) | 393 | static void select_col(uint8_t col) |
