v: print device version & info | v: print device version & info | ||||
t: print timer count | t: print timer count | ||||
s: print status | s: print status | ||||
e: print eeprom config | |||||
n: toggle NKRO | |||||
0/F10: switch to Layer0 | 0/F10: switch to Layer0 | ||||
1/F1: switch to Layer1 | 1/F1: switch to Layer1 | ||||
2/F2: switch to Layer2 | 2/F2: switch to Layer2 | ||||
**TBD** | **TBD** | ||||
### Conguration with Boot Magic | |||||
### Boot Magic Configuration - Virtual DIP Switch | |||||
Boot Magic are executed during boot up time. Press Magic key below then pulgin keyboard cable. | Boot Magic are executed during boot up time. Press Magic key below then pulgin keyboard cable. | ||||
These settings are stored in EEPROM. | |||||
Note that you must use keys of **Layer 0** as Magic keys. These settings are stored in EEPROM so that retain your configure over power cycles. | |||||
#### EEPROM | |||||
- Skip reading EEPROM(`ESC`) | |||||
- Clear configuration stored in EEPROM(`Backspace`) | - Clear configuration stored in EEPROM(`Backspace`) | ||||
#### Bootloader | |||||
- Kick up Bootloader(`B`) | - Kick up Bootloader(`B`) | ||||
#### Debug | |||||
- Debug enable(`D`) | - Debug enable(`D`) | ||||
- Debug matrix enable(`D`+`X`) | |||||
- Debug keyboard enable(`D`+`K`) | |||||
- Debug mouse enable(`D`+`M`) | |||||
#### Keymap | |||||
- Swap Control and CapsLock(`Left Control`) | - Swap Control and CapsLock(`Left Control`) | ||||
- Change CapsLock to Control(`Casp Lock`) | - Change CapsLock to Control(`Casp Lock`) | ||||
- Swap LeftAlt and Gui(`Left Alt`) | - Swap LeftAlt and Gui(`Left Alt`) | ||||
- Swap Grave and Escape(`Grave`) | - Swap Grave and Escape(`Grave`) | ||||
- Swap BackSlash and BackSpace(`Back Slash`) | - Swap BackSlash and BackSpace(`Back Slash`) | ||||
#### Default Layer | |||||
- Set Default Layer to 0(`0`) | |||||
- Set Default Layer to 0(`1`) | |||||
- Set Default Layer to 0(`2`) | |||||
- Set Default Layer to 0(`3`) | |||||
**TBD** | **TBD** | ||||
$(COMMON_DIR)/keymap.c \ | $(COMMON_DIR)/keymap.c \ | ||||
$(COMMON_DIR)/timer.c \ | $(COMMON_DIR)/timer.c \ | ||||
$(COMMON_DIR)/print.c \ | $(COMMON_DIR)/print.c \ | ||||
$(COMMON_DIR)/debug.c \ | |||||
$(COMMON_DIR)/bootloader.c \ | $(COMMON_DIR)/bootloader.c \ | ||||
$(COMMON_DIR)/suspend.c \ | $(COMMON_DIR)/suspend.c \ | ||||
$(COMMON_DIR)/util.c | $(COMMON_DIR)/util.c |
#include <stdbool.h> | #include <stdbool.h> | ||||
#include <util/delay.h> | #include <util/delay.h> | ||||
#include "matrix.h" | #include "matrix.h" | ||||
#include "bootloader.h" | |||||
#include "debug.h" | |||||
#include "keymap.h" | #include "keymap.h" | ||||
#include "eeconfig.h" | #include "eeconfig.h" | ||||
#include "bootloader.h" | |||||
#include "bootmagic.h" | #include "bootmagic.h" | ||||
void bootmagic(void) | void bootmagic(void) | ||||
{ | { | ||||
if (!BOOTMAGIC_IS_ENABLED()) { return; } | |||||
/* check signature */ | |||||
if (!eeconfig_is_enabled()) { | |||||
eeconfig_init(); | |||||
} | |||||
/* do scans in case of bounce */ | /* do scans in case of bounce */ | ||||
uint8_t scan = 100; | uint8_t scan = 100; | ||||
while (scan--) { matrix_scan(); _delay_ms(1); } | |||||
while (scan--) { matrix_scan(); _delay_ms(10); } | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_BOOTLOADER_KEY)) { | |||||
bootloader_jump(); | |||||
/* bootmagic skip */ | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SKIP)) { | |||||
return; | |||||
} | } | ||||
if (bootmagic_scan_keycode(BOOTMAGIC_DEBUG_ENABLE_KEY)) { | |||||
eeconfig_write_debug(eeconfig_read_debug() ^ EECONFIG_DEBUG_ENABLE); | |||||
/* eeconfig clear */ | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_EEPROM_CLEAR)) { | |||||
eeconfig_init(); | |||||
} | } | ||||
if (bootmagic_scan_keycode(BOOTMAGIC_EEPROM_CLEAR_KEY)) { | |||||
eeconfig_init(); | |||||
/* bootloader */ | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_BOOTLOADER)) { | |||||
bootloader_jump(); | |||||
} | |||||
/* debug enable */ | |||||
debug_config.raw = eeconfig_read_debug(); | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_ENABLE)) { | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_MATRIX)) { | |||||
debug_config.matrix = !debug_config.matrix; | |||||
} else if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_KEYBOARD)) { | |||||
debug_config.keyboard = !debug_config.keyboard; | |||||
} else if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_MOUSE)) { | |||||
debug_config.mouse = !debug_config.mouse; | |||||
} else { | |||||
debug_config.enable = !debug_config.enable; | |||||
} | |||||
} | } | ||||
eeconfig_write_debug(debug_config.raw); | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_SWAP_CONTROL_CPASLOCK)) { | |||||
eeconfig_write_keyconf(eeconfig_read_keyconf() ^ EECONFIG_KEYCONF_SWAP_CONTROL_CAPSLOCK); | |||||
/* keymap config */ | |||||
keymap_config.raw = eeconfig_read_keymap(); | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_CONTROL_CPASLOCK)) { | |||||
keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock; | |||||
} | } | ||||
if (bootmagic_scan_keycode(BOOTMAGIC_CAPSLOCK_TO_CONTROL)) { | |||||
eeconfig_write_keyconf(eeconfig_read_keyconf() ^ EECONFIG_KEYCONF_CAPSLOCK_TO_CONTROL); | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) { | |||||
keymap_config.capslock_to_control = !keymap_config.capslock_to_control; | |||||
} | } | ||||
if (bootmagic_scan_keycode(BOOTMAGIC_SWAP_LALT_LGUI)) { | |||||
eeconfig_write_keyconf(eeconfig_read_keyconf() ^ EECONFIG_KEYCONF_SWAP_LALT_LGUI); | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) { | |||||
keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; | |||||
} | } | ||||
if (bootmagic_scan_keycode(BOOTMAGIC_SWAP_RALT_RGUI)) { | |||||
eeconfig_write_keyconf(eeconfig_read_keyconf() ^ EECONFIG_KEYCONF_SWAP_RALT_RGUI); | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) { | |||||
keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui; | |||||
} | } | ||||
if (bootmagic_scan_keycode(BOOTMAGIC_NO_GUI)) { | |||||
eeconfig_write_keyconf(eeconfig_read_keyconf() ^ EECONFIG_KEYCONF_NO_GUI); | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_NO_GUI)) { | |||||
keymap_config.no_gui = !keymap_config.no_gui; | |||||
} | } | ||||
if (bootmagic_scan_keycode(BOOTMAGIC_SWAP_GRAVE_ESC)) { | |||||
eeconfig_write_keyconf(eeconfig_read_keyconf() ^ EECONFIG_KEYCONF_SWAP_GRAVE_ESC); | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) { | |||||
keymap_config.swap_grave_esc = !keymap_config.swap_grave_esc; | |||||
} | } | ||||
if (bootmagic_scan_keycode(BOOTMAGIC_SWAP_BACKSLASH_BACKSPACE)) { | |||||
eeconfig_write_keyconf(eeconfig_read_keyconf() ^ EECONFIG_KEYCONF_SWAP_BACKSLASH_BACKSPACE); | |||||
if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) { | |||||
keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace; | |||||
} | } | ||||
eeconfig_write_keymap(keymap_config.raw); | |||||
} | } | ||||
bool bootmagic_scan_keycode(uint8_t keycode) | bool bootmagic_scan_keycode(uint8_t keycode) |
#define BOOTMAGIC_H | #define BOOTMAGIC_H | ||||
#ifndef BOOTMAGIC_IS_ENABLED | |||||
#define BOOTMAGIC_IS_ENABLED() true | |||||
#ifndef BOOTMAGIC_KEY_SKIP | |||||
#define BOOTMAGIC_KEY_SKIP KC_ESC | |||||
#endif | |||||
/* eeprom clear */ | |||||
#ifndef BOOTMAGIC_KEY_EEPROM_CLEAR | |||||
#define BOOTMAGIC_KEY_EEPROM_CLEAR KC_BSPACE | |||||
#endif | #endif | ||||
/* kick up bootloader */ | /* kick up bootloader */ | ||||
#ifndef BOOTMAGIC_BOOTLOADER_KEY | |||||
#define BOOTMAGIC_BOOTLOADER_KEY KC_B | |||||
#ifndef BOOTMAGIC_KEY_BOOTLOADER | |||||
#define BOOTMAGIC_KEY_BOOTLOADER KC_B | |||||
#endif | #endif | ||||
/* debug enable */ | /* debug enable */ | ||||
#ifndef BOOTMAGIC_DEBUG_ENABLE_KEY | |||||
#define BOOTMAGIC_DEBUG_ENABLE_KEY KC_D | |||||
#endif | |||||
/* eeprom clear */ | |||||
#ifndef BOOTMAGIC_EEPROM_CLEAR_KEY | |||||
#define BOOTMAGIC_EEPROM_CLEAR_KEY KC_BSPACE | |||||
#endif | |||||
#define BOOTMAGIC_KEY_DEBUG_ENABLE KC_D | |||||
#define BOOTMAGIC_KEY_DEBUG_MATRIX KC_X | |||||
#define BOOTMAGIC_KEY_DEBUG_KEYBOARD KC_K | |||||
#define BOOTMAGIC_KEY_DEBUG_MOUSE KC_M | |||||
/* | /* | ||||
* key configure | |||||
* keymap config | |||||
*/ | */ | ||||
/* swap control and capslock */ | |||||
#ifndef BOOTMAGIC_SWAP_CONTROL_CPASLOCK | |||||
#define BOOTMAGIC_SWAP_CONTROL_CPASLOCK KC_LCTRL | |||||
#endif | |||||
/* capslock to control */ | |||||
#ifndef BOOTMAGIC_CAPSLOCK_TO_CONTROL | |||||
#define BOOTMAGIC_CAPSLOCK_TO_CONTROL KC_CAPSLOCK | |||||
#endif | |||||
/* swap alt and gui */ | |||||
#ifndef BOOTMAGIC_SWAP_LALT_LGUI | |||||
#define BOOTMAGIC_SWAP_LALT_LGUI KC_LALT | |||||
#endif | |||||
/* swap alt and gui */ | |||||
#ifndef BOOTMAGIC_SWAP_RALT_RGUI | |||||
#define BOOTMAGIC_SWAP_RALT_RGUI KC_RALT | |||||
#endif | |||||
/* no gui */ | |||||
#ifndef BOOTMAGIC_NO_GUI | |||||
#define BOOTMAGIC_NO_GUI KC_LGUI | |||||
#endif | |||||
/* swap esc and grave */ | |||||
#ifndef BOOTMAGIC_SWAP_GRAVE_ESC | |||||
#define BOOTMAGIC_SWAP_GRAVE_ESC KC_GRAVE | |||||
#endif | |||||
/* swap backslash and backspace */ | |||||
#ifndef BOOTMAGIC_SWAP_BACKSLASH_BACKSPACE | |||||
#define BOOTMAGIC_SWAP_BACKSLASH_BACKSPACE KC_BSLASH | |||||
#endif | |||||
#define BOOTMAGIC_KEY_SWAP_CONTROL_CPASLOCK KC_LCTRL | |||||
#define BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL KC_CAPSLOCK | |||||
#define BOOTMAGIC_KEY_SWAP_LALT_LGUI KC_LALT | |||||
#define BOOTMAGIC_KEY_SWAP_RALT_RGUI KC_RALT | |||||
#define BOOTMAGIC_KEY_NO_GUI KC_LGUI | |||||
#define BOOTMAGIC_KEY_SWAP_GRAVE_ESC KC_GRAVE | |||||
#define BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE KC_BSLASH | |||||
/* | /* | ||||
* change default layer | * change default layer | ||||
*/ | */ | ||||
#ifndef BOOTMAGIC_DEFAULT_LAYER_0_KEY | |||||
#define BOOTMAGIC_DEFAULT_LAYER_0_KEY KC_0 | |||||
#endif | |||||
#ifndef BOOTMAGIC_DEFAULT_LAYER_1_KEY | |||||
#define BOOTMAGIC_DEFAULT_LAYER_1_KEY KC_1 | |||||
#endif | |||||
#ifndef BOOTMAGIC_DEFAULT_LAYER_2_KEY | |||||
#define BOOTMAGIC_DEFAULT_LAYER_2_KEY KC_2 | |||||
#endif | |||||
#ifndef BOOTMAGIC_DEFAULT_LAYER_3_KEY | |||||
#define BOOTMAGIC_DEFAULT_LAYER_3_KEY KC_3 | |||||
#endif | |||||
#define BOOTMAGIC_KEY_DEFAULT_LAYER_0 KC_0 | |||||
#define BOOTMAGIC_KEY_DEFAULT_LAYER_1 KC_1 | |||||
#define BOOTMAGIC_KEY_DEFAULT_LAYER_2 KC_2 | |||||
#define BOOTMAGIC_KEY_DEFAULT_LAYER_3 KC_3 | |||||
void bootmagic(void); | void bootmagic(void); |
print("v: print device version & info\n"); | print("v: print device version & info\n"); | ||||
print("t: print timer count\n"); | print("t: print timer count\n"); | ||||
print("s: print status\n"); | print("s: print status\n"); | ||||
print("e: print eeprom boot config\n"); | |||||
print("e: print eeprom config\n"); | |||||
#ifdef NKRO_ENABLE | #ifdef NKRO_ENABLE | ||||
print("n: toggle NKRO\n"); | print("n: toggle NKRO\n"); | ||||
#endif | #endif | ||||
} | } | ||||
#ifdef BOOTMAGIC_ENABLE | #ifdef BOOTMAGIC_ENABLE | ||||
static void print_eeprom_config(void) | |||||
static void print_eeconfig(void) | |||||
{ | { | ||||
uint8_t eebyte; | |||||
eebyte = eeconfig_read_debug(); | |||||
print("debug: "); print_hex8(eebyte); print("\n"); | |||||
eebyte = eeconfig_read_defalt_layer(); | |||||
print("defalt_layer: "); print_hex8(eebyte); print("\n"); | |||||
eebyte = eeconfig_read_keyconf(); | |||||
print("keyconf: "); print_hex8(eebyte); print("\n"); | |||||
keyconf kc; | |||||
kc = (keyconf){ .raw = eebyte }; | |||||
print("keyconf.swap_control_capslock: "); print_hex8(kc.swap_control_capslock); print("\n"); | |||||
print("keyconf.capslock_to_control: "); print_hex8(kc.capslock_to_control); print("\n"); | |||||
print("keyconf.swap_lalt_lgui: "); print_hex8(kc.swap_lalt_lgui); print("\n"); | |||||
print("keyconf.swap_ralt_rgui: "); print_hex8(kc.swap_ralt_rgui); print("\n"); | |||||
print("keyconf.no_gui: "); print_hex8(kc.no_gui); print("\n"); | |||||
print("keyconf.swap_grave_esc: "); print_hex8(kc.swap_grave_esc); print("\n"); | |||||
print("keyconf.swap_backslash_backspace: "); print_hex8(kc.swap_backslash_backspace); print("\n"); | |||||
print("default_layer: "); print_dec(eeconfig_read_defalt_layer()); print("\n"); | |||||
debug_config_t dc; | |||||
dc.raw = eeconfig_read_debug(); | |||||
print("debug_config.raw: "); print_hex8(dc.raw); print("\n"); | |||||
print(".enable: "); print_dec(dc.enable); print("\n"); | |||||
print(".matrix: "); print_dec(dc.matrix); print("\n"); | |||||
print(".keyboard: "); print_dec(dc.keyboard); print("\n"); | |||||
print(".mouse: "); print_dec(dc.mouse); print("\n"); | |||||
keymap_config_t kc; | |||||
kc.raw = eeconfig_read_keymap(); | |||||
print("keymap_config.raw: "); print_hex8(kc.raw); print("\n"); | |||||
print(".swap_control_capslock: "); print_dec(kc.swap_control_capslock); print("\n"); | |||||
print(".capslock_to_control: "); print_dec(kc.capslock_to_control); print("\n"); | |||||
print(".swap_lalt_lgui: "); print_dec(kc.swap_lalt_lgui); print("\n"); | |||||
print(".swap_ralt_rgui: "); print_dec(kc.swap_ralt_rgui); print("\n"); | |||||
print(".no_gui: "); print_dec(kc.no_gui); print("\n"); | |||||
print(".swap_grave_esc: "); print_dec(kc.swap_grave_esc); print("\n"); | |||||
print(".swap_backslash_backspace: "); print_dec(kc.swap_backslash_backspace); print("\n"); | |||||
} | } | ||||
#endif | #endif | ||||
break; | break; | ||||
#ifdef BOOTMAGIC_ENABLE | #ifdef BOOTMAGIC_ENABLE | ||||
case KC_E: | case KC_E: | ||||
print("eeprom config\n"); | |||||
print_eeprom_config(); | |||||
print("eeconfig:\n"); | |||||
print_eeconfig(); | |||||
break; | break; | ||||
#endif | #endif | ||||
case KC_CAPSLOCK: | case KC_CAPSLOCK: |
#include <stdbool.h> | |||||
#include "debug.h" | |||||
bool debug_enable = false; | |||||
bool debug_matrix = false; | |||||
bool debug_keyboard = false; | |||||
bool debug_mouse = false; |
extern "C" { | extern "C" { | ||||
#endif | #endif | ||||
extern bool debug_enable; | |||||
extern bool debug_matrix; | |||||
extern bool debug_keyboard; | |||||
extern bool debug_mouse; | |||||
/* NOTE: Not portable. Bit field order depends on implementation */ | |||||
typedef union { | |||||
uint8_t raw; | |||||
struct { | |||||
bool enable:1; | |||||
bool matrix:1; | |||||
bool keyboard:1; | |||||
bool mouse:1; | |||||
uint8_t reserved:4; | |||||
}; | |||||
} debug_config_t; | |||||
debug_config_t debug_config; | |||||
/* for backward compatibility */ | |||||
#define debug_enable (debug_config.enable) | |||||
#define debug_matrix (debug_config.matrix) | |||||
#define debug_keyboard (debug_config.keyboard) | |||||
#define debug_mouse (debug_config.mouse) | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} | } |
#include <avr/eeprom.h> | #include <avr/eeprom.h> | ||||
#include "eeconfig.h" | #include "eeconfig.h" | ||||
void eeconfig_init(void) | void eeconfig_init(void) | ||||
{ | { | ||||
eeprom_write_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); | eeprom_write_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); | ||||
eeprom_write_byte(EECONFIG_DEBUG, 0); | eeprom_write_byte(EECONFIG_DEBUG, 0); | ||||
eeprom_write_byte(EECONFIG_DEFAULT_LAYER, 0); | eeprom_write_byte(EECONFIG_DEFAULT_LAYER, 0); | ||||
eeprom_write_byte(EECONFIG_KEYCONF, 0); | |||||
eeprom_write_byte(EECONFIG_KEYMAP, 0); | |||||
eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0); | eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0); | ||||
} | } | ||||
bool eeconfig_is_enabled(void) | bool eeconfig_is_enabled(void) | ||||
{ | { | ||||
return EECONFIG_IS_ENABLED() && (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER); | |||||
return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER); | |||||
} | } | ||||
uint8_t eeconfig_read_debug(void) { return eeprom_read_byte(EECONFIG_DEBUG); } | uint8_t eeconfig_read_debug(void) { return eeprom_read_byte(EECONFIG_DEBUG); } | ||||
uint8_t eeconfig_read_defalt_layer(void) { return eeprom_read_byte(EECONFIG_DEFAULT_LAYER); } | uint8_t eeconfig_read_defalt_layer(void) { return eeprom_read_byte(EECONFIG_DEFAULT_LAYER); } | ||||
void eeconfig_write_defalt_layer(uint8_t val) { eeprom_write_byte(EECONFIG_DEFAULT_LAYER, val); } | void eeconfig_write_defalt_layer(uint8_t val) { eeprom_write_byte(EECONFIG_DEFAULT_LAYER, val); } | ||||
uint8_t eeconfig_read_keyconf(void) { return eeprom_read_byte(EECONFIG_KEYCONF); } | |||||
void eeconfig_write_keyconf(uint8_t val) { eeprom_write_byte(EECONFIG_KEYCONF, val); } | |||||
uint8_t eeconfig_read_keymap(void) { return eeprom_read_byte(EECONFIG_KEYMAP); } | |||||
void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val); } |
#include <stdint.h> | #include <stdint.h> | ||||
#ifndef EECONFIG_IS_ENABLED | |||||
#define EECONFIG_IS_ENABLED() true | |||||
#endif | |||||
#define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEED | |||||
#define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEED | |||||
/* eeprom parameteter address */ | /* eeprom parameteter address */ | ||||
#define EECONFIG_MAGIC (uint16_t *)0 | |||||
#define EECONFIG_DEBUG (uint8_t *)2 | |||||
#define EECONFIG_DEFAULT_LAYER (uint8_t *)3 | |||||
#define EECONFIG_KEYCONF (uint8_t *)4 | |||||
#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5 | |||||
#define EECONFIG_MAGIC (uint16_t *)0 | |||||
#define EECONFIG_DEBUG (uint8_t *)2 | |||||
#define EECONFIG_DEFAULT_LAYER (uint8_t *)3 | |||||
#define EECONFIG_KEYMAP (uint8_t *)4 | |||||
#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5 | |||||
/* debug bit */ | /* debug bit */ | ||||
#define EECONFIG_DEBUG_ENABLE (1<<0) | |||||
#define EECONFIG_DEBUG_MATRIX (1<<1) | |||||
#define EECONFIG_DEBUG_KEYBOARD (1<<2) | |||||
#define EECONFIG_DEBUG_MOUSE (1<<3) | |||||
#define EECONFIG_DEBUG_ENABLE (1<<0) | |||||
#define EECONFIG_DEBUG_MATRIX (1<<1) | |||||
#define EECONFIG_DEBUG_KEYBOARD (1<<2) | |||||
#define EECONFIG_DEBUG_MOUSE (1<<3) | |||||
/* keyconf bit */ | /* keyconf bit */ | ||||
#define EECONFIG_KEYCONF_SWAP_CONTROL_CAPSLOCK (1<<0) | |||||
#define EECONFIG_KEYCONF_CAPSLOCK_TO_CONTROL (1<<1) | |||||
#define EECONFIG_KEYCONF_SWAP_LALT_LGUI (1<<2) | |||||
#define EECONFIG_KEYCONF_SWAP_RALT_RGUI (1<<3) | |||||
#define EECONFIG_KEYCONF_NO_GUI (1<<4) | |||||
#define EECONFIG_KEYCONF_SWAP_GRAVE_ESC (1<<5) | |||||
#define EECONFIG_KEYCONF_SWAP_BACKSLASH_BACKSPACE (1<<6) | |||||
/* XXX: Not portable. Bit field order depends on implementation */ | |||||
typedef union { | |||||
uint8_t raw; | |||||
struct { | |||||
bool swap_control_capslock:1; | |||||
bool capslock_to_control:1; | |||||
bool swap_lalt_lgui:1; | |||||
bool swap_ralt_rgui:1; | |||||
bool no_gui:1; | |||||
bool swap_grave_esc:1; | |||||
bool swap_backslash_backspace:1; | |||||
bool reserved:1; | |||||
}; | |||||
} keyconf; | |||||
#define EECONFIG_KEYMAP_SWAP_CONTROL_CAPSLOCK (1<<0) | |||||
#define EECONFIG_KEYMAP_CAPSLOCK_TO_CONTROL (1<<1) | |||||
#define EECONFIG_KEYMAP_SWAP_LALT_LGUI (1<<2) | |||||
#define EECONFIG_KEYMAP_SWAP_RALT_RGUI (1<<3) | |||||
#define EECONFIG_KEYMAP_NO_GUI (1<<4) | |||||
#define EECONFIG_KEYMAP_SWAP_GRAVE_ESC (1<<5) | |||||
#define EECONFIG_KEYMAP_SWAP_BACKSLASH_BACKSPACE (1<<6) | |||||
bool eeconfig_is_enabled(void); | bool eeconfig_is_enabled(void); | ||||
uint8_t eeconfig_read_defalt_layer(void); | uint8_t eeconfig_read_defalt_layer(void); | ||||
void eeconfig_write_defalt_layer(uint8_t val); | void eeconfig_write_defalt_layer(uint8_t val); | ||||
uint8_t eeconfig_read_keyconf(void); | |||||
void eeconfig_write_keyconf(uint8_t val); | |||||
uint8_t eeconfig_read_keymap(void); | |||||
void eeconfig_write_keymap(uint8_t val); | |||||
#endif | #endif |
#ifdef BOOTMAGIC_ENABLE | #ifdef BOOTMAGIC_ENABLE | ||||
bootmagic(); | bootmagic(); | ||||
if (eeconfig_is_enabled()) { | |||||
uint8_t config; | |||||
config = eeconfig_read_debug(); | |||||
// ignored if debug is enabled by program before. | |||||
if (!debug_enable) debug_enable = (config & EECONFIG_DEBUG_ENABLE); | |||||
if (!debug_matrix) debug_matrix = (config & EECONFIG_DEBUG_MATRIX); | |||||
if (!debug_keyboard) debug_keyboard = (config & EECONFIG_DEBUG_KEYBOARD); | |||||
if (!debug_mouse) debug_mouse = (config & EECONFIG_DEBUG_MOUSE); | |||||
} else { | |||||
eeconfig_init(); | |||||
} | |||||
#endif | #endif | ||||
} | } | ||||
switch (keycode) { | switch (keycode) { | ||||
case KC_FN0 ... KC_FN31: | case KC_FN0 ... KC_FN31: | ||||
return keymap_fn_to_action(keycode); | return keymap_fn_to_action(keycode); | ||||
#ifdef BOOTMAGIC_ENABLE | |||||
case KC_CAPSLOCK: | |||||
if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { | |||||
return keycode_to_action(KC_LCTL); | |||||
} | |||||
return keycode_to_action(KC_CAPS); | |||||
case KC_LCTL: | |||||
if (keymap_config.swap_control_capslock) { | |||||
return keycode_to_action(KC_CAPSLOCK); | |||||
} | |||||
return keycode_to_action(KC_LCTL); | |||||
case KC_LALT: | |||||
if (keymap_config.swap_lalt_lgui) { | |||||
if (keymap_config.no_gui) { | |||||
return keycode_to_action(ACTION_NO); | |||||
} | |||||
return keycode_to_action(KC_LGUI); | |||||
} | |||||
return keycode_to_action(KC_LALT); | |||||
case KC_LGUI: | |||||
if (keymap_config.swap_lalt_lgui) { | |||||
return keycode_to_action(KC_LALT); | |||||
} | |||||
if (keymap_config.no_gui) { | |||||
return keycode_to_action(ACTION_NO); | |||||
} | |||||
return keycode_to_action(KC_LGUI); | |||||
case KC_RALT: | |||||
if (keymap_config.swap_ralt_rgui) { | |||||
if (keymap_config.no_gui) { | |||||
return keycode_to_action(ACTION_NO); | |||||
} | |||||
return keycode_to_action(KC_RGUI); | |||||
} | |||||
return keycode_to_action(KC_RALT); | |||||
case KC_RGUI: | |||||
if (keymap_config.swap_ralt_rgui) { | |||||
return keycode_to_action(KC_RALT); | |||||
} | |||||
if (keymap_config.no_gui) { | |||||
return keycode_to_action(ACTION_NO); | |||||
} | |||||
return keycode_to_action(KC_RGUI); | |||||
case KC_GRAVE: | |||||
if (keymap_config.swap_grave_esc) { | |||||
return keycode_to_action(KC_ESC); | |||||
} | |||||
return keycode_to_action(KC_GRAVE); | |||||
case KC_ESC: | |||||
if (keymap_config.swap_grave_esc) { | |||||
return keycode_to_action(KC_GRAVE); | |||||
} | |||||
return keycode_to_action(KC_ESC); | |||||
case KC_BSLASH: | |||||
if (keymap_config.swap_backslash_backspace) { | |||||
return keycode_to_action(KC_BSPACE); | |||||
} | |||||
return keycode_to_action(KC_BSLASH); | |||||
case KC_BSPACE: | |||||
if (keymap_config.swap_backslash_backspace) { | |||||
return keycode_to_action(KC_BSLASH); | |||||
} | |||||
return keycode_to_action(KC_BSPACE); | |||||
#endif | |||||
default: | default: | ||||
return keycode_to_action(keycode); | return keycode_to_action(keycode); | ||||
} | } |
#include "action.h" | #include "action.h" | ||||
#ifdef BOOTMAGIC_ENABLE | |||||
/* NOTE: Not portable. Bit field order depends on implementation */ | |||||
typedef union { | |||||
uint8_t raw; | |||||
struct { | |||||
bool swap_control_capslock:1; | |||||
bool capslock_to_control:1; | |||||
bool swap_lalt_lgui:1; | |||||
bool swap_ralt_rgui:1; | |||||
bool no_gui:1; | |||||
bool swap_grave_esc:1; | |||||
bool swap_backslash_backspace:1; | |||||
bool reserved:1; | |||||
}; | |||||
} keymap_config_t; | |||||
keymap_config_t keymap_config; | |||||
#endif | |||||
/* translates key to keycode */ | /* translates key to keycode */ | ||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key); | uint8_t keymap_key_to_keycode(uint8_t layer, key_t key); | ||||