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) |