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.
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							068af97b7a
						
					
				
				
					commit
					82aa9ad4a5
				
			@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user