summaryrefslogtreecommitdiff
path: root/src/lpc/ao_interrupt.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-06-24 14:23:53 -0700
committerKeith Packard <keithp@keithp.com>2013-06-24 14:30:22 -0700
commit0dd148e388944d8d265da51d62806c4a00b2c13d (patch)
treee1212b3cbc0d5a77d0fe1d676e07f86fef91a52f /src/lpc/ao_interrupt.c
parent2568b36ae9d38ae1607ec08b84b06e0fe84bd3ba (diff)
altos/lpc: Add boot loader
Support the USB boot loader, add USB pull-up support. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lpc/ao_interrupt.c')
-rw-r--r--src/lpc/ao_interrupt.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/lpc/ao_interrupt.c b/src/lpc/ao_interrupt.c
index b5e67007..c4dc7867 100644
--- a/src/lpc/ao_interrupt.c
+++ b/src/lpc/ao_interrupt.c
@@ -17,12 +17,25 @@
#include <ao.h>
#include <string.h>
+#include <ao_boot.h>
+
+#ifndef IS_FLASH_LOADER
+#error Should define IS_FLASH_LOADER
+#define IS_FLASH_LOADER 0
+#endif
+
+#if !IS_FLASH_LOADER
+#define RELOCATE_INTERRUPT 1
+#endif
extern void main(void);
extern char __stack__;
extern char __text_start__, __text_end__;
extern char __data_start__, __data_end__;
extern char __bss_start__, __bss_end__;
+#if RELOCATE_INTERRUPT
+extern char __interrupt_rom__, __interrupt_start__, __interrupt_end__;
+#endif
/* Interrupt functions */
@@ -35,10 +48,18 @@ void lpc_ignore_isr(void)
{
}
-int x;
-
void start(void) {
- x = 0;
+#ifdef AO_BOOT_CHAIN
+ if (ao_boot_check_chain()) {
+#ifdef AO_BOOT_PIN
+ ao_boot_check_pin();
+#endif
+ }
+#endif
+#if RELOCATE_INTERRUPT
+ memcpy(&__interrupt_start__, &__interrupt_rom__, &__interrupt_end__ - &__interrupt_start__);
+ lpc_scb.sysmemremap = LPC_SCB_SYSMEMREMAP_MAP_RAM << LPC_SCB_SYSMEMREMAP_MAP;
+#endif
memcpy(&__data_start__, &__text_end__, &__data_end__ - &__data_start__);
memset(&__bss_start__, '\0', &__bss_end__ - &__bss_start__);
main();