]> git.sur5r.net Git - freertos/blob - Demo/ARM7_LPC2129_Keil/Startup.s
Continue to work on Fujitsu 32bit port.
[freertos] / Demo / ARM7_LPC2129_Keil / Startup.s
1 /***********************************************************************/\r
2 /*  This file is part of the uVision/ARM development tools             */\r
3 /*  Copyright KEIL ELEKTRONIK GmbH 2002-2004                           */\r
4 /***********************************************************************/\r
5 /*                                                                     */\r
6 /*  STARTUP.S:  Startup file for Philips LPC2000 device series         */\r
7 /*                                                                     */\r
8 /***********************************************************************/\r
9 \r
10 \r
11 /* \r
12 //*** <<< Use Configuration Wizard in Context Menu >>> *** \r
13 */\r
14 \r
15 \r
16 // *** Startup Code (executed after Reset) ***\r
17 \r
18 \r
19 // Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs\r
20 \r
21         Mode_USR  EQU      0x10\r
22         Mode_FIQ  EQU      0x11\r
23         Mode_IRQ  EQU      0x12\r
24         Mode_SVC  EQU      0x13\r
25         Mode_ABT  EQU      0x17\r
26         Mode_UND  EQU      0x1B\r
27         Mode_SYS  EQU      0x1F\r
28 \r
29         I_Bit     EQU      0x80    /* when I bit is set, IRQ is disabled */\r
30         F_Bit     EQU      0x40    /* when F bit is set, FIQ is disabled */\r
31 \r
32 \r
33 /*\r
34 // <h> Stack Configuration (Stack Sizes in Bytes)\r
35 //   <o0> Undefined Mode      <0x0-0xFFFFFFFF>\r
36 //   <o1> Supervisor Mode     <0x0-0xFFFFFFFF>\r
37 //   <o2> Abort Mode          <0x0-0xFFFFFFFF>\r
38 //   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF>\r
39 //   <o4> Interrupt Mode      <0x0-0xFFFFFFFF>\r
40 //   <o5> User/System Mode    <0x0-0xFFFFFFFF>\r
41 // </h>\r
42 */\r
43         UND_Stack_Size  EQU     0x00000004\r
44         SVC_Stack_Size  EQU     0x00000100\r
45         ABT_Stack_Size  EQU     0x00000004\r
46         FIQ_Stack_Size  EQU     0x00000004\r
47         IRQ_Stack_Size  EQU     0x00000300\r
48         USR_Stack_Size  EQU     0x00000200\r
49 \r
50 AREA   STACK, DATA, READWRITE, ALIGN=2\r
51         DS   (USR_Stack_Size+3)&~3  ; Stack for User/System Mode \r
52         DS   (IRQ_Stack_Size+3)&~3  ; Stack for Interrupt Mode\r
53         DS   (FIQ_Stack_Size+3)&~3  ; Stack for Fast Interrupt Mode \r
54         DS   (ABT_Stack_Size+3)&~3  ; Stack for Abort Mode\r
55         DS   (SVC_Stack_Size+3)&~3  ; Stack for Supervisor Mode\r
56         DS   (UND_Stack_Size+3)&~3  ; Stack for Undefined Mode\r
57 Top_Stack:\r
58 \r
59 \r
60 // Phase Locked Loop (PLL) definitions\r
61         PLL_BASE        EQU     0xE01FC080  /* PLL Base Address */\r
62         PLLCON_OFS      EQU     0x00        /* PLL Control Offset*/\r
63         PLLCFG_OFS      EQU     0x04        /* PLL Configuration Offset */\r
64         PLLSTAT_OFS     EQU     0x08        /* PLL Status Offset */\r
65         PLLFEED_OFS     EQU     0x0C        /* PLL Feed Offset */\r
66         PLLCON_PLLE     EQU     (1<<0)      /* PLL Enable */\r
67         PLLCON_PLLC     EQU     (1<<1)      /* PLL Connect */\r
68         PLLCFG_MSEL     EQU     (0x1F<<0)   /* PLL Multiplier */\r
69         PLLCFG_PSEL     EQU     (0x03<<5)   /* PLL Divider */\r
70         PLLSTAT_PLOCK   EQU     (1<<10)     /* PLL Lock Status */\r
71 \r
72 /*\r
73 // <e> PLL Setup\r
74 // <i> Phase Locked Loop\r
75 //   <o1.0..4>   MSEL: PLL Multiplier Selection\r
76 //               <1-32><#-1>\r
77 //               <i> M Value\r
78 //   <o1.5..6>   PSEL: PLL Divider Selection\r
79 //               <0=> 1   <1=> 2   <2=> 4   <3=> 8\r
80 //               <i> P Value\r
81 // </e>\r
82 */\r
83         PLL_SETUP       EQU     1\r
84         PLLCFG_Val      EQU     0x00000024\r
85 \r
86 \r
87 // Memory Accelerator Module (MAM) definitions\r
88         MAM_BASE        EQU     0xE01FC000  /* MAM Base Address */\r
89         MAMCR_OFS       EQU     0x00        /* MAM Control Offset*/\r
90         MAMTIM_OFS      EQU     0x04        /* MAM Timing Offset */\r
91 \r
92 /*\r
93 // <e> MAM Setup\r
94 // <i> Memory Accelerator Module\r
95 //   <o1.0..1>   MAM Control\r
96 //               <0=> Disabled\r
97 //               <1=> Partially Enabled\r
98 //               <2=> Fully Enabled\r
99 //               <i> Mode\r
100 //   <o2.0..2>   MAM Timing\r
101 //               <0=> Reserved  <1=> 1   <2=> 2   <3=> 3\r
102 //               <4=> 4         <5=> 5   <6=> 6   <7=> 7\r
103 //               <i> Fetch Cycles\r
104 // </e>\r
105 */\r
106         MAM_SETUP       EQU     1\r
107         MAMCR_Val       EQU     0x00000002\r
108         MAMTIM_Val      EQU     0x00000003\r
109 \r
110 \r
111 // External Memory Controller (EMC) definitions\r
112         EMC_BASE        EQU     0xFFE00000  /* EMC Base Address */\r
113         BCFG0_OFS       EQU     0x00        /* BCFG0 Offset */\r
114         BCFG1_OFS       EQU     0x04        /* BCFG1 Offset */\r
115         BCFG2_OFS       EQU     0x08        /* BCFG2 Offset */\r
116         BCFG3_OFS       EQU     0x0C        /* BCFG3 Offset */\r
117 \r
118 /*\r
119 // <e> External Memory Controller (EMC)\r
120 */\r
121         EMC_SETUP       EQU     0\r
122 \r
123 /*\r
124 //   <e> Bank Configuration 0 (BCFG0)\r
125 //     <o1.0..3>   IDCY: Idle Cycles <0-15>\r
126 //     <o1.5..9>   WST1: Wait States 1 <0-31>\r
127 //     <o1.11..15> WST2: Wait States 2 <0-31>\r
128 //     <o1.10>     RBLE: Read Byte Lane Enable\r
129 //     <o1.26>     WP: Write Protect\r
130 //     <o1.27>     BM: Burst ROM\r
131 //     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit\r
132 //                                   <2=> 32-bit  <3=> Reserved\r
133 //   </e>\r
134 */\r
135         BCFG0_SETUP EQU         0\r
136         BCFG0_Val   EQU         0x0000FBEF\r
137 \r
138 /*\r
139 //   <e> Bank Configuration 1 (BCFG1)\r
140 //     <o1.0..3>   IDCY: Idle Cycles <0-15>\r
141 //     <o1.5..9>   WST1: Wait States 1 <0-31>\r
142 //     <o1.11..15> WST2: Wait States 2 <0-31>\r
143 //     <o1.10>     RBLE: Read Byte Lane Enable\r
144 //     <o1.26>     WP: Write Protect\r
145 //     <o1.27>     BM: Burst ROM\r
146 //     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit\r
147 //                                   <2=> 32-bit  <3=> Reserved\r
148 //   </e>\r
149 */\r
150         BCFG1_SETUP EQU         0\r
151         BCFG1_Val   EQU         0x0000FBEF\r
152 \r
153 /*\r
154 //   <e> Bank Configuration 0 (BCFG2)\r
155 //     <o1.0..3>   IDCY: Idle Cycles <0-15>\r
156 //     <o1.5..9>   WST1: Wait States 1 <0-31>\r
157 //     <o1.11..15> WST2: Wait States 2 <0-31>\r
158 //     <o1.10>     RBLE: Read Byte Lane Enable\r
159 //     <o1.26>     WP: Write Protect\r
160 //     <o1.27>     BM: Burst ROM\r
161 //     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit\r
162 //                                   <2=> 32-bit  <3=> Reserved\r
163 //   </e>\r
164 */\r
165         BCFG2_SETUP EQU         0\r
166         BCFG2_Val   EQU         0x0000FBEF\r
167 \r
168 /*\r
169 //   <e> Bank Configuration 3 (BCFG3)\r
170 //     <o1.0..3>   IDCY: Idle Cycles <0-15>\r
171 //     <o1.5..9>   WST1: Wait States 1 <0-31>\r
172 //     <o1.11..15> WST2: Wait States 2 <0-31>\r
173 //     <o1.10>     RBLE: Read Byte Lane Enable\r
174 //     <o1.26>     WP: Write Protect\r
175 //     <o1.27>     BM: Burst ROM\r
176 //     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit\r
177 //                                   <2=> 32-bit  <3=> Reserved\r
178 //   </e>\r
179 */\r
180         BCFG3_SETUP EQU         0\r
181         BCFG3_Val   EQU         0x0000FBEF\r
182 \r
183 /*\r
184 // </e> End of EMC\r
185 */\r
186 \r
187 \r
188 // External Memory Pins definitions\r
189         PINSEL2         EQU     0xE002C014  /* PINSEL2 Address */\r
190         PINSEL2_Val     EQU     0x0E6149E4  /* CS0..3, OE, WE, BLS0..3, \r
191                                                D0..31, A2..23, JTAG Pins */\r
192 \r
193 \r
194 // Starupt Code must be linked first at Address at which it expects to run.\r
195 \r
196 $IF (EXTERNAL_MODE)\r
197         CODE_BASE       EQU     0x80000000\r
198 $ELSE\r
199         CODE_BASE       EQU     0x00000000\r
200 $ENDIF\r
201 \r
202 AREA   STARTUPCODE, CODE, AT CODE_BASE   // READONLY, ALIGN=4\r
203        PUBLIC  __startup\r
204 \r
205        EXTERN  CODE32 (?C?INIT)\r
206 \r
207 __startup       PROC    CODE32\r
208 \r
209 // Pre-defined interrupt handlers that may be directly \r
210 // overwritten by C interrupt functions\r
211 EXTERN CODE32 (Undef_Handler?A)\r
212 EXTERN CODE32 (vPortYieldProcessor?A)\r
213 EXTERN CODE32 (PAbt_Handler?A)\r
214 EXTERN CODE32 (DAbt_Handler?A)\r
215 EXTERN CODE32 (IRQ_Handler?A)\r
216 EXTERN CODE32 (FIQ_Handler?A)\r
217 \r
218 // Exception Vectors\r
219 // Mapped to Address 0.\r
220 // Absolute addressing mode must be used.\r
221 \r
222 Vectors:        LDR     PC,Reset_Addr         \r
223                 LDR     PC,Undef_Addr\r
224                 LDR     PC,SWI_Addr\r
225                 LDR     PC,PAbt_Addr\r
226                 LDR     PC,DAbt_Addr\r
227                 NOP                            /* Reserved Vector */\r
228 ;               LDR     PC,IRQ_Addr\r
229                 LDR     PC,[PC, #-0x0FF0]      /* Vector from VicVectAddr */\r
230                 LDR     PC,FIQ_Addr\r
231 \r
232 Reset_Addr:     DD      Reset_Handler\r
233 Undef_Addr:     DD      Undef_Handler?A\r
234 SWI_Addr:       DD      vPortYieldProcessor?A\r
235 PAbt_Addr:      DD      PAbt_Handler?A\r
236 DAbt_Addr:      DD      DAbt_Handler?A\r
237                 DD      0                      /* Reserved Address */\r
238 IRQ_Addr:       DD      IRQ_Handler?A\r
239 FIQ_Addr:       DD      FIQ_Handler?A\r
240 \r
241 \r
242 // Reset Handler\r
243 \r
244 Reset_Handler:  \r
245 \r
246 \r
247 $IF (EXTERNAL_MODE)\r
248                 LDR     R0, =PINSEL2\r
249                 LDR     R1, =PINSEL2_Val\r
250                 STR     R1, [R0]\r
251 $ENDIF\r
252 \r
253 \r
254 IF (EMC_SETUP != 0)\r
255                 LDR     R0, =EMC_BASE\r
256 \r
257 IF (BCFG0_SETUP != 0)\r
258                 LDR     R1, =BCFG0_Val\r
259                 STR     R1, [R0, #BCFG0_OFS]\r
260 ENDIF\r
261 \r
262 IF (BCFG1_SETUP != 0)\r
263                 LDR     R1, =BCFG1_Val\r
264                 STR     R1, [R0, #BCFG1_OFS]\r
265 ENDIF\r
266 \r
267 IF (BCFG2_SETUP != 0)\r
268                 LDR     R1, =BCFG2_Val\r
269                 STR     R1, [R0, #BCFG2_OFS]\r
270 ENDIF\r
271 \r
272 IF (BCFG3_SETUP != 0)\r
273                 LDR     R1, =BCFG3_Val\r
274                 STR     R1, [R0, #BCFG3_OFS]\r
275 ENDIF\r
276 \r
277 ENDIF\r
278 \r
279 \r
280 IF (PLL_SETUP != 0)\r
281                 LDR     R0, =PLL_BASE\r
282                 MOV     R1, #0xAA\r
283                 MOV     R2, #0x55\r
284 \r
285 // Configure and Enable PLL\r
286                 MOV     R3, #PLLCFG_Val\r
287                 STR     R3, [R0, #PLLCFG_OFS] \r
288                 MOV     R3, #PLLCON_PLLE\r
289                 STR     R3, [R0, #PLLCON_OFS]\r
290                 STR     R1, [R0, #PLLFEED_OFS]\r
291                 STR     R2, [R0, #PLLFEED_OFS]\r
292 \r
293 // Wait until PLL Locked\r
294 PLL_Loop:       LDR     R3, [R0, #PLLSTAT_OFS]\r
295                 ANDS    R3, R3, #PLLSTAT_PLOCK\r
296                 BEQ     PLL_Loop\r
297 \r
298 // Switch to PLL Clock\r
299                 MOV     R3, #(PLLCON_PLLE | PLLCON_PLLC)\r
300                 STR     R3, [R0, #PLLCON_OFS]\r
301                 STR     R1, [R0, #PLLFEED_OFS]\r
302                 STR     R2, [R0, #PLLFEED_OFS]\r
303 ENDIF\r
304 \r
305 \r
306 IF (MAM_SETUP != 0)\r
307                 LDR     R0, =MAM_BASE\r
308                 MOV     R1, #MAMTIM_Val\r
309                 STR     R1, [R0, #MAMTIM_OFS] \r
310                 MOV     R1, #MAMCR_Val\r
311                 STR     R1, [R0, #MAMCR_OFS] \r
312 ENDIF\r
313 \r
314 \r
315 // Memory Mapping (when Interrupt Vectors are in RAM)\r
316                 MEMMAP  EQU  0xE01FC040  /* Memory Mapping Control */\r
317 \r
318 $IF (RAM_INTVEC)\r
319                 LDR     R0, =MEMMAP\r
320                 MOV     R1, #2\r
321                 STR     R1, [R0]\r
322 $ENDIF\r
323 \r
324 \r
325 // Setup Stack for each mode\r
326                 LDR     R0, =Top_Stack\r
327 \r
328 // Enter Undefined Instruction Mode and set its Stack Pointer\r
329                 MSR     CPSR_c, #Mode_UND|I_Bit|F_Bit\r
330                 MOV     SP, R0\r
331                 SUB     R0, R0, #UND_Stack_Size\r
332 \r
333 // Enter Abort Mode and set its Stack Pointer\r
334                 MSR     CPSR_c, #Mode_ABT|I_Bit|F_Bit\r
335                 MOV     SP, R0\r
336                 SUB     R0, R0, #ABT_Stack_Size\r
337 \r
338 // Enter FIQ Mode and set its Stack Pointer\r
339                 MSR     CPSR_c, #Mode_FIQ|I_Bit|F_Bit\r
340                 MOV     SP, R0\r
341                 SUB     R0, R0, #FIQ_Stack_Size\r
342 \r
343 // Enter IRQ Mode and set its Stack Pointer\r
344                 MSR     CPSR_c, #Mode_IRQ|I_Bit|F_Bit\r
345                 MOV     SP, R0\r
346                 SUB     R0, R0, #IRQ_Stack_Size\r
347 \r
348 // Enter Supervisor Mode and set its Stack Pointer\r
349                 MSR     CPSR_c, #Mode_SVC|I_Bit|F_Bit\r
350                 MOV     SP, R0\r
351                 SUB     R0, R0, #SVC_Stack_Size\r
352 \r
353 // Enter S Mode and set its Stack Pointer\r
354                 MSR     CPSR_c, #Mode_SYS\r
355                 MOV     SP, R0\r
356 \r
357 // Start in supervisor mode\r
358                 MSR     CPSR_c, #Mode_SVC|I_Bit|F_Bit\r
359 \r
360 // Enter the C code\r
361                 LDR     R0,=?C?INIT\r
362                 TST     R0,#1       ; Bit-0 set: INIT is Thumb\r
363                 LDREQ   LR,=exit?A  ; ARM Mode\r
364                 LDRNE   LR,=exit?T  ; Thumb Mode\r
365                 BX      R0\r
366                 ENDP\r
367 \r
368 PUBLIC exit?A\r
369 exit?A          PROC    CODE32\r
370                 B       exit?A\r
371                 ENDP\r
372 \r
373 PUBLIC exit?T\r
374 exit?T          PROC    CODE16\r
375 exit:           B       exit?T\r
376                 ENDP\r
377 \r
378 \r
379                 END\r