summaryrefslogtreecommitdiff
path: root/atmel-samd/asf/sam0/utils/cmsis/samd21/source
diff options
context:
space:
mode:
authorScott Shawcroft <scott.shawcroft@gmail.com>2017-05-13 09:17:43 -0700
committerScott Shawcroft <scott.shawcroft@gmail.com>2017-05-15 15:29:04 -0700
commit974847ac8d9fc2f64b43953da1731612840bb171 (patch)
tree5d675c02108514a32492ae431ac95d8ac8961cea /atmel-samd/asf/sam0/utils/cmsis/samd21/source
parent790c38e18c2b6417a05155ed7697a5bf29f1d31e (diff)
atmel-samd: Add a safe mode which detects hard faults and reboots without running user code again.
Diffstat (limited to 'atmel-samd/asf/sam0/utils/cmsis/samd21/source')
-rw-r--r--atmel-samd/asf/sam0/utils/cmsis/samd21/source/gcc/startup_samd21.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/atmel-samd/asf/sam0/utils/cmsis/samd21/source/gcc/startup_samd21.c b/atmel-samd/asf/sam0/utils/cmsis/samd21/source/gcc/startup_samd21.c
index 8e14b991f..487712270 100644
--- a/atmel-samd/asf/sam0/utils/cmsis/samd21/source/gcc/startup_samd21.c
+++ b/atmel-samd/asf/sam0/utils/cmsis/samd21/source/gcc/startup_samd21.c
@@ -275,6 +275,8 @@ __attribute__ ((used))void Reset_Handler(void)
while (true);
}
+extern uint32_t _ezero;
+
void HardFault_Handler(void)
{
#ifdef ENABLE_MICRO_TRACE_BUFFER
@@ -282,6 +284,14 @@ void HardFault_Handler(void)
// loop below.
REG_MTB_MASTER = 0x00000000 + 6;
#endif
+#ifdef CIRCUITPY_CANARY_WORD
+ // If the canary is intact, then kill it and reset so we have a chance to
+ // read our files.
+ if (_ezero == CIRCUITPY_CANARY_WORD) {
+ _ezero = CIRCUITPY_SAFE_RESTART_WORD;
+ NVIC_SystemReset();
+ }
+#endif
while(true) {}
}