[Core] Add Reboot keycode to core (#15990)
parent
425c54cf8c
commit
787a68948f
|
@ -225,6 +225,7 @@ See also: [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes)
|
||||||
|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
|
|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
|
||||||
|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory) |
|
|`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_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
|
## Audio Keys :id=audio-keys
|
||||||
|
|
||||||
|
|
|
@ -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_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
|
||||||
|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory) |
|
|`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_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 |
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
LAYOUT_ortho_1x1(QK_REBOOT)
|
||||||
|
};
|
|
@ -63,3 +63,7 @@ void bootloader_jump(void) {
|
||||||
while (1)
|
while (1)
|
||||||
; // Wait on timeout
|
; // Wait on timeout
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
|
|
|
@ -31,3 +31,10 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
for (;;)
|
for (;;)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
// watchdog reset
|
||||||
|
wdt_enable(WDTO_250MS);
|
||||||
|
for (;;)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
|
@ -37,3 +37,12 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
while (1) {
|
while (1) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
// setup watchdog timeout
|
||||||
|
wdt_enable(WDTO_60MS);
|
||||||
|
|
||||||
|
// wait for watchdog timer to trigger
|
||||||
|
while (1) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -15,5 +15,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
__attribute__((weak)) void bootloader_jump(void) {}
|
__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) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -34,8 +34,15 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
UCSR1B = 0;
|
UCSR1B = 0;
|
||||||
_delay_ms(5); // 5 seems to work fine
|
_delay_ms(5); // 5 seems to work fine
|
||||||
|
|
||||||
// watchdog reset
|
|
||||||
reset_key = BOOTLOADER_RESET_KEY;
|
reset_key = BOOTLOADER_RESET_KEY;
|
||||||
|
// watchdog reset
|
||||||
|
wdt_enable(WDTO_250MS);
|
||||||
|
for (;;)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
// watchdog reset
|
||||||
wdt_enable(WDTO_250MS);
|
wdt_enable(WDTO_250MS);
|
||||||
for (;;)
|
for (;;)
|
||||||
;
|
;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
|
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
|
|
||||||
__attribute__((weak)) void bootloader_jump(void) {
|
__attribute__((weak)) void bootloader_jump(void) {
|
||||||
|
@ -126,3 +127,12 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
asm volatile("jmp 0x1FC00");
|
asm volatile("jmp 0x1FC00");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
// setup watchdog timeout
|
||||||
|
wdt_enable(WDTO_60MS);
|
||||||
|
|
||||||
|
// wait for watchdog timer to trigger
|
||||||
|
while (1) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -54,3 +54,12 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
#endif
|
#endif
|
||||||
[bootaddrme] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff), [bootaddrlo] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff));
|
[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) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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 */
|
/* give code for your bootloader to come up if needed */
|
||||||
void bootloader_jump(void);
|
void bootloader_jump(void);
|
||||||
|
void mcu_reset(void);
|
||||||
|
|
|
@ -16,9 +16,6 @@
|
||||||
|
|
||||||
#include <hal.h>
|
#include <hal.h>
|
||||||
|
|
||||||
// Value to place in RTC backup register 10 for persistent bootloader mode
|
|
||||||
#define RTC_BOOTLOADER_FLAG 0x424C
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief PAL setup.
|
* @brief PAL setup.
|
||||||
* @details Digital I/O ports static configuration as defined in @p board.h.
|
* @details Digital I/O ports static configuration as defined in @p board.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
|
|
@ -17,5 +17,6 @@
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
|
|
||||||
__attribute__((weak)) void bootloader_jump(void) {}
|
__attribute__((weak)) void bootloader_jump(void) {}
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {}
|
||||||
|
|
||||||
__attribute__((weak)) void enter_bootloader_mode_if_requested(void) {}
|
__attribute__((weak)) void enter_bootloader_mode_if_requested(void) {}
|
||||||
|
|
|
@ -36,5 +36,12 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
*DBGMCU_CMD = DBGMCU_CMD_RESET;
|
*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. */
|
/* Jumping to bootloader is not possible from user code. */
|
||||||
void enter_bootloader_mode_if_requested(void) {}
|
void enter_bootloader_mode_if_requested(void) {}
|
||||||
|
|
|
@ -23,3 +23,5 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
wait_ms(100);
|
wait_ms(100);
|
||||||
__BKPT(0);
|
__BKPT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {}
|
||||||
|
|
|
@ -30,3 +30,4 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
// request reset
|
// request reset
|
||||||
SCB->AIRCR = SCB_AIRCR_VECTKEY_WRITEMAGIC | SCB_AIRCR_SYSRESETREQ_Msk;
|
SCB->AIRCR = SCB_AIRCR_VECTKEY_WRITEMAGIC | SCB_AIRCR_SYSRESETREQ_Msk;
|
||||||
}
|
}
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {}
|
||||||
|
|
|
@ -61,6 +61,9 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
NVIC_SystemReset();
|
NVIC_SystemReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
// not needed at all, but if anybody attempts to invoke it....
|
// not needed at all, but if anybody attempts to invoke it....
|
||||||
void enter_bootloader_mode_if_requested(void) {}
|
void enter_bootloader_mode_if_requested(void) {}
|
||||||
|
|
||||||
|
@ -76,6 +79,10 @@ __attribute__((weak)) void bootloader_jump(void) {
|
||||||
NVIC_SystemReset();
|
NVIC_SystemReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
|
|
||||||
void enter_bootloader_mode_if_requested(void) {
|
void enter_bootloader_mode_if_requested(void) {
|
||||||
unsigned long *check = MAGIC_ADDR;
|
unsigned long *check = MAGIC_ADDR;
|
||||||
if (*check == BOOTLOADER_MAGIC) {
|
if (*check == BOOTLOADER_MAGIC) {
|
||||||
|
|
|
@ -21,3 +21,8 @@
|
||||||
__attribute__((weak)) void bootloader_jump(void) {
|
__attribute__((weak)) void bootloader_jump(void) {
|
||||||
NVIC_SystemReset();
|
NVIC_SystemReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
BKP->DR10 = RTC_BOOTLOADER_JUST_UPLOADED;
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
|
@ -25,6 +25,10 @@
|
||||||
extern uint32_t _board_dfu_dbl_tap[];
|
extern uint32_t _board_dfu_dbl_tap[];
|
||||||
#define DBL_TAP_REG _board_dfu_dbl_tap[0]
|
#define DBL_TAP_REG _board_dfu_dbl_tap[0]
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
|
|
||||||
__attribute__((weak)) void bootloader_jump(void) {
|
__attribute__((weak)) void bootloader_jump(void) {
|
||||||
DBL_TAP_REG = DBL_TAP_MAGIC;
|
DBL_TAP_REG = DBL_TAP_MAGIC;
|
||||||
NVIC_SystemReset();
|
NVIC_SystemReset();
|
||||||
|
|
|
@ -47,3 +47,7 @@ void enter_bootloader_mode_if_requested(void) {
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((weak)) void mcu_reset(void) {
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
|
|
|
@ -17,3 +17,4 @@
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
|
|
||||||
void bootloader_jump(void) {}
|
void bootloader_jump(void) {}
|
||||||
|
void mcu_reset(void) {}
|
||||||
|
|
|
@ -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) {}
|
__attribute__((weak)) void post_process_record_user(uint16_t keycode, keyrecord_t *record) {}
|
||||||
|
|
||||||
void reset_keyboard(void) {
|
void shutdown_quantum(void) {
|
||||||
clear_keyboard();
|
clear_keyboard();
|
||||||
#if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
|
#if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
|
||||||
process_midi_all_notes_off();
|
process_midi_all_notes_off();
|
||||||
|
@ -143,9 +143,18 @@ void reset_keyboard(void) {
|
||||||
#ifdef HAPTIC_ENABLE
|
#ifdef HAPTIC_ENABLE
|
||||||
haptic_shutdown();
|
haptic_shutdown();
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset_keyboard(void) {
|
||||||
|
shutdown_quantum();
|
||||||
bootloader_jump();
|
bootloader_jump();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void soft_reset_keyboard(void) {
|
||||||
|
shutdown_quantum();
|
||||||
|
mcu_reset();
|
||||||
|
}
|
||||||
|
|
||||||
/* Convert record into usable keycode via the contained event. */
|
/* Convert record into usable keycode via the contained event. */
|
||||||
uint16_t get_record_keycode(keyrecord_t *record, bool update_layer_cache) {
|
uint16_t get_record_keycode(keyrecord_t *record, bool update_layer_cache) {
|
||||||
#ifdef COMBO_ENABLE
|
#ifdef COMBO_ENABLE
|
||||||
|
@ -326,6 +335,9 @@ bool process_record_quantum(keyrecord_t *record) {
|
||||||
case QK_BOOTLOADER:
|
case QK_BOOTLOADER:
|
||||||
reset_keyboard();
|
reset_keyboard();
|
||||||
return false;
|
return false;
|
||||||
|
case QK_REBOOT:
|
||||||
|
soft_reset_keyboard();
|
||||||
|
return false;
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_DEBUG
|
#ifndef NO_DEBUG
|
||||||
case QK_DEBUG_TOGGLE:
|
case QK_DEBUG_TOGGLE:
|
||||||
|
@ -339,6 +351,9 @@ bool process_record_quantum(keyrecord_t *record) {
|
||||||
return false;
|
return false;
|
||||||
case QK_CLEAR_EEPROM:
|
case QK_CLEAR_EEPROM:
|
||||||
eeconfig_init();
|
eeconfig_init();
|
||||||
|
#ifndef NO_RESET
|
||||||
|
soft_reset_keyboard();
|
||||||
|
#endif
|
||||||
return false;
|
return false;
|
||||||
#ifdef VELOCIKEY_ENABLE
|
#ifdef VELOCIKEY_ENABLE
|
||||||
case VLK_TOG:
|
case VLK_TOG:
|
||||||
|
|
|
@ -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 post_process_record_user(uint16_t keycode, keyrecord_t *record);
|
||||||
|
|
||||||
void reset_keyboard(void);
|
void reset_keyboard(void);
|
||||||
|
void soft_reset_keyboard(void);
|
||||||
|
|
||||||
void startup_user(void);
|
void startup_user(void);
|
||||||
void shutdown_user(void);
|
void shutdown_user(void);
|
||||||
|
|
|
@ -596,6 +596,7 @@ enum quantum_keycodes {
|
||||||
MAGIC_TOGGLE_CONTROL_CAPSLOCK,
|
MAGIC_TOGGLE_CONTROL_CAPSLOCK,
|
||||||
|
|
||||||
QK_MAKE,
|
QK_MAKE,
|
||||||
|
QK_REBOOT,
|
||||||
|
|
||||||
SECURE_LOCK,
|
SECURE_LOCK,
|
||||||
SECURE_UNLOCK,
|
SECURE_UNLOCK,
|
||||||
|
@ -717,6 +718,7 @@ enum quantum_keycodes {
|
||||||
#define QK_BOOT QK_BOOTLOADER
|
#define QK_BOOT QK_BOOTLOADER
|
||||||
#define DB_TOGG QK_DEBUG_TOGGLE
|
#define DB_TOGG QK_DEBUG_TOGGLE
|
||||||
#define EE_CLR QK_CLEAR_EEPROM
|
#define EE_CLR QK_CLEAR_EEPROM
|
||||||
|
#define QK_RBT QK_REBOOT
|
||||||
|
|
||||||
// Audio Clicky aliases
|
// Audio Clicky aliases
|
||||||
#define CK_TOGG CLICKY_TOGGLE
|
#define CK_TOGG CLICKY_TOGGLE
|
||||||
|
|
Loading…
Reference in New Issue