Переглянути джерело

[Core] Add Reboot keycode to core (#15990)

Drashna Jaelre 3 роки тому
батько
коміт
787a68948f

+ 1 - 0
docs/keycodes.md

@@ -225,6 +225,7 @@ See also: [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes)
 |`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode                                                                |
 |`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory)                          |
 |`QK_MAKE`        |         |Sends `qmk compile -kb (keyboard) -km (keymap)`, or `qmk flash` if shift is held |
+|`QK_REBOOT`      |`QK_RBT` |Resets the keyboard. Does not load the bootloader                                |
 
 ## Audio Keys :id=audio-keys
 

+ 1 - 0
docs/quantum_keycodes.md

@@ -14,3 +14,4 @@ On this page we have documented keycodes between `0x00FF` and `0xFFFF` which are
 |`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode                                                                |
 |`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory)                          |
 |`QK_MAKE`        |         |Sends `qmk compile -kb (keyboard) -km (keymap)`, or `qmk flash` if shift is held |
+|`QK_REBOOT`      |`QK_RBT` |Resets the keyboard. Does not load the bootloader                                |

+ 5 - 0
keyboards/handwired/onekey/keymaps/reboot/keymap.c

@@ -0,0 +1,5 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    LAYOUT_ortho_1x1(QK_REBOOT)
+};

+ 4 - 0
platforms/arm_atsam/bootloaders/md_boot.c

@@ -63,3 +63,7 @@ void bootloader_jump(void) {
     while (1)
         ; // Wait on timeout
 }
+
+__attribute__((weak)) void mcu_reset(void) {
+    NVIC_SystemReset();
+}

+ 7 - 0
platforms/avr/bootloaders/bootloadhid.c

@@ -31,3 +31,10 @@ __attribute__((weak)) void bootloader_jump(void) {
     for (;;)
         ;
 }
+
+__attribute__((weak)) void mcu_reset(void) {
+    // watchdog reset
+    wdt_enable(WDTO_250MS);
+    for (;;)
+        ;
+}

+ 9 - 0
platforms/avr/bootloaders/caterina.c

@@ -37,3 +37,12 @@ __attribute__((weak)) void bootloader_jump(void) {
     while (1) {
     }
 }
+
+__attribute__((weak)) void mcu_reset(void) {
+    // setup watchdog timeout
+    wdt_enable(WDTO_60MS);
+
+    // wait for watchdog timer to trigger
+    while (1) {
+    }
+}

+ 9 - 0
platforms/avr/bootloaders/custom.c

@@ -15,5 +15,14 @@
  */
 
 #include "bootloader.h"
+#include <avr/wdt.h>
 
 __attribute__((weak)) void bootloader_jump(void) {}
+__attribute__((weak)) void mcu_reset(void) {
+    // setup watchdog timeout
+    wdt_enable(WDTO_60MS);
+
+    // wait for watchdog timer to trigger
+    while (1) {
+    }
+}

+ 8 - 1
platforms/avr/bootloaders/dfu.c

@@ -34,8 +34,15 @@ __attribute__((weak)) void bootloader_jump(void) {
     UCSR1B = 0;
     _delay_ms(5); // 5 seems to work fine
 
-    // watchdog reset
     reset_key = BOOTLOADER_RESET_KEY;
+    // watchdog reset
+    wdt_enable(WDTO_250MS);
+    for (;;)
+        ;
+}
+
+__attribute__((weak)) void mcu_reset(void) {
+    // watchdog reset
     wdt_enable(WDTO_250MS);
     for (;;)
         ;

+ 10 - 0
platforms/avr/bootloaders/halfkay.c

@@ -17,6 +17,7 @@
 #include "bootloader.h"
 
 #include <avr/interrupt.h>
+#include <avr/wdt.h>
 #include <util/delay.h>
 
 __attribute__((weak)) void bootloader_jump(void) {
@@ -126,3 +127,12 @@ __attribute__((weak)) void bootloader_jump(void) {
     asm volatile("jmp 0x1FC00");
 #endif
 }
+
+__attribute__((weak)) void mcu_reset(void) {
+    // setup watchdog timeout
+    wdt_enable(WDTO_60MS);
+
+    // wait for watchdog timer to trigger
+    while (1) {
+    }
+}

+ 9 - 0
platforms/avr/bootloaders/usbasploader.c

@@ -54,3 +54,12 @@ __attribute__((weak)) void bootloader_jump(void) {
 #endif
                    [bootaddrme] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff), [bootaddrlo] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff));
 }
+
+__attribute__((weak)) void mcu_reset(void) {
+    // setup watchdog timeout
+    wdt_enable(WDTO_15MS);
+
+    // wait for watchdog timer to trigger
+    while (1) {
+    }
+}

+ 1 - 0
platforms/bootloader.h

@@ -19,3 +19,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* give code for your bootloader to come up if needed */
 void bootloader_jump(void);
+void mcu_reset(void);

+ 0 - 3
platforms/chibios/boards/STM32_F103_STM32DUINO/board/board.c

@@ -16,9 +16,6 @@
 
 #include <hal.h>
 
-// Value to place in RTC backup register 10 for persistent bootloader mode
-#define RTC_BOOTLOADER_FLAG 0x424C
-
 /**
  * @brief   PAL setup.
  * @details Digital I/O ports static configuration as defined in @p board.h.

+ 9 - 0
platforms/chibios/boards/STM32_F103_STM32DUINO/configs/config.h

@@ -0,0 +1,9 @@
+// Copyright 2022 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+// Value to place in RTC backup register 10 for persistent bootloader mode
+#define RTC_BOOTLOADER_FLAG 0x424C
+
+// Value to place in RTC backup register 10 for instant reboot mode
+#define RTC_BOOTLOADER_JUST_UPLOADED 0x424D

+ 1 - 0
platforms/chibios/bootloaders/custom.c

@@ -17,5 +17,6 @@
 #include "bootloader.h"
 
 __attribute__((weak)) void bootloader_jump(void) {}
+__attribute__((weak)) void mcu_reset(void) {}
 
 __attribute__((weak)) void enter_bootloader_mode_if_requested(void) {}

+ 7 - 0
platforms/chibios/bootloaders/gd32v_dfu.c

@@ -36,5 +36,12 @@ __attribute__((weak)) void bootloader_jump(void) {
     *DBGMCU_CMD = DBGMCU_CMD_RESET;
 }
 
+__attribute__((weak)) void mcu_reset(void) {
+    // Confirmed by karlk90, there is no actual reset to bootloader.
+    // This just resets the controller.
+    *DBGMCU_KEY = DBGMCU_KEY_UNLOCK;
+    *DBGMCU_CMD = DBGMCU_CMD_RESET;
+}
+
 /* Jumping to bootloader is not possible from user code. */
 void enter_bootloader_mode_if_requested(void) {}

+ 2 - 0
platforms/chibios/bootloaders/halfkay.c

@@ -23,3 +23,5 @@ __attribute__((weak)) void bootloader_jump(void) {
     wait_ms(100);
     __BKPT(0);
 }
+
+__attribute__((weak)) void mcu_reset(void) {}

+ 1 - 0
platforms/chibios/bootloaders/kiibohd.c

@@ -30,3 +30,4 @@ __attribute__((weak)) void bootloader_jump(void) {
     // request reset
     SCB->AIRCR = SCB_AIRCR_VECTKEY_WRITEMAGIC | SCB_AIRCR_SYSRESETREQ_Msk;
 }
+__attribute__((weak)) void mcu_reset(void) {}

+ 7 - 0
platforms/chibios/bootloaders/stm32_dfu.c

@@ -61,6 +61,9 @@ __attribute__((weak)) void bootloader_jump(void) {
     NVIC_SystemReset();
 }
 
+__attribute__((weak)) void mcu_reset(void) {
+    NVIC_SystemReset();
+}
 // not needed at all, but if anybody attempts to invoke it....
 void enter_bootloader_mode_if_requested(void) {}
 
@@ -76,6 +79,10 @@ __attribute__((weak)) void bootloader_jump(void) {
     NVIC_SystemReset();
 }
 
+__attribute__((weak)) void mcu_reset(void) {
+    NVIC_SystemReset();
+}
+
 void enter_bootloader_mode_if_requested(void) {
     unsigned long *check = MAGIC_ADDR;
     if (*check == BOOTLOADER_MAGIC) {

+ 5 - 0
platforms/chibios/bootloaders/stm32duino.c

@@ -21,3 +21,8 @@
 __attribute__((weak)) void bootloader_jump(void) {
     NVIC_SystemReset();
 }
+
+__attribute__((weak)) void mcu_reset(void) {
+    BKP->DR10 = RTC_BOOTLOADER_JUST_UPLOADED;
+    NVIC_SystemReset();
+}

+ 4 - 0
platforms/chibios/bootloaders/tinyuf2.c

@@ -25,6 +25,10 @@
 extern uint32_t _board_dfu_dbl_tap[];
 #define DBL_TAP_REG _board_dfu_dbl_tap[0]
 
+__attribute__((weak)) void mcu_reset(void) {
+    NVIC_SystemReset();
+}
+
 __attribute__((weak)) void bootloader_jump(void) {
     DBL_TAP_REG = DBL_TAP_MAGIC;
     NVIC_SystemReset();

+ 4 - 0
platforms/chibios/bootloaders/wb32_dfu.c

@@ -47,3 +47,7 @@ void enter_bootloader_mode_if_requested(void) {
             ;
     }
 }
+
+__attribute__((weak)) void mcu_reset(void) {
+    NVIC_SystemReset();
+}

+ 1 - 0
platforms/test/bootloaders/none.c

@@ -17,3 +17,4 @@
 #include "bootloader.h"
 
 void bootloader_jump(void) {}
+void mcu_reset(void) {}

+ 16 - 1
quantum/quantum.c

@@ -121,7 +121,7 @@ __attribute__((weak)) void post_process_record_kb(uint16_t keycode, keyrecord_t
 
 __attribute__((weak)) void post_process_record_user(uint16_t keycode, keyrecord_t *record) {}
 
-void reset_keyboard(void) {
+void shutdown_quantum(void) {
     clear_keyboard();
 #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
     process_midi_all_notes_off();
@@ -143,9 +143,18 @@ void reset_keyboard(void) {
 #ifdef HAPTIC_ENABLE
     haptic_shutdown();
 #endif
+}
+
+void reset_keyboard(void) {
+    shutdown_quantum();
     bootloader_jump();
 }
 
+void soft_reset_keyboard(void) {
+    shutdown_quantum();
+    mcu_reset();
+}
+
 /* Convert record into usable keycode via the contained event. */
 uint16_t get_record_keycode(keyrecord_t *record, bool update_layer_cache) {
 #ifdef COMBO_ENABLE
@@ -326,6 +335,9 @@ bool process_record_quantum(keyrecord_t *record) {
             case QK_BOOTLOADER:
                 reset_keyboard();
                 return false;
+            case QK_REBOOT:
+                soft_reset_keyboard();
+                return false;
 #endif
 #ifndef NO_DEBUG
             case QK_DEBUG_TOGGLE:
@@ -339,6 +351,9 @@ bool process_record_quantum(keyrecord_t *record) {
                 return false;
             case QK_CLEAR_EEPROM:
                 eeconfig_init();
+#ifndef NO_RESET
+                soft_reset_keyboard();
+#endif
                 return false;
 #ifdef VELOCIKEY_ENABLE
             case VLK_TOG:

+ 1 - 0
quantum/quantum.h

@@ -254,6 +254,7 @@ void     post_process_record_kb(uint16_t keycode, keyrecord_t *record);
 void     post_process_record_user(uint16_t keycode, keyrecord_t *record);
 
 void reset_keyboard(void);
+void soft_reset_keyboard(void);
 
 void startup_user(void);
 void shutdown_user(void);

+ 2 - 0
quantum/quantum_keycodes.h

@@ -596,6 +596,7 @@ enum quantum_keycodes {
     MAGIC_TOGGLE_CONTROL_CAPSLOCK,
 
     QK_MAKE,
+    QK_REBOOT,
 
     SECURE_LOCK,
     SECURE_UNLOCK,
@@ -717,6 +718,7 @@ enum quantum_keycodes {
 #define QK_BOOT QK_BOOTLOADER
 #define DB_TOGG QK_DEBUG_TOGGLE
 #define EE_CLR QK_CLEAR_EEPROM
+#define QK_RBT QK_REBOOT
 
 // Audio Clicky aliases
 #define CK_TOGG CLICKY_TOGGLE