altos: Add self-flash support for STM32F042 processor
[fw/altos] / src / stmf0 / ao_interrupt.c
index 99a88dcb2c4cd47d5fb1b2c71d9a033e90f68b22..b6a3147f37ae36207de805a30943d563be319819 100644 (file)
 #include <string.h>
 #include <ao_boot.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__;
 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 */
 
 
 /* Interrupt functions */
 
@@ -46,7 +58,7 @@ stm_flash_size(void) {
 
        switch (dev_id) {
        case 0x445:
 
        switch (dev_id) {
        case 0x445:
-               kbytes = 32;    /* assume 32kB until we figure this out */
+               kbytes = stm_flash_size_04x.f_size;
                break;
        }
        return (uint32_t) kbytes * 1024;
                break;
        }
        return (uint32_t) kbytes * 1024;
@@ -54,7 +66,6 @@ stm_flash_size(void) {
 
 void start(void)
 {
 
 void start(void)
 {
-#if 0
 #ifdef AO_BOOT_CHAIN
        if (ao_boot_check_chain()) {
 #ifdef AO_BOOT_PIN
 #ifdef AO_BOOT_CHAIN
        if (ao_boot_check_chain()) {
 #ifdef AO_BOOT_PIN
@@ -62,6 +73,10 @@ void start(void)
 #endif
        }
 #endif
 #endif
        }
 #endif
+#if RELOCATE_INTERRUPT
+       memcpy(&__interrupt_start__, &__interrupt_rom__, &__interrupt_end__ - &__interrupt_start__);
+       stm_syscfg.cfgr1 = (stm_syscfg.cfgr1 & ~(STM_SYSCFG_CFGR1_MEM_MODE_MASK << STM_SYSCFG_CFGR1_MEM_MODE)) |
+               (STM_SYSCFG_CFGR1_MEM_MODE_SRAM << STM_SYSCFG_CFGR1_MEM_MODE);
 #endif
        memcpy(&__data_start__, &__text_end__, &__data_end__ - &__data_start__);
        memset(&__bss_start__, '\0', &__bss_end__ - &__bss_start__);
 #endif
        memcpy(&__data_start__, &__text_end__, &__data_end__ - &__data_start__);
        memset(&__bss_start__, '\0', &__bss_end__ - &__bss_start__);