Skip to content

Commit

Permalink
[Core] Add Reboot keycode to core (#15990)
Browse files Browse the repository at this point in the history
  • Loading branch information
drashna committed May 14, 2022
1 parent 425c54c commit 787a689
Show file tree
Hide file tree
Showing 25 changed files with 124 additions and 5 deletions.
1 change: 1 addition & 0 deletions docs/keycodes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions docs/quantum_keycodes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 5 additions & 0 deletions keyboards/handwired/onekey/keymaps/reboot/keymap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_ortho_1x1(QK_REBOOT)
};
4 changes: 4 additions & 0 deletions platforms/arm_atsam/bootloaders/md_boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,7 @@ void bootloader_jump(void) {
while (1)
; // Wait on timeout
}

__attribute__((weak)) void mcu_reset(void) {
NVIC_SystemReset();
}
7 changes: 7 additions & 0 deletions platforms/avr/bootloaders/bootloadhid.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 9 additions & 0 deletions platforms/avr/bootloaders/caterina.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 9 additions & 0 deletions platforms/avr/bootloaders/custom.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
}
}
9 changes: 8 additions & 1 deletion platforms/avr/bootloaders/dfu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 (;;)
;
Expand Down
10 changes: 10 additions & 0 deletions platforms/avr/bootloaders/halfkay.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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 changes: 9 additions & 0 deletions platforms/avr/bootloaders/usbasploader.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 change: 1 addition & 0 deletions platforms/bootloader.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
3 changes: 0 additions & 3 deletions platforms/chibios/boards/STM32_F103_STM32DUINO/board/board.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions platforms/chibios/bootloaders/custom.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 7 additions & 0 deletions platforms/chibios/bootloaders/gd32v_dfu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 2 additions & 0 deletions platforms/chibios/bootloaders/halfkay.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ __attribute__((weak)) void bootloader_jump(void) {
wait_ms(100);
__BKPT(0);
}

__attribute__((weak)) void mcu_reset(void) {}
1 change: 1 addition & 0 deletions platforms/chibios/bootloaders/kiibohd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 7 additions & 0 deletions platforms/chibios/bootloaders/stm32_dfu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {}

Expand All @@ -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) {
Expand Down
5 changes: 5 additions & 0 deletions platforms/chibios/bootloaders/stm32duino.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 4 additions & 0 deletions platforms/chibios/bootloaders/tinyuf2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
4 changes: 4 additions & 0 deletions platforms/chibios/bootloaders/wb32_dfu.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,7 @@ void enter_bootloader_mode_if_requested(void) {
;
}
}

__attribute__((weak)) void mcu_reset(void) {
NVIC_SystemReset();
}
1 change: 1 addition & 0 deletions platforms/test/bootloaders/none.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@
#include "bootloader.h"

void bootloader_jump(void) {}
void mcu_reset(void) {}
17 changes: 16 additions & 1 deletion quantum/quantum.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand Down
1 change: 1 addition & 0 deletions quantum/quantum.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions quantum/quantum_keycodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,7 @@ enum quantum_keycodes {
MAGIC_TOGGLE_CONTROL_CAPSLOCK,

QK_MAKE,
QK_REBOOT,

SECURE_LOCK,
SECURE_UNLOCK,
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 787a689

Please sign in to comment.