~ruther/qmk_firmware

787a68948fa0d5e251e22a623071082c8c0561b1 — Drashna Jaelre 3 years ago 425c54c
[Core] Add Reboot keycode to core (#15990)

M docs/keycodes.md => docs/keycodes.md +1 -0
@@ 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


M docs/quantum_keycodes.md => docs/quantum_keycodes.md +1 -0
@@ 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                                |

A keyboards/handwired/onekey/keymaps/reboot/keymap.c => keyboards/handwired/onekey/keymaps/reboot/keymap.c +5 -0
@@ 0,0 1,5 @@
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    LAYOUT_ortho_1x1(QK_REBOOT)
};

M platforms/arm_atsam/bootloaders/md_boot.c => platforms/arm_atsam/bootloaders/md_boot.c +4 -0
@@ 63,3 63,7 @@ void bootloader_jump(void) {
    while (1)
        ; // Wait on timeout
}

__attribute__((weak)) void mcu_reset(void) {
    NVIC_SystemReset();
}

M platforms/avr/bootloaders/bootloadhid.c => platforms/avr/bootloaders/bootloadhid.c +7 -0
@@ 31,3 31,10 @@ __attribute__((weak)) void bootloader_jump(void) {
    for (;;)
        ;
}

__attribute__((weak)) void mcu_reset(void) {
    // watchdog reset
    wdt_enable(WDTO_250MS);
    for (;;)
        ;
}

M platforms/avr/bootloaders/caterina.c => platforms/avr/bootloaders/caterina.c +9 -0
@@ 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) {
    }
}

M platforms/avr/bootloaders/custom.c => platforms/avr/bootloaders/custom.c +9 -0
@@ 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) {
    }
}

M platforms/avr/bootloaders/dfu.c => platforms/avr/bootloaders/dfu.c +8 -1
@@ 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 (;;)
        ;

M platforms/avr/bootloaders/halfkay.c => platforms/avr/bootloaders/halfkay.c +10 -0
@@ 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) {
    }
}

M platforms/avr/bootloaders/usbasploader.c => platforms/avr/bootloaders/usbasploader.c +9 -0
@@ 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) {
    }
}

M platforms/bootloader.h => platforms/bootloader.h +1 -0
@@ 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);

M platforms/chibios/boards/STM32_F103_STM32DUINO/board/board.c => platforms/chibios/boards/STM32_F103_STM32DUINO/board/board.c +0 -3
@@ 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.

A platforms/chibios/boards/STM32_F103_STM32DUINO/configs/config.h => platforms/chibios/boards/STM32_F103_STM32DUINO/configs/config.h +9 -0
@@ 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

M platforms/chibios/bootloaders/custom.c => platforms/chibios/bootloaders/custom.c +1 -0
@@ 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) {}

M platforms/chibios/bootloaders/gd32v_dfu.c => platforms/chibios/bootloaders/gd32v_dfu.c +7 -0
@@ 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) {}

M platforms/chibios/bootloaders/halfkay.c => platforms/chibios/bootloaders/halfkay.c +2 -0
@@ 23,3 23,5 @@ __attribute__((weak)) void bootloader_jump(void) {
    wait_ms(100);
    __BKPT(0);
}

__attribute__((weak)) void mcu_reset(void) {}

M platforms/chibios/bootloaders/kiibohd.c => platforms/chibios/bootloaders/kiibohd.c +1 -0
@@ 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) {}

M platforms/chibios/bootloaders/stm32_dfu.c => platforms/chibios/bootloaders/stm32_dfu.c +7 -0
@@ 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) {

M platforms/chibios/bootloaders/stm32duino.c => platforms/chibios/bootloaders/stm32duino.c +5 -0
@@ 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();
}
\ No newline at end of file

M platforms/chibios/bootloaders/tinyuf2.c => platforms/chibios/bootloaders/tinyuf2.c +4 -0
@@ 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();

M platforms/chibios/bootloaders/wb32_dfu.c => platforms/chibios/bootloaders/wb32_dfu.c +4 -0
@@ 47,3 47,7 @@ void enter_bootloader_mode_if_requested(void) {
            ;
    }
}

__attribute__((weak)) void mcu_reset(void) {
    NVIC_SystemReset();
}

M platforms/test/bootloaders/none.c => platforms/test/bootloaders/none.c +1 -0
@@ 17,3 17,4 @@
#include "bootloader.h"

void bootloader_jump(void) {}
void mcu_reset(void) {}

M quantum/quantum.c => quantum/quantum.c +16 -1
@@ 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:

M quantum/quantum.h => quantum/quantum.h +1 -0
@@ 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);

M quantum/quantum_keycodes.h => quantum/quantum_keycodes.h +2 -0
@@ 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