2 Copyright 2011 Jun Wako <wakojun@gmail.com>
3 Copyright 2016 Ethan Apodaca <papodaca@gmail.com>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
29 static void matrix_make(uint8_t code);
30 static void matrix_break(uint8_t code);
32 static uint8_t matrix[MATRIX_ROWS];
33 #define ROW(code) (code>>3)
34 #define COL(code) (code&0x07)
36 __attribute__ ((weak))
37 void matrix_init_kb(void) {
41 __attribute__ ((weak))
42 void matrix_scan_kb(void) {
46 __attribute__ ((weak))
47 void matrix_init_user(void) {
50 __attribute__ ((weak))
51 void matrix_scan_user(void) {
54 void matrix_init(void)
59 // initialize matrix state: all keys off
60 for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
62 matrix_init_quantum();
65 // convert E0-escaped codes into unused area
66 static uint8_t move_e0code(uint8_t code) {
68 // Original IBM XT keyboard has these keys
69 case 0x37: return 0x54; // Print Screen
70 case 0x46: return 0x55; // Ctrl + Pause
71 case 0x1C: return 0x6F; // Keypad Enter
72 case 0x35: return 0x7F; // Keypad /
74 // Any XT keyobard with these keys?
75 // http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf
76 // https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc
77 case 0x5B: return 0x5A; // Left GUI
78 case 0x5C: return 0x5B; // Right GUI
79 case 0x5D: return 0x5C; // Application
80 case 0x5E: return 0x5D; // Power(not used)
81 case 0x5F: return 0x5E; // Sleep(not used)
82 case 0x63: return 0x5F; // Wake (not used)
83 case 0x48: return 0x60; // Up
84 case 0x4B: return 0x61; // Left
85 case 0x50: return 0x62; // Down
86 case 0x4D: return 0x63; // Right
87 case 0x52: return 0x71; // Insert
88 case 0x53: return 0x72; // Delete
89 case 0x47: return 0x74; // Home
90 case 0x4F: return 0x75; // End
91 case 0x49: return 0x77; // Home
92 case 0x51: return 0x78; // End
93 case 0x1D: return 0x7A; // Right Ctrl
94 case 0x38: return 0x7C; // Right Alt
99 uint8_t matrix_scan(void)
104 // Pause: E1 1D 45, E1 9D C5
110 uint8_t code = xt_host_recv();
112 xprintf("%02X ", code);
126 matrix_break(code & 0x7F);
141 matrix_make(move_e0code(code));
143 matrix_break(move_e0code(code & 0x7F));
184 matrix_scan_quantum();
189 uint8_t matrix_get_row(uint8_t row)
195 static void matrix_make(uint8_t code)
197 if (!matrix_is_on(ROW(code), COL(code))) {
198 matrix[ROW(code)] |= 1<<COL(code);
203 static void matrix_break(uint8_t code)
205 if (matrix_is_on(ROW(code), COL(code))) {
206 matrix[ROW(code)] &= ~(1<<COL(code));
210 void matrix_clear(void)
212 for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
215 bool matrix_is_on(uint8_t row, uint8_t col)
217 return (matrix_get_row(row) & (1<<col));
220 #if (MATRIX_COLS <= 8)
221 # define print_matrix_header() print("\nr/c 01234567\n")
222 # define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
223 #elif (MATRIX_COLS <= 16)
224 # define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
225 # define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
226 #elif (MATRIX_COLS <= 32)
227 # define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
228 # define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
231 void matrix_print(void)
233 print_matrix_header();
235 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
236 phex(row); print(": ");
237 print_matrix_row(row);
245 - http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf
246 - https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc
248 01-53: Normal codes used in original XT keyboard
249 54-7F: Not used in original XT keyboard
251 0 1 2 3 4 5 6 7 8 9 A B C D E F
252 50 - - - - * * x x x x * * * o o o
253 60 * * * * x x x x x x x x x x x *
254 70 x * * x * * x * * x * x * x x *
256 -: codes existed in original XT keyboard
257 *: E0-escaped codes converted into unused code area(internal use in TMK)
258 x: Non-espcaped codes(not used in real keyboards probably, for CodeSet2-CodeSet1 translation purpose)
263 00 (reserved) DO NOT USE