summaryrefslogtreecommitdiffstats
path: root/tmk_core/common/arm_atsam/bootloader.c
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/common/arm_atsam/bootloader.c')
-rw-r--r--tmk_core/common/arm_atsam/bootloader.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/tmk_core/common/arm_atsam/bootloader.c b/tmk_core/common/arm_atsam/bootloader.c
index 5155d9ff0..9701a6219 100644
--- a/tmk_core/common/arm_atsam/bootloader.c
+++ b/tmk_core/common/arm_atsam/bootloader.c
@@ -15,5 +15,35 @@
*/
#include "bootloader.h"
+#include "samd51j18a.h"
-void bootloader_jump(void) {}
+//Set watchdog timer to reset. Directs the bootloader to stay in programming mode.
+void bootloader_jump(void)
+{
+ //Keyboards released with certain bootloader can not enter bootloader from app until workaround is created
+ uint8_t ver_no_jump[] = "v2.18Jun 22 2018 17:28:08";
+ uint8_t *ver_check = ver_no_jump;
+ uint8_t *boot_check = (uint8_t *)0x21A0;
+ while (*ver_check && *boot_check == *ver_check)
+ {
+ ver_check++;
+ boot_check++;
+ }
+ if (!*ver_check)
+ {
+ //Version match
+ //Software workaround would go here
+ return; //No software restart method implemented... must use hardware reset button
+ }
+
+ WDT->CTRLA.bit.ENABLE = 0;
+ while (WDT->SYNCBUSY.bit.ENABLE) {}
+ while (WDT->CTRLA.bit.ENABLE) {}
+ WDT->CONFIG.bit.WINDOW = 0;
+ WDT->CONFIG.bit.PER = 0;
+ WDT->EWCTRL.bit.EWOFFSET = 0;
+ WDT->CTRLA.bit.ENABLE = 1;
+ while (WDT->SYNCBUSY.bit.ENABLE) {}
+ while (!WDT->CTRLA.bit.ENABLE) {}
+ while (1) {} //Wait on timeout
+}