summaryrefslogtreecommitdiffstats
path: root/keyboards/ktec/ergodone/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/ktec/ergodone/matrix.c')
-rw-r--r--keyboards/ktec/ergodone/matrix.c235
1 files changed, 0 insertions, 235 deletions
diff --git a/keyboards/ktec/ergodone/matrix.c b/keyboards/ktec/ergodone/matrix.c
deleted file mode 100644
index cb845db1bc..0000000000
--- a/keyboards/ktec/ergodone/matrix.c
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2022 QMK
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "gpio.h"
-#include "matrix.h"
-#include "mcp23018.h"
-#include "util.h"
-#include "wait.h"
-#include "debug.h"
-
-#define I2C_ADDR 0x20
-
-static uint8_t mcp23018_errors = 0;
-
-static void expander_init(void) {
- mcp23018_init(I2C_ADDR);
-}
-
-static void expander_init_cols(void) {
- mcp23018_errors += !mcp23018_set_config(I2C_ADDR, mcp23018_PORTA, ALL_INPUT);
- mcp23018_errors += !mcp23018_set_config(I2C_ADDR, mcp23018_PORTB, ALL_INPUT);
-}
-
-static void expander_select_row(uint8_t row) {
- if (mcp23018_errors) {
- // wait to mimic i2c interactions
- wait_us(100);
- return;
- }
-
- mcp23018_errors += !mcp23018_set_config(I2C_ADDR, mcp23018_PORTB, ~(1 << (row + 1)));
-}
-
-static void expander_unselect_row(uint8_t row) {
- // No need to unselect row as the next `select_row` will blank everything anyway
-}
-
-static void expander_unselect_rows(void) {
- if (mcp23018_errors) {
- return;
- }
-
- mcp23018_errors += !mcp23018_set_config(I2C_ADDR, mcp23018_PORTB, ALL_INPUT);
-}
-
-static matrix_row_t expander_read_row(void) {
- if (mcp23018_errors) {
- return 0;
- }
-
- uint8_t ret = 0xFF;
- mcp23018_errors += !mcp23018_readPins(I2C_ADDR, mcp23018_PORTA, &ret);
-
- ret = bitrev(~ret);
- ret = ((ret & 0b11111000) >> 1) | (ret & 0b00000011);
-
- return ((uint16_t)ret) << 7;
-}
-
-static void expander_scan(void) {
- if (!mcp23018_errors) {
- return;
- }
-
- static uint16_t mcp23018_reset_loop = 0;
- if (++mcp23018_reset_loop > 0x1FFF) {
- // tuned to about 5s given the current scan rate
- dprintf("trying to reset mcp23018\n");
- mcp23018_reset_loop = 0;
- mcp23018_errors = 0;
- expander_unselect_rows();
- expander_init_cols();
- }
-}
-
-/* Column pin configuration
- *
- * Pro Micro: 6 5 4 3 2 1 0
- * PD3 PD2 PD4 PC6 PD7 PE6 PB4
- *
- * Expander: 13 12 11 10 9 8 7
- */
-static void init_cols(void) {
- // Pro Micro
- setPinInputHigh(E6);
- setPinInputHigh(D2);
- setPinInputHigh(D3);
- setPinInputHigh(D4);
- setPinInputHigh(D7);
- setPinInputHigh(C6);
- setPinInputHigh(B4);
-
- // Expander
- expander_init_cols();
-}
-
-static matrix_row_t read_cols(void) {
- // clang-format off
- return expander_read_row() |
- (readPin(D3) ? 0 : (1<<6)) |
- (readPin(D2) ? 0 : (1<<5)) |
- (readPin(D4) ? 0 : (1<<4)) |
- (readPin(C6) ? 0 : (1<<3)) |
- (readPin(D7) ? 0 : (1<<2)) |
- (readPin(E6) ? 0 : (1<<1)) |
- (readPin(B4) ? 0 : (1<<0)) ;
- // clang-format on
-}
-
-/* Row pin configuration
- *
- * Pro Micro: 0 1 2 3 4 5
- * F4 F5 F6 F7 B1 B2
- *
- * Expander: 0 1 2 3 4 5
- */
-static void unselect_rows(void) {
- // Pro Micro
- setPinInput(B1);
- setPinInput(B2);
- setPinInput(F4);
- setPinInput(F5);
- setPinInput(F6);
- setPinInput(F7);
- writePinLow(B1);
- writePinLow(B2);
- writePinLow(F4);
- writePinLow(F5);
- writePinLow(F6);
- writePinLow(F7);
-
- // Expander
- expander_unselect_rows();
-}
-
-static void unselect_row(uint8_t row) {
- // Pro Micro
- switch (row) {
- case 0:
- setPinInput(F4);
- writePinLow(F4);
- break;
- case 1:
- setPinInput(F5);
- writePinLow(F5);
- break;
- case 2:
- setPinInput(F6);
- writePinLow(F6);
- break;
- case 3:
- setPinInput(F7);
- writePinLow(F7);
- break;
- case 4:
- setPinInput(B1);
- writePinLow(B1);
- break;
- case 5:
- setPinInput(B2);
- writePinLow(B2);
- break;
- }
-
- // Expander
- expander_unselect_row(row);
-}
-
-static void select_row(uint8_t row) {
- // Pro Micro
- switch (row) {
- case 0:
- setPinOutput(F4);
- writePinLow(F4);
- break;
- case 1:
- setPinOutput(F5);
- writePinLow(F5);
- break;
- case 2:
- setPinOutput(F6);
- writePinLow(F6);
- break;
- case 3:
- setPinOutput(F7);
- writePinLow(F7);
- break;
- case 4:
- setPinOutput(B1);
- writePinLow(B1);
- break;
- case 5:
- setPinOutput(B2);
- writePinLow(B2);
- break;
- }
-
- // Expander
- expander_select_row(row);
-}
-
-static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
- // Store last value of row prior to reading
- matrix_row_t last_row_value = current_matrix[current_row];
-
- // Clear data in matrix row
- current_matrix[current_row] = 0;
-
- // Select row and wait for row selection to stabilize
- select_row(current_row);
- // Skip the wait_us(30); as i2c is slow enough to debounce the io changes
-
- current_matrix[current_row] = read_cols();
-
- unselect_row(current_row);
-
- return (last_row_value != current_matrix[current_row]);
-}
-
-void matrix_init_custom(void) {
- expander_init();
-
- unselect_rows();
- init_cols();
-}
-
-bool matrix_scan_custom(matrix_row_t current_matrix[]) {
- expander_scan();
-
- bool changed = false;
- for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
- changed |= read_cols_on_row(current_matrix, current_row);
- }
- return changed;
-}