diff options
author | Michael Stapelberg <stapelberg@users.noreply.github.com> | 2021-05-19 22:43:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-20 06:43:36 +1000 |
commit | 82aa9ad4a567695d1f7d0b1e36bf8563d2967813 (patch) | |
tree | 4f27b34928fb3ddbfaf0af8cde0ce701721bd624 /quantum/matrix.c | |
parent | 068af97b7aac1fc787b5e9fb76d9250d48638e58 (diff) | |
download | qmk_firmware-82aa9ad4a567695d1f7d0b1e36bf8563d2967813.tar.gz qmk_firmware-82aa9ad4a567695d1f7d0b1e36bf8563d2967813.zip |
matrix: wait for row signal to go HIGH for every row (#12945)
I noticed this discrepancy (last row of the matrix treated differently than the
others) when optimizing the input latency of my keyboard controller, see also
https://michael.stapelberg.ch/posts/2021-05-08-keyboard-input-latency-qmk-kinesis/
Before this commit, when tuning the delays I noticed ghost key presses when
pressing the F2 key, which is on the last row of the keyboard matrix: the
dead_grave key, which is on the first row of the keyboard matrix, would be
incorrectly detected as pressed.
After this commit, all keyboard matrix rows are interpreted correctly.
I suspect that my setup is more susceptible to this nuance than others because I
use GPIO_INPUT_PIN_DELAY=0 and hence don’t have another delay that might mask
the problem.
Diffstat (limited to 'quantum/matrix.c')
-rw-r--r-- | quantum/matrix.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/quantum/matrix.c b/quantum/matrix.c index c027b7bf2..34d6af2e6 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c | |||
@@ -116,9 +116,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) | |||
116 | 116 | ||
117 | // Unselect row | 117 | // Unselect row |
118 | unselect_row(current_row); | 118 | unselect_row(current_row); |
119 | if (current_row + 1 < MATRIX_ROWS) { | 119 | matrix_output_unselect_delay(); // wait for all Col signals to go HIGH |
120 | matrix_output_unselect_delay(); // wait for row signal to go HIGH | ||
121 | } | ||
122 | 120 | ||
123 | // If the row has changed, store the row and return the changed flag. | 121 | // If the row has changed, store the row and return the changed flag. |
124 | if (current_matrix[current_row] != current_row_value) { | 122 | if (current_matrix[current_row] != current_row_value) { |
@@ -178,9 +176,7 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | |||
178 | 176 | ||
179 | // Unselect col | 177 | // Unselect col |
180 | unselect_col(current_col); | 178 | unselect_col(current_col); |
181 | if (current_col + 1 < MATRIX_COLS) { | 179 | matrix_output_unselect_delay(); // wait for all Row signals to go HIGH |
182 | matrix_output_unselect_delay(); // wait for col signal to go HIGH | ||
183 | } | ||
184 | 180 | ||
185 | return matrix_changed; | 181 | return matrix_changed; |
186 | } | 182 | } |