Move also cpu/ to bertos/ :-).
[bertos.git] / bertos / cpu / arm / hw / crt.s
1 /****************************************************************************\r
2 *  Copyright (c) 2006 by Michael Fischer. All rights reserved.\r
3 *\r
4 *  Redistribution and use in source and binary forms, with or without \r
5 *  modification, are permitted provided that the following conditions \r
6 *  are met:\r
7 *  \r
8 *  1. Redistributions of source code must retain the above copyright \r
9 *     notice, this list of conditions and the following disclaimer.\r
10 *  2. Redistributions in binary form must reproduce the above copyright\r
11 *     notice, this list of conditions and the following disclaimer in the \r
12 *     documentation and/or other materials provided with the distribution.\r
13 *  3. Neither the name of the author nor the names of its contributors may \r
14 *     be used to endorse or promote products derived from this software \r
15 *     without specific prior written permission.\r
16 *\r
17 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
18 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
19 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS \r
20 *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL \r
21 *  THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS \r
24 *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED \r
25 *  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, \r
26 *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF \r
27 *  THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF \r
28 *  SUCH DAMAGE.\r
29 *\r
30 ****************************************************************************\r
31 *\r
32 *  History:\r
33 *\r
34 *  18.12.06  mifi   First Version\r
35 *                   The hardware initialization is based on the startup file\r
36 *                   crtat91sam7x256_rom.S from NutOS 4.2.1. \r
37 *                   Therefore partial copyright by egnite Software GmbH.\r
38 ****************************************************************************/\r
39 \r
40 /*\r
41  * Some defines for the program status registers\r
42  */\r
43    ARM_MODE_USER  = 0x10      /* Normal User Mode                             */ \r
44    ARM_MODE_FIQ   = 0x11      /* FIQ Fast Interrupts Mode                     */\r
45    ARM_MODE_IRQ   = 0x12      /* IRQ Standard Interrupts Mode                 */\r
46    ARM_MODE_SVC   = 0x13      /* Supervisor Interrupts Mode                   */\r
47    ARM_MODE_ABORT = 0x17      /* Abort Processing memory Faults Mode          */\r
48    ARM_MODE_UNDEF = 0x1B      /* Undefined Instructions Mode                  */\r
49    ARM_MODE_SYS   = 0x1F      /* System Running in Priviledged Operating Mode */\r
50    ARM_MODE_MASK  = 0x1F\r
51    \r
52    I_BIT          = 0x80      /* disable IRQ when I bit is set */\r
53    F_BIT          = 0x40      /* disable IRQ when I bit is set */\r
54    \r
55 /*\r
56  * Register Base Address\r
57  */\r
58    AIC_BASE         = 0xFFFFF000\r
59    AIC_EOICR_OFF    = 0x130\r
60    AIC_IDCR_OFF     = 0x124\r
61 \r
62    RSTC_MR          = 0xFFFFFD08\r
63    RSTC_KEY         = 0xA5000000\r
64    RSTC_URSTEN      = 0x00000001\r
65 \r
66    WDT_BASE         = 0xFFFFFD40\r
67    WDT_MR_OFF       = 0x00000004\r
68    WDT_WDDIS        = 0x00008000\r
69 \r
70    MC_BASE          = 0xFFFFFF00\r
71    MC_FMR_OFF       = 0x00000060\r
72    MC_FWS_1FWS      = 0x00480100\r
73       \r
74    .section .vectors,"ax"\r
75    .code 32\r
76         \r
77 /****************************************************************************/\r
78 /*               Vector table and reset entry                               */\r
79 /****************************************************************************/\r
80 _vectors:\r
81    ldr pc, ResetAddr     /* Reset                 */\r
82    ldr pc, UndefAddr     /* Undefined instruction */\r
83    ldr pc, SWIAddr       /* Software interrupt    */\r
84    ldr pc, PAbortAddr    /* Prefetch abort        */\r
85    ldr pc, DAbortAddr    /* Data abort            */\r
86    ldr pc, ReservedAddr  /* Reserved              */\r
87    ldr pc, [pc, #-0xF20] /* IRQ interrupt         */\r
88    ldr pc, FIQAddr       /* FIQ interrupt         */\r
89 \r
90 .extern maion\r
91 \r
92 ResetAddr:     .word ResetHandler\r
93 UndefAddr:     .word UndefHandler\r
94 SWIAddr:       .word SWIHandler\r
95 PAbortAddr:    .word PAbortHandler\r
96 DAbortAddr:    .word DAbortHandler\r
97 ReservedAddr:  .word 0\r
98 IRQAddr:       .word IRQHandler\r
99 FIQAddr:       .word FIQHandler\r
100 \r
101    .ltorg\r
102 \r
103    .section .init, "ax"\r
104    .code 32\r
105    \r
106    .global ResetHandler\r
107    .global ExitFunction\r
108    .extern main\r
109 /****************************************************************************/\r
110 /*                           Reset handler                                  */\r
111 /****************************************************************************/\r
112 ResetHandler:\r
113    /*\r
114     * The watchdog is enabled after processor reset. Disable it.\r
115     */\r
116    ldr   r1, =WDT_BASE\r
117    ldr   r0, =WDT_WDDIS\r
118    str   r0, [r1, #WDT_MR_OFF]\r
119 \r
120    \r
121    /*\r
122     * Enable user reset: assertion length programmed to 1ms\r
123     */\r
124    ldr   r0, =(RSTC_KEY | RSTC_URSTEN | (4 << 8))\r
125    ldr   r1, =RSTC_MR\r
126    str   r0, [r1, #0]\r
127 \r
128    \r
129    /*\r
130     * Use 2 cycles for flash access.\r
131     */\r
132    ldr   r1, =MC_BASE\r
133    ldr   r0, =MC_FWS_1FWS\r
134    str   r0, [r1, #MC_FMR_OFF]\r
135 \r
136 \r
137    /*\r
138     * Disable all interrupts. Useful for debugging w/o target reset.\r
139     */\r
140    ldr   r1, =AIC_BASE\r
141    mvn   r0, #0\r
142    str   r0, [r1, #AIC_EOICR_OFF]\r
143    str   r0, [r1, #AIC_IDCR_OFF]\r
144 \r
145     \r
146    /*\r
147     * Setup a stack for each mode\r
148     */    \r
149    msr   CPSR_c, #ARM_MODE_UNDEF | I_BIT | F_BIT   /* Undefined Instruction Mode */     \r
150    ldr   sp, =__stack_und_end\r
151    \r
152    msr   CPSR_c, #ARM_MODE_ABORT | I_BIT | F_BIT   /* Abort Mode */\r
153    ldr   sp, =__stack_abt_end\r
154    \r
155    msr   CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT     /* FIQ Mode */   \r
156    ldr   sp, =__stack_fiq_end\r
157    \r
158    msr   CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT     /* IRQ Mode */   \r
159    ldr   sp, =__stack_irq_end\r
160    \r
161    msr   CPSR_c, #ARM_MODE_SVC | I_BIT | F_BIT     /* Supervisor Mode */\r
162    ldr   sp, =__stack_svc_end\r
163 \r
164 \r
165    /*\r
166     * Clear .bss section\r
167     */\r
168    ldr   r1, =__bss_start\r
169    ldr   r2, =__bss_end\r
170    ldr   r3, =0\r
171 bss_clear_loop:\r
172    cmp   r1, r2\r
173    strne r3, [r1], #+4\r
174    bne   bss_clear_loop\r
175    \r
176    \r
177    /*\r
178     * Jump to main\r
179     */\r
180 \r
181    mov   r0, #0 /* No arguments */\r
182    mov   r1, #0 /* No arguments */\r
183    ldr   r2, =main\r
184    mov   lr, pc\r
185    bx    r2     /* And jump... */\r
186                        \r
187 ExitFunction:\r
188    nop\r
189    nop\r
190    nop\r
191    b ExitFunction   \r
192    \r
193 \r
194 /****************************************************************************/\r
195 /*                         Default interrupt handler                        */\r
196 /****************************************************************************/\r
197 \r
198 UndefHandler:\r
199    b UndefHandler\r
200    \r
201 SWIHandler:\r
202    b SWIHandler\r
203 \r
204 PAbortHandler:\r
205    b PAbortHandler\r
206 \r
207 DAbortHandler:\r
208    b DAbortHandler\r
209    \r
210 IRQHandler:\r
211    b IRQHandler\r
212    \r
213 FIQHandler:\r
214    b FIQHandler\r
215    \r
216    .weak ExitFunction\r
217    .weak UndefHandler, PAbortHandler, DAbortHandler\r
218    .weak IRQHandler, FIQHandler\r
219 \r
220    .ltorg\r
221 /*** EOF ***/   \r
222   \r
223 \r