~ruther/qmk_firmware

4c6960835c0a6e29670dabdc27117d7d3c7f99f5 — IBNobody 8 years ago 508eddf
Refactoring Matrix scanning
2 files changed, 95 insertions(+), 88 deletions(-)

M quantum/matrix.c
M tmk_core/common/matrix.h
M quantum/matrix.c => quantum/matrix.c +95 -78
@@ 43,16 43,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#    define ROW_SHIFTER  ((uint32_t)1)
#endif

#if (MATRIX_ROWS <= 8)
#    define COL_SHIFTER ((uint8_t)1)
#elif (MATRIX_ROWS <= 16)
#    define COL_SHIFTER ((uint16_t)1)
#elif (MATRIX_ROWS <= 32)
#    define COL_SHIFTER  ((uint32_t)1)
#endif



#ifdef MATRIX_MASKED
extern const matrix_row_t matrix_mask[];
#endif


@@ 70,6 60,9 @@ static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];

static matrix_row_t matrix_raw[MATRIX_ROWS];


#if DIODE_DIRECTION == COL2ROW
    static matrix_row_t matrix_debouncing[MATRIX_ROWS];
#else // ROW2COL


@@ 79,13 72,13 @@ static matrix_row_t matrix[MATRIX_ROWS];

#if (DIODE_DIRECTION == COL2ROW)
    static void init_cols(void);
    static matrix_row_t read_cols(void);
    static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
    static void unselect_rows(void);
    static void select_row(uint8_t row);
    static void unselect_row(uint8_t row);
#else // ROW2COL
    static void init_rows(void);
    static matrix_col_t read_rows(void);
    static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
    static void unselect_cols(void);
    static void unselect_col(uint8_t col);
    static void select_col(uint8_t col);


@@ 169,6 162,7 @@ void matrix_init(void) {
    // initialize matrix state: all keys off
    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
        matrix[i] = 0;
        matrix_raw[i] = 0;
        matrix_debouncing[i] = 0;
    }



@@ 178,6 172,7 @@ void matrix_init(void) {

    // initialize matrix state: all keys off
    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
        matrix_raw[i] = 0;
        matrix[i] = 0;
    }



@@ 196,67 191,73 @@ uint8_t matrix_scan(void)
#if (DIODE_DIRECTION == COL2ROW)

    // Set row, read cols

    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
        select_row(i);
        wait_us(30);  // without this wait read unstable value.
        matrix_row_t current_row = read_cols();
        if (matrix_debouncing[i] != current_row) {
            matrix_debouncing[i] = current_row;
            if (debouncing) {
                debug("bounce!: "); debug_hex(debouncing); debug("\n");
            }
            debouncing = DEBOUNCING_DELAY;
        }
        unselect_row(i);
    for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
        read_cols_on_row(matrix, current_row);
    }

    if (debouncing) {
        if (--debouncing) {
            wait_ms(1);
        } else {
            for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
                matrix[i] = matrix_debouncing[i];
            }
        }
    }
    //     select_row(i);
    //     wait_us(30);  // without this wait read unstable value.
    //     matrix_row_t current_row = read_cols();
    //     if (matrix_debouncing[i] != current_row) {
    //         matrix_debouncing[i] = current_row;
    //         if (debouncing) {
    //             debug("bounce!: "); debug_hex(debouncing); debug("\n");
    //         }
    //         debouncing = DEBOUNCING_DELAY;
    //     }
    //     unselect_row(i);
    // }

    // if (debouncing) {
    //     if (--debouncing) {
    //         wait_ms(1);
    //     } else {
    //         for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
    //             matrix[i] = matrix_debouncing[i];
    //         }
    //     }
    // }

#else // ROW2COL

    // Set col, read rows

    for (uint8_t i = 0; i < MATRIX_COLS; i++) {
        select_col(i);
        wait_us(30);  // without this wait read unstable value.
        matrix_col_t current_col = read_rows();
        if (matrix_transposed_debouncing[i] != current_col) {
            matrix_transposed_debouncing[i] = current_col;
            if (debouncing) {
                debug("bounce!: "); debug_hex(debouncing); debug("\n");
            }
            debouncing = DEBOUNCING_DELAY;
        }
        unselect_col(i);
    for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
        read_rows_on_col(matrix, current_col);
    }

    if (debouncing) {
        if (--debouncing) {
            wait_ms(1);
        } else {
            for (uint8_t i = 0; i < MATRIX_COLS; i++) {
                matrix_transposed[i] = matrix_transposed_debouncing[i];
            }
        }
    }

    // Untranspose matrix
    for (uint8_t y = 0; y < MATRIX_ROWS; y++) {
        matrix_row_t row = 0;
        for (uint8_t x = 0; x < MATRIX_COLS; x++) {
            row |= ((matrix_transposed[x] & (1<<y)) >> y) << x;
        }
        matrix[y] = row;
    }
    // for (uint8_t i = 0; i < MATRIX_COLS; i++) {
    //     select_col(i);
    //     wait_us(30);  // without this wait read unstable value.
    //     matrix_col_t current_col = read_rows();
    //     if (matrix_transposed_debouncing[i] != current_col) {
    //         matrix_transposed_debouncing[i] = current_col;
    //         if (debouncing) {
    //             debug("bounce!: "); debug_hex(debouncing); debug("\n");
    //         }
    //         debouncing = DEBOUNCING_DELAY;
    //     }
    //     unselect_col(i);
    // }

    // if (debouncing) {
    //     if (--debouncing) {
    //         wait_ms(1);
    //     } else {
    //         for (uint8_t i = 0; i < MATRIX_COLS; i++) {
    //             matrix_transposed[i] = matrix_transposed_debouncing[i];
    //         }
    //     }
    // }

    // // Untranspose matrix
    // for (uint8_t y = 0; y < MATRIX_ROWS; y++) {
    //     matrix_row_t row = 0;
    //     for (uint8_t x = 0; x < MATRIX_COLS; x++) {
    //         row |= ((matrix_transposed[x] & (1<<y)) >> y) << x;
    //     }
    //     matrix[y] = row;
    // }

#endif



@@ 322,16 323,25 @@ static void init_cols(void)
    }
}

static matrix_row_t read_cols(void)
static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
{
    matrix_row_t result = 0;
    // Clear data in matrix row
    current_matrix[current_row] = 0;

    for(uint8_t x = 0; x < MATRIX_COLS; x++) {
        uint8_t pin = col_pins[x];
        result |= (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) ? 0 : (ROW_SHIFTER << x);
    }
    // Select row and wait for row selecton to stabilize
    select_row(current_row);
    wait_us(30);

    return result;
    // For each col...
    for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {

        // Select the col pin to read (active low)
        uint8_t pin = col_pins[col_index];
        uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF));

        // Populate the matrix row with the state of the col pin
        current_matrix[current_row] |=  pin_state ? 0 : (ROW_SHIFTER << col_index);
    }
}

static void select_row(uint8_t row)


@@ 368,16 378,23 @@ static void init_rows(void)
    }
}

static matrix_col_t read_rows(void)
static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
{
    matrix_col_t result = 0;

    for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
        uint8_t pin = row_pins[x];
        result |= (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) ? 0 : (COL_SHIFTER << x);
    }
    // Select col and wait for col selecton to stabilize
    select_col(current_col);
    wait_us(30);

    return result;
    // For each row...
    for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) {

        // Select the row pin to read (active low)
        uint8_t pin = row_pins[row_index];
        uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF));

        // Populate the matrix row with the state of the col pin
        current_matrix[row_index] &= pin_state ? ~(ROW_SHIFTER << current_col) : 0;
    }
}

static void select_col(uint8_t col)

M tmk_core/common/matrix.h => tmk_core/common/matrix.h +0 -10
@@ 31,16 31,6 @@ typedef  uint32_t   matrix_row_t;
#error "MATRIX_COLS: invalid value"
#endif

#if (MATRIX_ROWS <= 8)
typedef  uint8_t    matrix_col_t;
#elif (MATRIX_ROWS <= 16)
typedef  uint16_t   matrix_col_t;
#elif (MATRIX_ROWS <= 32)
typedef  uint32_t   matrix_col_t;
#else
#error "MATRIX_COLS: invalid value"
#endif

#define MATRIX_IS_ON(row, col)  (matrix_get_row(row) && (1<<col))