~ruther/qmk_firmware

82aa9ad4a567695d1f7d0b1e36bf8563d2967813 — Michael Stapelberg 4 years ago 068af97
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.
2 files changed, 4 insertions(+), 12 deletions(-)

M quantum/matrix.c
M quantum/split_common/matrix.c
M quantum/matrix.c => quantum/matrix.c +2 -6
@@ 116,9 116,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)

    // Unselect row
    unselect_row(current_row);
    if (current_row + 1 < MATRIX_ROWS) {
        matrix_output_unselect_delay();  // wait for row signal to go HIGH
    }
    matrix_output_unselect_delay();  // wait for all Col signals to go HIGH

    // If the row has changed, store the row and return the changed flag.
    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)

    // Unselect col
    unselect_col(current_col);
    if (current_col + 1 < MATRIX_COLS) {
        matrix_output_unselect_delay();  // wait for col signal to go HIGH
    }
    matrix_output_unselect_delay();  // wait for all Row signals to go HIGH

    return matrix_changed;
}

M quantum/split_common/matrix.c => quantum/split_common/matrix.c +2 -6
@@ 130,9 130,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)

    // Unselect row
    unselect_row(current_row);
    if (current_row + 1 < MATRIX_ROWS) {
        matrix_output_unselect_delay();  // wait for row signal to go HIGH
    }
    matrix_output_unselect_delay();  // wait for all Col signals to go HIGH

    // If the row has changed, store the row and return the changed flag.
    if (current_matrix[current_row] != current_row_value) {


@@ 192,9 190,7 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)

    // Unselect col
    unselect_col(current_col);
    if (current_col + 1 < MATRIX_COLS) {
        matrix_output_unselect_delay();  // wait for col signal to go HIGH
    }
    matrix_output_unselect_delay();  // wait for all Row signals to go HIGH

    return matrix_changed;
}