Pavel Chromy's on chip flash loader
[openocd.git] / src / flash / ocl / at91sam7x / 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, IRQAddr      /* IRQ interrupt         */\r
88    ldr pc, FIQAddr      /* FIQ interrupt         */\r
89 \r
90 \r
91 ResetAddr:     .word ResetHandler\r
92 UndefAddr:     .word UndefHandler\r
93 SWIAddr:       .word SWIHandler\r
94 PAbortAddr:    .word PAbortHandler\r
95 DAbortAddr:    .word DAbortHandler\r
96 ReservedAddr:  .word 0\r
97 IRQAddr:       .word IRQHandler\r
98 FIQAddr:       .word FIQHandler\r
99 \r
100    .ltorg\r
101 \r
102    .section .init, "ax"\r
103    .code 32\r
104    \r
105    .global ResetHandler\r
106    .global ExitFunction\r
107    .extern main\r
108 /****************************************************************************/\r
109 /*                           Reset handler                                  */\r
110 /****************************************************************************/\r
111 ResetHandler:\r
112    /*\r
113     * The watchdog is enabled after processor reset. Disable it.\r
114     */\r
115    ldr   r1, =WDT_BASE\r
116    ldr   r0, =WDT_WDDIS\r
117    str   r0, [r1, #WDT_MR_OFF]\r
118 \r
119    \r
120    /*\r
121     * Enable user reset: assertion length programmed to 1ms\r
122     */\r
123    ldr   r0, =(RSTC_KEY | RSTC_URSTEN | (4 << 8))\r
124    ldr   r1, =RSTC_MR\r
125    str   r0, [r1, #0]\r
126 \r
127    \r
128    /*\r
129     * Use 2 cycles for flash access.\r
130     */\r
131    ldr   r1, =MC_BASE\r
132    ldr   r0, =MC_FWS_1FWS\r
133    str   r0, [r1, #MC_FMR_OFF]\r
134 \r
135 \r
136    /*\r
137     * Disable all interrupts. Useful for debugging w/o target reset.\r
138     */\r
139    ldr   r1, =AIC_BASE\r
140    mvn   r0, #0\r
141    str   r0, [r1, #AIC_EOICR_OFF]\r
142    str   r0, [r1, #AIC_IDCR_OFF]\r
143 \r
144     \r
145    /*\r
146     * Setup a stack for each mode\r
147     */    \r
148    msr   CPSR_c, #ARM_MODE_UNDEF | I_BIT | F_BIT   /* Undefined Instruction Mode */     \r
149    ldr   sp, =__stack_und_end\r
150    \r
151    msr   CPSR_c, #ARM_MODE_ABORT | I_BIT | F_BIT   /* Abort Mode */\r
152    ldr   sp, =__stack_abt_end\r
153    \r
154    msr   CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT     /* FIQ Mode */   \r
155    ldr   sp, =__stack_fiq_end\r
156    \r
157    msr   CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT     /* IRQ Mode */   \r
158    ldr   sp, =__stack_irq_end\r
159    \r
160    msr   CPSR_c, #ARM_MODE_SVC | I_BIT | F_BIT     /* Supervisor Mode */\r
161    ldr   sp, =__stack_svc_end\r
162 \r
163 \r
164    /*\r
165     * Clear .bss section\r
166     */\r
167    ldr   r1, =__bss_start\r
168    ldr   r2, =__bss_end\r
169    ldr   r3, =0\r
170 bss_clear_loop:\r
171    cmp   r1, r2\r
172    strne r3, [r1], #+4\r
173    bne   bss_clear_loop\r
174    \r
175    \r
176    /*\r
177     * Jump to main\r
178     */\r
179    mrs   r0, cpsr\r
180    bic   r0, r0, #I_BIT | F_BIT     /* Enable FIQ and IRQ interrupt */\r
181    msr   cpsr, r0\r
182    \r
183    mov   r0, #0 /* No arguments */\r
184    mov   r1, #0 /* No arguments */\r
185    ldr   r2, =main\r
186    mov   lr, pc\r
187    bx    r2     /* And jump... */\r
188                        \r
189 ExitFunction:\r
190    nop\r
191    nop\r
192    nop\r
193    b ExitFunction   \r
194    \r
195 \r
196 /****************************************************************************/\r
197 /*                         Default interrupt handler                        */\r
198 /****************************************************************************/\r
199 \r
200 UndefHandler:\r
201    b UndefHandler\r
202    \r
203 SWIHandler:\r
204    b SWIHandler\r
205 \r
206 PAbortHandler:\r
207    b PAbortHandler\r
208 \r
209 DAbortHandler:\r
210    b DAbortHandler\r
211    \r
212 IRQHandler:\r
213    b IRQHandler\r
214    \r
215 FIQHandler:\r
216    b FIQHandler\r
217    \r
218    .weak ExitFunction\r
219    .weak UndefHandler, PAbortHandler, DAbortHandler\r
220    .weak IRQHandler, FIQHandler\r
221 \r
222    .ltorg\r
223 /*** EOF ***/   \r
224   \r
225 \rIndex: src/flash/ocl/at91sam7x/dcc.c\r