Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Core] Add Reboot keycode to core #15990

Merged
merged 20 commits into from
May 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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) {
drashna marked this conversation as resolved.
Show resolved Hide resolved
// 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