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

Fix bootloader_jump for certain CTRL boards #16026

Merged
merged 2 commits into from
Jan 24, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 5 additions & 12 deletions platforms/arm_atsam/bootloaders/md_boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,14 @@

#include "samd51j18a.h"

#ifdef KEYBOARD_massdrop_ctrl
// WARNING: These are only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support
extern uint32_t _eram;

# define BOOTLOADER_MAGIC 0x3B9ACA00
# define MAGIC_ADDR (uint32_t *)((intptr_t)(&_eram) - 4)
#define BOOTLOADER_MAGIC 0x3B9ACA00
#define MAGIC_ADDR (uint32_t *)((intptr_t)(&_eram) - 4)

// CTRL keyboards released with bootloader version below must use RAM method. Otherwise use WDT method.
void bootloader_jump(void) {
#ifdef KEYBOARD_massdrop_ctrl
uint8_t ver_ram_method[] = "v2.18Jun 22 2018 17:28:08"; // The version to match (NULL terminated by compiler)
uint8_t *ver_check = ver_ram_method; // Pointer to version match string for traversal
uint8_t *ver_rom = (uint8_t *)0x21A0; // Pointer to address in ROM where this specific bootloader version would exist
Expand All @@ -39,16 +38,12 @@ void bootloader_jump(void) {
if (!*ver_check) { // If check version pointer is NULL, all characters have matched
*MAGIC_ADDR = BOOTLOADER_MAGIC; // Set magic number into RAM
NVIC_SystemReset(); // Perform system reset

while (1)
; // Won't get here
}
}

#else
#endif

// Set watchdog timer to reset. Directs the bootloader to stay in programming mode.
void bootloader_jump(void) {
// Set watchdog timer to reset. Directs the bootloader to stay in programming mode.
WDT->CTRLA.bit.ENABLE = 0;

while (WDT->SYNCBUSY.bit.ENABLE)
Expand All @@ -65,8 +60,6 @@ void bootloader_jump(void) {
;
while (!WDT->CTRLA.bit.ENABLE)
;

while (1)
; // Wait on timeout
}
#endif