From 1cc716477beb8a9b1f999e9c79bbd103755d6e1a Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 26 Nov 2023 22:10:34 +0900 Subject: [PATCH] core: Fix bootmagic - EEPROM_CLEAR wipes out eeprom with 0xFF now(avr) - keymap config is not enabled during bootmagic - wait until all key is released after bootmagic - add eeconfig_debug() to command.c --- tmk_core/common/avr/eeconfig.c | 18 ++++++++++++++- tmk_core/common/bootmagic.c | 41 ++++++++++++++++++++++++---------- tmk_core/common/command.c | 4 ++++ tmk_core/common/eeconfig.h | 2 ++ 4 files changed, 52 insertions(+), 13 deletions(-) diff --git a/tmk_core/common/avr/eeconfig.c b/tmk_core/common/avr/eeconfig.c index 726b055e..47c25746 100644 --- a/tmk_core/common/avr/eeconfig.c +++ b/tmk_core/common/avr/eeconfig.c @@ -3,6 +3,7 @@ #include #include "eeconfig.h" #include "keymap.h" +#include "print.h" void eeconfig_init(void) { @@ -27,7 +28,12 @@ void eeconfig_enable(void) void eeconfig_disable(void) { - eeprom_write_word(EECONFIG_MAGIC, 0xFFFF); + eeprom_write_word(EECONFIG_MAGIC, 0xFFFF); + eeprom_write_byte(EECONFIG_DEBUG, 0xFF); + eeprom_write_byte(EECONFIG_DEFAULT_LAYER, 0xFF); + eeprom_write_byte(EECONFIG_KEYMAP, 0xFF); + eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0xFF); + eeprom_write_byte(EECONFIG_BACKLIGHT, 0xFF); } bool eeconfig_is_enabled(void) @@ -48,3 +54,13 @@ void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); } void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); } #endif + +void eeconfig_debug(void) +{ + xprintf("eeprom:"); + for (int i = 0; i < 16 /* E2END + 1 */; i++) { + if ((i % 16) == 0) { xprintf("\n%04X: ", i); } + xprintf("%02X ", eeprom_read_byte((uint8_t *)i)); + } + xprintf("\n"); +} diff --git a/tmk_core/common/bootmagic.c b/tmk_core/common/bootmagic.c index 220eb14f..1dacea32 100644 --- a/tmk_core/common/bootmagic.c +++ b/tmk_core/common/bootmagic.c @@ -34,7 +34,7 @@ void bootmagic(void) /* eeconfig clear */ if (bootmagic_scan_key(BOOTMAGIC_KEY_EEPROM_CLEAR)) { - eeconfig_init(); + eeconfig_disable(); } /* bootloader */ @@ -45,6 +45,10 @@ void bootmagic(void) /* user-defined checks */ hook_bootmagic(); + if (!eeconfig_is_enabled()) { + goto WAIT; + } + /* debug enable */ debug_config.raw = eeconfig_read_debug(); if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_ENABLE)) { @@ -61,35 +65,36 @@ void bootmagic(void) eeconfig_write_debug(debug_config.raw); /* keymap config */ - keymap_config.raw = eeconfig_read_keymap(); + keymap_config_t kc; + kc.raw = eeconfig_read_keymap(); if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK)) { - keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock; + kc.swap_control_capslock = !kc.swap_control_capslock; } if (bootmagic_scan_key(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) { - keymap_config.capslock_to_control = !keymap_config.capslock_to_control; + kc.capslock_to_control = !kc.capslock_to_control; } if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) { - keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; + kc.swap_lalt_lgui = !kc.swap_lalt_lgui; } if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) { - keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui; + kc.swap_ralt_rgui = !kc.swap_ralt_rgui; } if (bootmagic_scan_key(BOOTMAGIC_KEY_NO_GUI)) { - keymap_config.no_gui = !keymap_config.no_gui; + kc.no_gui = !kc.no_gui; } if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) { - keymap_config.swap_grave_esc = !keymap_config.swap_grave_esc; + kc.swap_grave_esc = !kc.swap_grave_esc; } if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) { - keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace; + kc.swap_backslash_backspace = !kc.swap_backslash_backspace; } if (bootmagic_scan_key(BOOTMAGIC_HOST_NKRO)) { - keymap_config.nkro = !keymap_config.nkro; + kc.nkro = !kc.nkro; } - eeconfig_write_keymap(keymap_config.raw); + eeconfig_write_keymap(kc.raw); #if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE) - keyboard_nkro = keymap_config.nkro; + keyboard_nkro = kc.nkro; #endif /* default layer */ @@ -109,6 +114,18 @@ void bootmagic(void) default_layer = eeconfig_read_default_layer(); default_layer_set((uint32_t)default_layer); } + + keymap_config = kc; + + // wait until all key is released +WAIT: + matrix_scan(); + for (uint8_t r = 0; r < MATRIX_ROWS; r++) { + if (matrix_get_row(r)) { + goto WAIT; + wait_ms(10); + } + } } static bool scan_key(uint16_t code) diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index 74255736..b93c8248 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -145,6 +145,8 @@ static void command_common_help(void) } #ifdef BOOTMAGIC_ENABLE +__attribute__ ((weak)) void eeconfig_debug(void) {} + static void print_eeconfig(void) { print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n"); @@ -176,6 +178,8 @@ static void print_eeconfig(void) print(".enable: "); print_dec(bc.enable); print("\n"); print(".level: "); print_dec(bc.level); print("\n"); #endif + + eeconfig_debug(); } #endif diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index 3cd1a174..5fd2bb0a 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -72,4 +72,6 @@ uint8_t eeconfig_read_backlight(void); void eeconfig_write_backlight(uint8_t val); #endif +void eeconfig_debug(void); + #endif