aboutsummaryrefslogtreecommitdiff
path: root/quantum/matrix.c
diff options
context:
space:
mode:
authorIBNobody <ibnobody@gmail.com>2016-10-29 10:39:03 -0500
committerIBNobody <ibnobody@gmail.com>2016-10-29 10:39:03 -0500
commit32f88c07173b795c6981c779057dceba00aeb1cb (patch)
treebf372a8afead88128f68d373435025a16fbf53c2 /quantum/matrix.c
parent4c6960835c0a6e29670dabdc27117d7d3c7f99f5 (diff)
downloadqmk_firmware-32f88c07173b795c6981c779057dceba00aeb1cb.tar.gz
qmk_firmware-32f88c07173b795c6981c779057dceba00aeb1cb.zip
Made scanning more efficient
Diffstat (limited to 'quantum/matrix.c')
-rw-r--r--quantum/matrix.c55
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;
61static matrix_row_t matrix[MATRIX_ROWS]; 61static matrix_row_t matrix[MATRIX_ROWS];
62 62
63static matrix_row_t matrix_raw[MATRIX_ROWS]; 63static matrix_row_t matrix_raw[MATRIX_ROWS];
64static 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
347static void select_row(uint8_t row) 332static 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
400static void select_col(uint8_t col) 393static void select_col(uint8_t col)