aboutsummaryrefslogtreecommitdiffstats
path: root/tmk_core/protocol/arm_atsam
diff options
context:
space:
mode:
authorGravatar patrickmt <40182064+patrickmt@users.noreply.github.com>2018-09-28 22:34:56 -0400
committerGravatar Jack Humbert <jack.humb@gmail.com>2018-09-28 23:09:53 -0400
commitdaf0cc60bff54be948c923cdc40aa80b82a27f6d (patch)
tree121de3f118e7fbc325eb79d23e3dc58c95b99e76 /tmk_core/protocol/arm_atsam
parent20a10bd0846d502069203419f57e36fd7467df5e (diff)
downloadqmk_firmware-daf0cc60bff54be948c923cdc40aa80b82a27f6d.tar.gz
CTRL keyboard bootloader_jump support
Adds support for CTRL keyboards to enter bootloader via bootloader_jump()
Diffstat (limited to 'tmk_core/protocol/arm_atsam')
-rw-r--r--tmk_core/protocol/arm_atsam/md_bootloader.h7
-rw-r--r--tmk_core/protocol/arm_atsam/startup.c11
2 files changed, 18 insertions, 0 deletions
diff --git a/tmk_core/protocol/arm_atsam/md_bootloader.h b/tmk_core/protocol/arm_atsam/md_bootloader.h
index 1316876c8..956145c31 100644
--- a/tmk_core/protocol/arm_atsam/md_bootloader.h
+++ b/tmk_core/protocol/arm_atsam/md_bootloader.h
@@ -7,6 +7,13 @@ extern uint32_t _erom;
#define BOOTLOADER_SERIAL_MAX_SIZE 20 //DO NOT MODIFY!
+#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 *)(&_eram - 4)
+#endif
+
#ifdef MD_BOOTLOADER
#define MCU_HZ 48000000
diff --git a/tmk_core/protocol/arm_atsam/startup.c b/tmk_core/protocol/arm_atsam/startup.c
index a62d02f1c..f29fac179 100644
--- a/tmk_core/protocol/arm_atsam/startup.c
+++ b/tmk_core/protocol/arm_atsam/startup.c
@@ -28,6 +28,7 @@
*/
#include "samd51.h"
+#include "md_bootloader.h"
/* Initialize segments */
extern uint32_t _sfixed;
@@ -500,6 +501,16 @@ const DeviceVectors exception_table = {
*/
void Reset_Handler(void)
{
+#ifdef KEYBOARD_massdrop_ctrl
+ /* WARNING: This is only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support */
+ if (*MAGIC_ADDR == BOOTLOADER_MAGIC) {
+ /* At this point, the bootloader's memory is initialized properly, so undo the jump to here, then jump back */
+ *MAGIC_ADDR = 0x00000000; /* Change value to prevent potential bootloader entrance loop */
+ __set_MSP(0x20008818); /* MSP according to bootloader */
+ SCB->VTOR = 0x00000000; /* Vector table back to bootloader's */
+ asm("bx %0"::"r"(0x00001267)); /* Jump past bootloader RCAUSE check using THUMB */
+ }
+#endif
uint32_t *pSrc, *pDest;
/* Initialize the relocate segment */