Fixed SRAM interface.
[iapyx.git] / vm / src / startup.c
1 #include "interrupt.h"
2 #include "spi.h"
3 #include "mem.h"
4
5 #include "pmc.h"
6 #include "debug.h"
7
8 #include "registers.h"
9
10 /* Segment symbols */
11 extern uint32_t _sfixed;
12 extern uint32_t _efixed;
13 extern uint32_t _etext;
14 extern uint32_t _srelocate;
15 extern uint32_t _erelocate;
16 extern uint32_t _szero;
17 extern uint32_t _ezero;
18 extern uint32_t _sstack;
19 extern uint32_t _estack;
20
21 static void startup_dummy_handler(void);
22 static void startup_reset_handler(void);
23
24 __attribute__ ((section(".vectors")))
25 interrupt_function_t exception_table[] = {
26     (interrupt_function_t) (&_estack),
27     startup_reset_handler,
28
29     startup_dummy_handler, /* NMI */
30     startup_dummy_handler, /* Hardfault */
31     startup_dummy_handler, /* memmanage */
32     startup_dummy_handler, /* busfault */
33     startup_dummy_handler, /* usagefault */
34     0, 0, 0, 0, /* reserved */
35     startup_dummy_handler, /* svc */
36     startup_dummy_handler, /* debugmon */
37     0, /* reserved */
38     startup_dummy_handler, /* pendsv */
39     startup_dummy_handler, /* systick */
40     
41     /* configurable */
42     startup_dummy_handler, /* 0: supply controller */
43     startup_dummy_handler, /* 1: reset controller */
44     startup_dummy_handler, /* 2: RTC */
45     startup_dummy_handler, /* 3: RTT */
46     startup_dummy_handler, /* 4: watchdog */
47     startup_dummy_handler, /* 5: PMC */
48     startup_dummy_handler, /* 6: EEFC */
49     startup_dummy_handler, /* 7: reserved */
50     startup_dummy_handler, /* 8: UART0 */
51     startup_dummy_handler, /* 9: UART1 (not present on SAM3N) */
52     startup_dummy_handler, /* 10: reserved */
53     startup_dummy_handler, /* 11: PIOA  */
54     startup_dummy_handler, /* 12: PIOB */
55     startup_dummy_handler, /* 13: PIOC */
56     startup_dummy_handler, /* 14: USART 0 */
57     startup_dummy_handler, /* 15: USART 1 */
58     startup_dummy_handler, /* 16: reserved */
59     startup_dummy_handler, /* 17: reserved */
60     startup_dummy_handler, /* 18: reserved */
61     startup_dummy_handler, /* 19: TWI 0 */
62     startup_dummy_handler, /* 20: TWI 1 */
63     startup_dummy_handler, /* 21: SPI */
64     startup_dummy_handler, /* 22: reserved */
65     startup_dummy_handler, /* 23: timer counter 0 */
66     startup_dummy_handler, /* 24: timer counter 1 */
67     startup_dummy_handler, /* 25: timer counter 2 */
68     startup_dummy_handler, /* 26: timer counter 3 */
69     startup_dummy_handler, /* 27: timer counter 4 */
70     startup_dummy_handler, /* 28: timer counter 5 */
71     startup_dummy_handler, /* 29: ADC */
72     startup_dummy_handler, /* 30: DAC */
73     startup_dummy_handler, /* 31: PWM */
74     startup_dummy_handler /* 32: not used */
75 };
76
77 static void startup_dummy_handler(void) {
78     /* loop forever */
79     while(1) {}
80 }
81
82 static void startup_reset_handler(void) {
83     /* relocation segment, i.e. global data */
84     uint32_t *src, *dest;
85     src = &_etext;
86     dest = &_srelocate;
87
88     if(src != dest) {
89         for(; dest < &_erelocate; ) *dest++ = *src++;
90     }
91
92     /* clear the BSS */
93     for(dest = &_szero; dest < &_ezero; dest ++) {
94         *dest = 0;
95     }
96
97     /* disable watchdog timer */
98     register_write(WDT_MR, (1<<15));
99
100     /* at this point, should be all good to go... */
101
102     pmc_init();
103
104     debug_init();
105
106     spi_init();
107     const struct mem_interface *sram_int = mem_interface(MEM_SRAM_23LC1024);
108     /* SPI port zero */
109     void *sram_obj = sram_int->init(0);
110
111     sram_int->write_word(sram_obj, 0x0, 0xdeadc0de);
112
113     DEBUG("word 0: %x", sram_int->read_word(sram_obj, 0x0));
114
115     sram_int->write_word(sram_obj, 0x1, sram_int->read_word(sram_obj, 0x1)+1);
116
117     DEBUG("word 1: %x", sram_int->read_word(sram_obj, 0x1));
118
119     /* turn on LED on PA3 */
120     *(uint32_t *)(0x400e0e00) = 0x8;
121     *(uint32_t *)(0x400e0e10) = 0x8;
122     *(uint32_t *)(0x400e0e30) = 0x8;
123
124     while(1) {}
125 }