diff --git a/src/board/system76/addw2/keymap/default.c b/src/board/system76/addw2/keymap/default.c index b7e5dbf..f062c88 100644 --- a/src/board/system76/addw2/keymap/default.c +++ b/src/board/system76/addw2/keymap/default.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/addw2/keymap/jeremy.c b/src/board/system76/addw2/keymap/jeremy.c index 83e2c87..c2f9e96 100644 --- a/src/board/system76/addw2/keymap/jeremy.c +++ b/src/board/system76/addw2/keymap/jeremy.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/bonw14/keymap/default.c b/src/board/system76/bonw14/keymap/default.c index b7e5dbf..f062c88 100644 --- a/src/board/system76/bonw14/keymap/default.c +++ b/src/board/system76/bonw14/keymap/default.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/bonw14/keymap/jeremy.c b/src/board/system76/bonw14/keymap/jeremy.c index 83e2c87..c2f9e96 100644 --- a/src/board/system76/bonw14/keymap/jeremy.c +++ b/src/board/system76/bonw14/keymap/jeremy.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/common/kbscan.c b/src/board/system76/common/kbscan.c index a3c61bd..11f20b1 100644 --- a/src/board/system76/common/kbscan.c +++ b/src/board/system76/common/kbscan.c @@ -125,6 +125,8 @@ static uint8_t kbscan_get_real_keys(int row, uint8_t rowdata) { // Remove any "active" blanks from the matrix. uint8_t realdata = 0; for (uint8_t col = 0; col < KM_IN; col++) { + // This tests the default keymap intentionally, to avoid blanks in the + // dynamic keymap if (KEYMAP[0][row][col] && (rowdata & (1 << col))) { realdata |= 1 << col; } @@ -349,9 +351,7 @@ void kbscan_event(void) { } uint8_t key_layer = kbscan_last_layer[i][j]; uint16_t key = 0; - if (key_layer < KM_LAY) {; - key = KEYMAP[key_layer][i][j]; - } + keymap_get(key_layer, i, j, &key); if (key) { DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, key_layer, key, new_b); if(!kbscan_press(key, new_b, &layer)){ diff --git a/src/board/system76/common/keymap.c b/src/board/system76/common/keymap.c new file mode 100644 index 0000000..76a94d2 --- /dev/null +++ b/src/board/system76/common/keymap.c @@ -0,0 +1,74 @@ +#include +#include + +uint16_t __xdata DYNAMIC_KEYMAP[KM_LAY][KM_OUT][KM_IN]; + +// Config is in the last sector of flash +const uint32_t CONFIG_ADDR = 0x1FC00; +// Signature is the size of the keymap +const uint16_t CONFIG_SIGNATURE = sizeof(DYNAMIC_KEYMAP); + +void keymap_init(void) { + if (!keymap_load_config()) { + keymap_load_default(); + } +} + +void keymap_load_default(void) { + for (int layer = 0; layer < KM_LAY; layer++) { + for (int output = 0; output < KM_OUT; output++) { + for (int input = 0; input < KM_IN; input++) { + DYNAMIC_KEYMAP[layer][output][input] = KEYMAP[layer][output][input]; + } + } + } +} + +bool keymap_erase_config(void) { + // This will erase 1024 bytes + flash_erase(CONFIG_ADDR); + + // Verify signature is erased + return flash_read_u16(CONFIG_ADDR) == 0xFFFF; +} + +bool keymap_load_config(void) { + // Check signature + if (flash_read_u16(CONFIG_ADDR) != CONFIG_SIGNATURE) return false; + + // Read the keymap if signature is valid + flash_read(CONFIG_ADDR + 2, (uint8_t *)DYNAMIC_KEYMAP, sizeof(DYNAMIC_KEYMAP)); + return true; +} + +bool keymap_save_config(void) { + // Erase config region + if (!keymap_erase_config()) return false; + + // Write the keymap + flash_write(CONFIG_ADDR + 2, (uint8_t *)DYNAMIC_KEYMAP, sizeof(DYNAMIC_KEYMAP)); + + // Write the length of the keymap, as a signature + flash_write_u16(CONFIG_ADDR, CONFIG_SIGNATURE); + + // Verify signature is valid + return flash_read_u16(CONFIG_ADDR) == CONFIG_SIGNATURE; +} + +bool keymap_get(int layer, int output, int input, uint16_t * value) { + if (layer < KM_LAY && output < KM_OUT && input < KM_IN) { + *value = DYNAMIC_KEYMAP[layer][output][input]; + return true; + } else { + return false; + } +} + +bool keymap_set(int layer, int output, int input, uint16_t value) { + if (layer < KM_LAY && output < KM_OUT && input < KM_IN) { + DYNAMIC_KEYMAP[layer][output][input] = value; + return true; + } else { + return false; + } +} diff --git a/src/board/system76/common/main.c b/src/board/system76/common/main.c index 7a7410f..5d5c35f 100644 --- a/src/board/system76/common/main.c +++ b/src/board/system76/common/main.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -66,6 +67,7 @@ void init(void) { { kbscan_init(); } + keymap_init(); peci_init(); pmc_init(); pwm_init(); diff --git a/src/board/system76/common/smfi.c b/src/board/system76/common/smfi.c index b087e2b..eb64177 100644 --- a/src/board/system76/common/smfi.c +++ b/src/board/system76/common/smfi.c @@ -153,33 +153,35 @@ static enum Result cmd_keymap_get(void) { int layer = smfi_cmd[SMFI_CMD_DATA]; int output = smfi_cmd[SMFI_CMD_DATA + 1]; int input = smfi_cmd[SMFI_CMD_DATA + 2]; - - if (layer < KM_LAY && output < KM_OUT && input < KM_IN) { - uint16_t key = KEYMAP[layer][output][input]; + uint16_t key = 0; + if (keymap_get(layer, output, input, &key)) { smfi_cmd[SMFI_CMD_DATA + 3] = (uint8_t)key; smfi_cmd[SMFI_CMD_DATA + 4] = (uint8_t)(key >> 8); return RES_OK; + } else { + return RES_ERR; } - - // Failed if keyboard mapping not found - return RES_ERR; } static enum Result cmd_keymap_set(void) { int layer = smfi_cmd[SMFI_CMD_DATA]; int output = smfi_cmd[SMFI_CMD_DATA + 1]; int input = smfi_cmd[SMFI_CMD_DATA + 2]; - - if (layer < KM_LAY && output < KM_OUT && input < KM_IN) { - uint16_t key = - ((uint16_t)smfi_cmd[SMFI_CMD_DATA + 3]) | - (((uint16_t)smfi_cmd[SMFI_CMD_DATA + 4]) << 8); - KEYMAP[layer][output][input] = key; - return RES_OK; + uint16_t key = + ((uint16_t)smfi_cmd[SMFI_CMD_DATA + 3]) | + (((uint16_t)smfi_cmd[SMFI_CMD_DATA + 4]) << 8); + //TODO: consider only setting if the key has changed + if (keymap_set(layer, output, input, key)) { + //TODO: should we write config on every change? + if (keymap_save_config()) { + return RES_OK; + } else { + //TODO: need a different error code? + return RES_ERR; + } + } else { + return RES_ERR; } - - // Failed if keyboard mapping not found - return RES_ERR; } #endif // !defined(__SCRATCH__) diff --git a/src/board/system76/darp5/keymap/default.c b/src/board/system76/darp5/keymap/default.c index b7e5dbf..f062c88 100644 --- a/src/board/system76/darp5/keymap/default.c +++ b/src/board/system76/darp5/keymap/default.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/darp5/keymap/jeremy.c b/src/board/system76/darp5/keymap/jeremy.c index 83e2c87..c2f9e96 100644 --- a/src/board/system76/darp5/keymap/jeremy.c +++ b/src/board/system76/darp5/keymap/jeremy.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/galp3-c/keymap/carl.c b/src/board/system76/galp3-c/keymap/carl.c index e94543e..7092648 100644 --- a/src/board/system76/galp3-c/keymap/carl.c +++ b/src/board/system76/galp3-c/keymap/carl.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, 0 /* pause */, K_INSERT, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_HOME, diff --git a/src/board/system76/galp3-c/keymap/default.c b/src/board/system76/galp3-c/keymap/default.c index decdf29..db2b0d4 100644 --- a/src/board/system76/galp3-c/keymap/default.c +++ b/src/board/system76/galp3-c/keymap/default.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, 0 /* pause */, K_INSERT, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_HOME, diff --git a/src/board/system76/galp3-c/keymap/jeremy.c b/src/board/system76/galp3-c/keymap/jeremy.c index e217e34..a91647b 100644 --- a/src/board/system76/galp3-c/keymap/jeremy.c +++ b/src/board/system76/galp3-c/keymap/jeremy.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, 0 /* pause */, K_INSERT, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_HOME, diff --git a/src/board/system76/gaze15/keymap/default.c b/src/board/system76/gaze15/keymap/default.c index b7e5dbf..f062c88 100644 --- a/src/board/system76/gaze15/keymap/default.c +++ b/src/board/system76/gaze15/keymap/default.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/gaze15/keymap/jeremy.c b/src/board/system76/gaze15/keymap/jeremy.c index 83e2c87..c2f9e96 100644 --- a/src/board/system76/gaze15/keymap/jeremy.c +++ b/src/board/system76/gaze15/keymap/jeremy.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/lemp9/keymap/default.c b/src/board/system76/lemp9/keymap/default.c index 139cd0f..ed382c6 100644 --- a/src/board/system76/lemp9/keymap/default.c +++ b/src/board/system76/lemp9/keymap/default.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_HOME, K_END, K_PRINT_SCREEN, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, diff --git a/src/board/system76/lemp9/keymap/ins-prtsc.c b/src/board/system76/lemp9/keymap/ins-prtsc.c index 5e48c3d..02895e9 100644 --- a/src/board/system76/lemp9/keymap/ins-prtsc.c +++ b/src/board/system76/lemp9/keymap/ins-prtsc.c @@ -5,7 +5,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_HOME, K_END, K_INSERT, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, diff --git a/src/board/system76/lemp9/keymap/jeremy.c b/src/board/system76/lemp9/keymap/jeremy.c index f277233..cd4d007 100644 --- a/src/board/system76/lemp9/keymap/jeremy.c +++ b/src/board/system76/lemp9/keymap/jeremy.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_HOME, K_END, K_PRINT_SCREEN, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, diff --git a/src/board/system76/lemp9/keymap/levi.c b/src/board/system76/lemp9/keymap/levi.c index 19c0f25..fbc8ef3 100644 --- a/src/board/system76/lemp9/keymap/levi.c +++ b/src/board/system76/lemp9/keymap/levi.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_HOME, K_END, K_PRINT_SCREEN, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_BRACE_OPEN, K_BRACE_CLOSE, K_BKSP, diff --git a/src/board/system76/oryp5/keymap/default.c b/src/board/system76/oryp5/keymap/default.c index 0903e85..d0079c7 100644 --- a/src/board/system76/oryp5/keymap/default.c +++ b/src/board/system76/oryp5/keymap/default.c @@ -2,7 +2,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/oryp6/keymap/default.c b/src/board/system76/oryp6/keymap/default.c index b7e5dbf..f062c88 100644 --- a/src/board/system76/oryp6/keymap/default.c +++ b/src/board/system76/oryp6/keymap/default.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/board/system76/oryp6/keymap/jeremy.c b/src/board/system76/oryp6/keymap/jeremy.c index 83e2c87..c2f9e96 100644 --- a/src/board/system76/oryp6/keymap/jeremy.c +++ b/src/board/system76/oryp6/keymap/jeremy.c @@ -4,7 +4,7 @@ #include -uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN] = { +uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, diff --git a/src/common/include/common/keymap.h b/src/common/include/common/keymap.h index 447b620..9de8948 100644 --- a/src/common/include/common/keymap.h +++ b/src/common/include/common/keymap.h @@ -3,10 +3,33 @@ #ifndef _COMMON_KEYMAP_H #define _COMMON_KEYMAP_H +#include #include +// Keymap defined by board #if defined(KM_LAY) && defined(KM_OUT) && defined(KM_IN) -extern uint16_t __xdata KEYMAP[KM_LAY][KM_OUT][KM_IN]; + extern uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN]; + extern uint16_t __xdata DYNAMIC_KEYMAP[KM_LAY][KM_OUT][KM_IN]; + #define HAVE_KEYMAP 1 +#else + #define HAVE_KEYMAP 0 +#endif + +#if HAVE_KEYMAP + // Initialize the dynamic keymap + void keymap_init(void); + // Set the dynamic keymap to the default keymap + void keymap_load_default(void); + // Erase dynamic keymap in flash + bool keymap_erase_config(void); + // Load dynamic keymap from flash + bool keymap_load_config(void); + // Save dynamic keymap to flash + bool keymap_save_config(void); + // Get a keycode from the dynamic keymap + bool keymap_get(int layer, int output, int input, uint16_t * value); + // Set a keycode in the dynamic keymap + bool keymap_set(int layer, int output, int input, uint16_t value); #endif // Translate a keycode from PS/2 set 2 to PS/2 set 1