From a08bdbf124f86412719166796f5e7dacf3c273cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 20 Oct 2016 19:29:36 +0200 Subject: [PATCH] Reverse the diodes and optimize key scanning as much as possible. --- shared/key_matrix.c | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/shared/key_matrix.c b/shared/key_matrix.c index daf2ab8..75c0b67 100644 --- a/shared/key_matrix.c +++ b/shared/key_matrix.c @@ -3,31 +3,37 @@ void KeyMatrix_Init(key_matrix_t *keyMatrix) { - for (uint8_t col_i=0; col_icolNum; col_i++) { - key_matrix_pin_t col = keyMatrix->cols[col_i]; - CLOCK_EnableClock(col.clock); - PORT_SetPinConfig(col.port, col.pin, + for (key_matrix_pin_t *row = keyMatrix->rows; row < keyMatrix->rows + keyMatrix->rowNum; row++) { + CLOCK_EnableClock(row->clock); + PORT_SetPinConfig(row->port, row->pin, &(port_pin_config_t){.pullSelect=kPORT_PullDisable, .mux=kPORT_MuxAsGpio}); - GPIO_PinInit(col.gpio, col.pin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0}); + GPIO_PinInit(row->gpio, row->pin, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0}); } - for (uint8_t row_i=0; row_irowNum; row_i++) { - key_matrix_pin_t row = keyMatrix->rows[row_i]; - CLOCK_EnableClock(row.clock); - PORT_SetPinConfig(row.port, row.pin, + for (key_matrix_pin_t *col = keyMatrix->cols; col < keyMatrix->cols + keyMatrix->colNum; col++) { + CLOCK_EnableClock(col->clock); + PORT_SetPinConfig(col->port, col->pin, &(port_pin_config_t){.pullSelect=kPORT_PullDown, .mux=kPORT_MuxAsGpio}); - GPIO_PinInit(row.gpio, row.pin, &(gpio_pin_config_t){kGPIO_DigitalInput}); + GPIO_PinInit(col->gpio, col->pin, &(gpio_pin_config_t){kGPIO_DigitalInput}); } } void KeyMatrix_Scan(key_matrix_t *keyMatrix) { - for (uint8_t col=0; colcolNum; col++) { - GPIO_WritePinOutput(keyMatrix->cols[col].gpio, keyMatrix->cols[col].pin, 1); - for (uint8_t row=0; rowrowNum; row++) { - keyMatrix->keyStates[row*keyMatrix->colNum + col] = GPIO_ReadPinInput(keyMatrix->rows[row].gpio, keyMatrix->rows[row].pin); + uint8_t *keyState = keyMatrix->keyStates; + + key_matrix_pin_t *rowEnd = keyMatrix->rows + keyMatrix->rowNum; + for (key_matrix_pin_t *row = keyMatrix->rows; rowgpio; + uint32_t rowPin = row->pin; + GPIO_WritePinOutput(rowGpio, rowPin, 1); + + key_matrix_pin_t *colEnd = keyMatrix->cols + keyMatrix->colNum; + for (key_matrix_pin_t *col = keyMatrix->cols; colgpio, col->pin); } - GPIO_WritePinOutput(keyMatrix->cols[col].gpio, keyMatrix->cols[col].pin, 0); + + GPIO_WritePinOutput(rowGpio, rowPin, 0); for (volatile uint32_t i=0; i<100; i++); // Wait for the new port state to settle. This avoid bogus key state detection. } }