mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 21:32:31 +01:00 
			
		
		
		
	[Core] Add Reboot keycode to core (#15990)
This commit is contained in:
		
							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                                | | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								keyboards/handwired/onekey/keymaps/reboot/keymap.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								keyboards/handwired/onekey/keymaps/reboot/keymap.c
									
									
									
									
									
										Normal file
									
								
							| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Drashna Jaelre
						Drashna Jaelre