diff options
author | Keith Packard <keithp@keithp.com> | 2013-03-10 21:02:59 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-05-07 20:15:43 -0700 |
commit | c9c35b100c3fcae661501d2bf89eedc7fceb2e1c (patch) | |
tree | c2db5892a973c33346d1985405f2f88a6b3d87b6 /src/stm/ao_interrupt.c | |
parent | a6887032b4d217bca5236ea15389218f10d69545 (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.c | 44 |
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 */ |