diff --git a/src/board/system76/galp3-c/include/board/keymap.h b/src/board/system76/galp3-c/include/board/keymap.h index e5fa825..7a390e8 100644 --- a/src/board/system76/galp3-c/include/board/keymap.h +++ b/src/board/system76/galp3-c/include/board/keymap.h @@ -3,6 +3,150 @@ #include -uint16_t keymap(int layer, int output, int input); +uint16_t keymap(int output, int input, int layer); + +// See http://www.techtoys.com.hk/Downloads/Download/Microchip/PS2_driver/ScanCode.pdf + +// Should send 0xE0 before scancode bytes +#define K_E0 0x0100 + +// Function keys + +#define K_F1 (0x05) +#define K_F2 (0x06) +#define K_F3 (0x04) +#define K_F4 (0x0C) +#define K_F5 (0x03) +#define K_F6 (0x0B) +#define K_F7 (0x83) +#define K_F8 (0x0A) +#define K_F9 (0x01) +#define K_F10 (0x09) +#define K_F11 (0x78) +#define K_F12 (0x07) + +// Number keys + +#define K_0 (0x45) +#define K_1 (0x16) +#define K_2 (0x1E) +#define K_3 (0x26) +#define K_4 (0x25) +#define K_5 (0x2E) +#define K_6 (0x36) +#define K_7 (0x3D) +#define K_8 (0x3E) +#define K_9 (0x46) + +// Letter keys + +#define K_A (0x1C) +#define K_B (0x32) +#define K_C (0x21) +#define K_D (0x23) +#define K_E (0x24) +#define K_F (0x2B) +#define K_G (0x34) +#define K_H (0x33) +#define K_I (0x43) +#define K_J (0x3B) +#define K_K (0x42) +#define K_L (0x4B) +#define K_M (0x3A) +#define K_N (0x31) +#define K_O (0x44) +#define K_P (0x4D) +#define K_Q (0x15) +#define K_R (0x2D) +#define K_S (0x1B) +#define K_T (0x2C) +#define K_U (0x3C) +#define K_V (0x2A) +#define K_W (0x1D) +#define K_X (0x22) +#define K_Y (0x35) +#define K_Z (0x1A) + +// Special keys + +// Escape key +#define K_ESC (0x76) + +//TODO: Print screen, scroll lock, pause + +// Tick/tilde key +#define K_TICK (0x0E) +// Minus/underline key +#define K_MINUS (0x4E) +// Equals/plus key +#define K_EQUALS (0x55) +// Backspace key +#define K_BKSP (0x66) + +// Tab key +#define K_TAB (0x0D) +// Bracket open key +#define K_BRACE_OPEN (0x54) +// Bracket close key +#define K_BRACE_CLOSE (0x5B) +// Backslash/pipe key +#define K_BACKSLASH (0x5D) + +// Capslock +#define K_CAPS (0x58) +// Semicolon key +#define K_SEMICOLON (0x4C) +// Quote key +#define K_QUOTE (0x52) +// Enter key +#define K_ENTER (0x5A) + +// Left shift +#define K_LEFT_SHIFT (0x12) +// Comma key +#define K_COMMA (0x41) +// Period key +#define K_PERIOD (0x49) +// Slash key +#define K_SLASH (0x4A) +// Right shift +#define K_RIGHT_SHIFT (0x59) + +// Left control key +#define K_LEFT_CTRL (0x14) +// Left super key +#define K_LEFT_SUPER (K_E0 | 0x1F) +// Left alt key +#define K_LEFT_ALT (0x11) +// Space key +#define K_SPACE (0x29) +// Right alt key +#define K_RIGHT_ALT (K_E0 | 0x11) +// Right super key +#define K_RIGHT_SUPER (K_E0 | 0x27) +// Application key +#define K_APP (K_E0 | 0x2F) +// Right control key +#define K_RIGHT_CTRL (K_E0 | 0x14) + +// Arrow keys and related + +// Insert key +#define K_INSERT (K_E0 | 0x70) +// Delete key +#define K_DEL (K_E0 | 0x71) +// Home key +#define K_HOME (K_E0 | 0x6C) +// End key +#define K_END (K_E0 | 0x69) +// Page up key +#define K_PGUP (K_E0 | 0x7D) +// Page down key +#define K_PGDN (K_E0 | 0x7A) + +#define K_UP (K_E0 | 0x75) +#define K_LEFT (K_E0 | 0x6B) +#define K_DOWN (K_E0 | 0x72) +#define K_RIGHT (K_E0 | 0x74) #endif // _BOARD_KEYMAP_H diff --git a/src/board/system76/galp3-c/kbscan.c b/src/board/system76/galp3-c/kbscan.c index 5eef0f2..db5d620 100644 --- a/src/board/system76/galp3-c/kbscan.c +++ b/src/board/system76/galp3-c/kbscan.c @@ -41,15 +41,11 @@ void kbscan_event(void) { uint8_t ksi = KSI; - printf(" %d: %02X\n", i, ksi); int j; for (j = 0; j < 8; j++) { if (!(ksi & (1 << j))) { - printf(" %d, %d\n", i, j); - uint16_t key = keymap(layer, i, j); - if (key) { - printf(" 0x%04X\n", key); - } + uint16_t key = keymap(i, j, layer); + printf(" %d, %d, %d = 0x%04X\n", i, j, layer, key); } } } diff --git a/src/board/system76/galp3-c/keymap.c b/src/board/system76/galp3-c/keymap.c index d602ef5..7e28dba 100644 --- a/src/board/system76/galp3-c/keymap.c +++ b/src/board/system76/galp3-c/keymap.c @@ -1,20 +1,178 @@ #include -// Keymap layers (normal, Fn) -#define KM_LAY 2 // Keymap output pins #define KM_OUT 16 // Keymap input pins #define KM_IN 8 +// Keymap layers (normal, Fn) +#define KM_LAY 2 -uint16_t __code KEYMAP[KM_IN][KM_OUT][KM_LAY] = { - // TODO - { { 0 } } +uint16_t __code KEYMAP[KM_OUT][KM_IN][KM_LAY] = { + { // 0 + {0, 0}, // 0 + {0, 0}, // 1 + {0, 0}, // 2 + {0, 0}, // 3 + {0, 0}, // 4 + {0, 0}, // 5 + {K_LEFT_SUPER, 0}, // 6 + {0, 0}, // 7 + }, + { // 1 + {0, 0}, // 0 + {0, 0}, // 1 + {0, 0}, // 2 + {0, 0}, // 3 + {0, 0}, // 4 + {0, 0}, // 5 + {K_LEFT_CTRL, 0}, // 6 + {K_RIGHT_CTRL, 0}, // 7 + }, + { // 2 + {0, 0}, // 0 + {0, 0}, // 1 + {0, 0}, // 2 + {0, 0}, // 3 + {0, 0}, // 4 + {0, 0}, // 5 + {K_LEFT_ALT, 0}, // 6 + {K_RIGHT_ALT, 0}, // 7 + }, + { // 3 + {0, 0}, // 0 + {0, 0}, // 1 + {0, 0}, // 2 + {0, 0}, // 3 + {0, 0}, // 4 + {0, 0}, // 5 + {K_LEFT_SHIFT, 0}, // 6 + {K_RIGHT_SHIFT, 0}, // 7 + }, + { // 4 + {K_X, 0}, // 0 + {K_Z, 0}, // 1 + {K_CAPS, 0}, // 2 + {K_A, 0}, // 3 + {K_TAB, 0}, // 4 + {0, 0}, // 5 + {K_SPACE, 0}, // 6 + {K_Q, 0}, // 7 + }, + { // 5 + {K_V, 0}, // 0 + {K_C, 0}, // 1 + {0, 0}, // 2 + {K_D, 0}, // 3 + {0, 0}, // 4 + {0, 0}, // 5 + {0, 0}, // 6 + {K_E, 0}, // 7 + }, + { // 6 + {0, 0}, // 0 + {K_B, 0}, // 1 + {K_F, 0}, // 2 + {K_G, 0}, // 3 + {K_R, 0}, // 4 + {K_T, 0}, // 5 + {0, 0}, // 6 + {0, 0}, // 7 + }, + { // 7 + {0, 0}, // 0 + {K_N, 0}, // 1 + {K_H, 0}, // 2 + {K_Y, 0}, // 3 + {K_2, 0}, // 4 + {K_1, 0}, // 5 + {K_TICK, 0}, // 6 + {K_ESC, 0}, // 7 + }, + { // 8 + {K_I, 0}, // 0 + {K_M, 0}, // 1 + {K_U, 0}, // 2 + {K_6, 0}, // 3 + {K_4, 0}, // 4 + {K_3, 0}, // 5 + {K_F2, 0}, // 6 + {K_F1, 0}, // 7 + }, + { // 9 + {K_W, 0}, // 0 + {K_J, 0}, // 1 + {K_K, 0}, // 2 + {0, 0}, // 3 + {K_7, 0}, // 4 + {0, 0}, // 5 + {K_F4, 0}, // 6 + {K_F3, 0}, // 7 + }, + { // 10 + {K_S, 0}, // 0 + {K_COMMA, 0}, // 1 + {K_L, 0}, // 2 + {K_O, 0}, // 3 + {K_9, 0}, // 4 + {K_8, 0}, // 5 + {K_F6, 0}, // 6 + {K_F5, 0}, // 7 + }, + { // 11 + {0, 0}, // 0 + {K_UP, 0}, // 1 + {K_PERIOD, 0}, // 2 + {K_SEMICOLON, 0}, // 3 + {K_P, 0}, // 4 + {K_0, 0}, // 5 + {K_F8, 0}, // 6 + {K_F7, 0}, // 7 + }, + { // 12 + {0, 0}, // 0 + {0, 0}, // 1 + {K_SLASH, 0}, // 2 + {K_QUOTE, 0}, // 3 + {K_BRACE_OPEN, 0}, // 4 + {K_MINUS, 0}, // 5 + {K_F10, 0}, // 6 + {K_F9, 0}, // 7 + }, + { // 13 + {0, 0}, // 0 + {0, 0}, // 1 + {0 /* TODO: PrtSc/SysRq */, 0}, // 2 + {K_BRACE_CLOSE, 0}, // 3 + {K_EQUALS, 0}, // 4 + {K_RIGHT, 0}, // 5 + {0 /* TODO: Pause/Break */, 0}, // 6 + {K_F11, 0}, // 7 + }, + { // 14 + {0, 0}, // 0 + {K_BACKSLASH, 0}, // 1 + {K_LEFT, 0}, // 2 + {K_BKSP, 0}, // 3 + {K_PGUP, 0}, // 4 + {K_INSERT, 0}, // 5 + {K_HOME, 0}, // 6 + {K_DEL, 0}, // 7 + }, + { // 15 + {K_APP, 0}, // 0 + {0, 0}, // 1 + {K_ENTER, 0}, // 2 + {0, 0}, // 3 + {K_DOWN, 0}, // 4 + {K_F12, 0}, // 5 + {K_END, 0}, // 6 + {K_PGDN, 0}, // 7 + }, }; -uint16_t keymap(int layer, int output, int input) { - if (layer < KM_LAY && output < KM_OUT && input < KM_IN) { - return KEYMAP[input][output][layer]; +uint16_t keymap(int output, int input, int layer) { + if (output < KM_OUT && input < KM_IN && layer < KM_LAY) { + return KEYMAP[output][input][layer]; } else { return 0; }