Add dynamic keymap config
This commit is contained in:
		
				
					committed by
					
						
						Jeremy Soller
					
				
			
			
				
	
			
			
			
						parent
						
							fc2c3511d2
						
					
				
				
					commit
					916a6f87f3
				
			@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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)){
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										74
									
								
								src/board/system76/common/keymap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/board/system76/common/keymap.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
#include <board/flash.h>
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -15,6 +15,7 @@
 | 
			
		||||
#include <board/kbc.h>
 | 
			
		||||
#include <board/kbled.h>
 | 
			
		||||
#include <board/kbscan.h>
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
#include <board/lid.h>
 | 
			
		||||
#include <board/peci.h>
 | 
			
		||||
#include <board/pmc.h>
 | 
			
		||||
@@ -66,6 +67,7 @@ void init(void) {
 | 
			
		||||
    {
 | 
			
		||||
        kbscan_init();
 | 
			
		||||
    }
 | 
			
		||||
    keymap_init();
 | 
			
		||||
    peci_init();
 | 
			
		||||
    pmc_init();
 | 
			
		||||
    pwm_init();
 | 
			
		||||
 
 | 
			
		||||
@@ -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__)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <board/keymap.h>
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 
 | 
			
		||||
@@ -3,10 +3,33 @@
 | 
			
		||||
#ifndef _COMMON_KEYMAP_H
 | 
			
		||||
#define _COMMON_KEYMAP_H
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user