summaryrefslogtreecommitdiffstats
path: root/tmk_core
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/common/arm_atsam/bootloader.c32
-rw-r--r--tmk_core/protocol/arm_atsam/d51_util.c4
-rw-r--r--tmk_core/protocol/arm_atsam/main_arm_atsam.c7
3 files changed, 39 insertions, 4 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
+}
diff --git a/tmk_core/protocol/arm_atsam/d51_util.c b/tmk_core/protocol/arm_atsam/d51_util.c
index 91b58757c..bb63a9481 100644
--- a/tmk_core/protocol/arm_atsam/d51_util.c
+++ b/tmk_core/protocol/arm_atsam/d51_util.c
@@ -41,8 +41,8 @@ void m15_print(uint32_t x)
//Display unsigned 32-bit number through debug led
//Read as follows: 1230 = [*] [* *] [* * *] [**] (note zero is fast double flash)
-#define DLED_ONTIME 600000
-#define DLED_PAUSE 1000000
+#define DLED_ONTIME 1000000
+#define DLED_PAUSE 1500000
volatile uint32_t w;
void dled_print(uint32_t x, uint8_t long_pause)
{
diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
index e9514730e..8cc776703 100644
--- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c
+++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
@@ -225,6 +225,8 @@ int main(void)
{
if (usb_state == USB_STATE_POWERDOWN)
{
+ uint32_t timer_led = timer_read32();
+
led_on;
if (led_enabled)
{
@@ -233,7 +235,10 @@ int main(void)
I2C3733_Control_Set(0);
}
}
- while (usb_state == USB_STATE_POWERDOWN) {}
+ while (usb_state == USB_STATE_POWERDOWN)
+ {
+ if (timer_read32() - timer_led > 1000) led_off; //Good to indicate went to sleep, but only for a second
+ }
if (led_enabled)
{
for (drvid=0;drvid<ISSI3733_DRIVER_COUNT;drvid++)