summaryrefslogtreecommitdiff
path: root/src/stm/ao_interrupt.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-03-10 21:02:59 -0700
committerKeith Packard <keithp@keithp.com>2013-05-07 20:15:43 -0700
commitc9c35b100c3fcae661501d2bf89eedc7fceb2e1c (patch)
treec2db5892a973c33346d1985405f2f88a6b3d87b6 /src/stm/ao_interrupt.c
parenta6887032b4d217bca5236ea15389218f10d69545 (diff)
altos: Make stm-flash capable of switching to application
This shrinks the base OS load down a bit as well so that stm-flash fits comfortably in the first 8kB of memory. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/stm/ao_interrupt.c')
-rw-r--r--src/stm/ao_interrupt.c44
1 files changed, 34 insertions, 10 deletions
diff --git a/src/stm/ao_interrupt.c b/src/stm/ao_interrupt.c
index 12763a30..9e756219 100644
--- a/src/stm/ao_interrupt.c
+++ b/src/stm/ao_interrupt.c
@@ -42,12 +42,45 @@ const void *stm_interrupt_vector[];
#ifdef AO_BOOT_APPLICATION_PIN
#include <ao_exti.h>
+
+#define AO_BOOT_APPLICATION 0x5a5aa5a5
+#define AO_BOOT_APPLICATION_CHECK 0xc3c33c3c
+
+static uint32_t ao_boot_application;
+static uint32_t ao_boot_application_check;
+
+static void
+ao_boot_chain(void) {
+ uint32_t sp;
+ uint32_t pc;
+
+ sp = BOOT_FETCH(0);
+ pc = BOOT_FETCH(4);
+ asm ("mov sp, %0" : : "r" (sp));
+ asm ("mov lr, %0" : : "r" (pc));
+ asm ("bx lr");
+}
+
+void
+ao_reboot_application(void)
+{
+ ao_boot_application = AO_BOOT_APPLICATION;
+ ao_boot_application_check = AO_BOOT_APPLICATION_CHECK;
+ ao_arch_reboot();
+}
+
#endif
void start(void) {
#ifdef AO_BOOT_APPLICATION_PIN
uint16_t v;
+ if (ao_boot_application == AO_BOOT_APPLICATION &&
+ ao_boot_application_check == AO_BOOT_APPLICATION_CHECK) {
+ ao_boot_application = 0;
+ ao_boot_application_check = 0;
+ ao_boot_chain();
+ }
/* Enable power interface clock */
stm_rcc.apb1enr |= (1 << STM_RCC_APB1ENR_PWREN);
@@ -63,16 +96,7 @@ void start(void) {
ao_disable_port(&AO_BOOT_APPLICATION_GPIO);
stm_rcc.apb1enr &= ~(1 << STM_RCC_APB1ENR_PWREN);
if (v == AO_BOOT_APPLICATION_VALUE)
- {
- uint32_t sp;
- uint32_t pc;
-
- sp = BOOT_FETCH(0);
- pc = BOOT_FETCH(4);
- asm ("mov sp, %0" : : "r" (sp));
- asm ("mov lr, %0" : : "r" (pc));
- asm ("bx lr");
- }
+ ao_boot_chain();
#endif
/* Set interrupt vector table offset */