]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/infinity60/matrix.c
convert to unix line-endings [skip ci]
[qmk_firmware.git] / keyboards / infinity60 / matrix.c
1 #include <stdint.h>
2 #include <stdbool.h>
3 #include <string.h>
4 #include "hal.h"
5 #include "timer.h"
6 #include "wait.h"
7 #include "print.h"
8 #include "matrix.h"
9
10
11 /*
12  * Infinity Pinusage:
13  * Column pins are input with internal pull-down. Row pins are output and strobe with high.
14  * Key is high or 1 when it turns on.
15  *  INFINITY PRODUCTION (NO LED)
16  *     col: { PTD1, PTD2, PTD3, PTD4, PTD5, PTD6, PTD7 }
17  *     row: { PTB0, PTB1, PTB2, PTB3, PTB16, PTB17, PTC4, PTC5, PTD0 }
18  *  INFINITY PRODUCTION (WITH LED)
19  *     col: { PTD1, PTD2, PTD3, PTD4, PTD5, PTD6, PTD7 }
20  *     row: { PTC0, PTC1, PTC2, PTC3, PTC4, PTC5, PTC6, PTC7, PTD0 }
21  */
22 /* matrix state(1:on, 0:off) */
23 static matrix_row_t matrix[MATRIX_ROWS];
24 static matrix_row_t matrix_debouncing[MATRIX_ROWS];
25 static bool debouncing = false;
26 static uint16_t debouncing_time = 0;
27
28
29 void matrix_init(void)
30 {
31     /* Column(sense) */
32     palSetPadMode(GPIOD, 1,  PAL_MODE_INPUT_PULLDOWN);
33     palSetPadMode(GPIOD, 2,  PAL_MODE_INPUT_PULLDOWN);
34     palSetPadMode(GPIOD, 3,  PAL_MODE_INPUT_PULLDOWN);
35     palSetPadMode(GPIOD, 4,  PAL_MODE_INPUT_PULLDOWN);
36     palSetPadMode(GPIOD, 5,  PAL_MODE_INPUT_PULLDOWN);
37     palSetPadMode(GPIOD, 6,  PAL_MODE_INPUT_PULLDOWN);
38     palSetPadMode(GPIOD, 7,  PAL_MODE_INPUT_PULLDOWN);
39
40 #ifdef INFINITY_LED
41     /* Row(strobe) */
42     palSetPadMode(GPIOC, 0,  PAL_MODE_OUTPUT_PUSHPULL);
43     palSetPadMode(GPIOC, 1,  PAL_MODE_OUTPUT_PUSHPULL);
44     palSetPadMode(GPIOC, 2,  PAL_MODE_OUTPUT_PUSHPULL);
45     palSetPadMode(GPIOC, 3,  PAL_MODE_OUTPUT_PUSHPULL);
46     palSetPadMode(GPIOC, 4,  PAL_MODE_OUTPUT_PUSHPULL);
47     palSetPadMode(GPIOC, 5,  PAL_MODE_OUTPUT_PUSHPULL);
48     palSetPadMode(GPIOC, 6,  PAL_MODE_OUTPUT_PUSHPULL);
49     palSetPadMode(GPIOC, 7,  PAL_MODE_OUTPUT_PUSHPULL);
50     palSetPadMode(GPIOD, 0,  PAL_MODE_OUTPUT_PUSHPULL);
51 #else
52     /* Row(strobe) */
53     palSetPadMode(GPIOB, 0,  PAL_MODE_OUTPUT_PUSHPULL);
54     palSetPadMode(GPIOB, 1,  PAL_MODE_OUTPUT_PUSHPULL);
55     palSetPadMode(GPIOB, 2,  PAL_MODE_OUTPUT_PUSHPULL);
56     palSetPadMode(GPIOB, 3,  PAL_MODE_OUTPUT_PUSHPULL);
57     palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
58     palSetPadMode(GPIOB, 17, PAL_MODE_OUTPUT_PUSHPULL);
59     palSetPadMode(GPIOC, 4,  PAL_MODE_OUTPUT_PUSHPULL);
60     palSetPadMode(GPIOC, 5,  PAL_MODE_OUTPUT_PUSHPULL);
61     palSetPadMode(GPIOD, 0,  PAL_MODE_OUTPUT_PUSHPULL);
62 #endif
63     memset(matrix, 0, MATRIX_ROWS);
64     memset(matrix_debouncing, 0, MATRIX_ROWS);
65
66     matrix_init_quantum();
67 }
68
69 uint8_t matrix_scan(void)
70 {
71     for (int row = 0; row < MATRIX_ROWS; row++) {
72         matrix_row_t data = 0;
73     #ifdef INFINITY_LED
74         // strobe row
75         switch (row) {
76             case 0: palSetPad(GPIOC, 0);    break;
77             case 1: palSetPad(GPIOC, 1);    break;
78             case 2: palSetPad(GPIOC, 2);    break;
79             case 3: palSetPad(GPIOC, 3);    break;
80             case 4: palSetPad(GPIOC, 4);    break;
81             case 5: palSetPad(GPIOC, 5);    break;
82             case 6: palSetPad(GPIOC, 6);    break;
83             case 7: palSetPad(GPIOC, 7);    break;
84             case 8: palSetPad(GPIOD, 0);    break;
85         }
86     #else
87         // strobe row
88         switch (row) {
89             case 0: palSetPad(GPIOB, 0);    break;
90             case 1: palSetPad(GPIOB, 1);    break;
91             case 2: palSetPad(GPIOB, 2);    break;
92             case 3: palSetPad(GPIOB, 3);    break;
93             case 4: palSetPad(GPIOB, 16);   break;
94             case 5: palSetPad(GPIOB, 17);   break;
95             case 6: palSetPad(GPIOC, 4);    break;
96             case 7: palSetPad(GPIOC, 5);    break;
97             case 8: palSetPad(GPIOD, 0);    break;
98         }
99     #endif
100
101         // need wait to settle pin state
102         // if you wait too short, or have a too high update rate
103         // the keyboard might freeze, or there might not be enough
104         // processing power to update the LCD screen properly.
105         // 20us, or two ticks at 100000Hz seems to be OK
106         wait_us(20);
107
108         // read col data
109         data = (palReadPort(GPIOD)>>1);
110     #ifdef INFINITY_LED
111         // un-strobe row
112         switch (row) {
113             case 0: palClearPad(GPIOC, 0);    break;
114             case 1: palClearPad(GPIOC, 1);    break;
115             case 2: palClearPad(GPIOC, 2);    break;
116             case 3: palClearPad(GPIOC, 3);    break;
117             case 4: palClearPad(GPIOC, 4);    break;
118             case 5: palClearPad(GPIOC, 5);    break;
119             case 6: palClearPad(GPIOC, 6);    break;
120             case 7: palClearPad(GPIOC, 7);    break;
121             case 8: palClearPad(GPIOD, 0);    break;
122         }
123     #else
124         // un-strobe row
125         switch (row) {
126             case 0: palClearPad(GPIOB, 0);    break;
127             case 1: palClearPad(GPIOB, 1);    break;
128             case 2: palClearPad(GPIOB, 2);    break;
129             case 3: palClearPad(GPIOB, 3);    break;
130             case 4: palClearPad(GPIOB, 16);   break;
131             case 5: palClearPad(GPIOB, 17);   break;
132             case 6: palClearPad(GPIOC, 4);    break;
133             case 7: palClearPad(GPIOC, 5);    break;
134             case 8: palClearPad(GPIOD, 0);    break;
135         }
136     #endif
137
138         if (matrix_debouncing[row] != data) {
139             matrix_debouncing[row] = data;
140             debouncing = true;
141             debouncing_time = timer_read();
142         }
143     }
144
145     if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
146         for (int row = 0; row < MATRIX_ROWS; row++) {
147             matrix[row] = matrix_debouncing[row];
148         }
149         debouncing = false;
150     }
151     matrix_scan_quantum();
152     return 1;
153 }
154
155 bool matrix_is_on(uint8_t row, uint8_t col)
156 {
157     return (matrix[row] & (1<<col));
158 }
159
160 matrix_row_t matrix_get_row(uint8_t row)
161 {
162     return matrix[row];
163 }
164
165 void matrix_print(void)
166 {
167     xprintf("\nr/c 01234567\n");
168     for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
169         xprintf("%02X: ");
170         matrix_row_t data = matrix_get_row(row);
171         for (int col = 0; col < MATRIX_COLS; col++) {
172             if (data & (1<<col))
173                 xprintf("1");
174             else
175                 xprintf("0");
176         }
177         xprintf("\n");
178     }
179 }