summaryrefslogtreecommitdiff
path: root/tmk_core/common/arm_atsam
diff options
context:
space:
mode:
authorpatrickmt <40182064+patrickmt@users.noreply.github.com>2018-09-05 12:25:47 -0400
committerDrashna Jaelre <drashna@live.com>2018-09-05 11:14:31 -0700
commite5465e1c57f1ae6b71e1e665e4afd5f5e3909a89 (patch)
treede019d1d30779a0ddb7a7fefe32a0ad0010dd759 /tmk_core/common/arm_atsam
parent73a3399d0ef7e06db70fc2964a3f2a35e9aca25d (diff)
CTRL and ALT updates
Added support to enter bootloader from software (bootloader version must be newer than "v2.18Jun 22 2018 17:28:08" until workaround for older is created). Updated CTRL and ALT keymaps for entering bootloader with Fn+b held for >500ms. Added basic MacOS keymap for ALT. USB sleep LED indicator now turns off after 1 second. Slowed down debug LED code printing.
Diffstat (limited to 'tmk_core/common/arm_atsam')
-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 5155d9ff04..9701a62196 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
+}