]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/ARM7_LPC2129_Keil_RVDS/Startup.s
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS / Demo / ARM7_LPC2129_Keil_RVDS / Startup.s
1 ;/*****************************************************************************/\r
2 ;/* STARTUP.S: Startup file for Philips LPC2000                               */\r
3 ;/*****************************************************************************/\r
4 ;/* <<< Use Configuration Wizard in Context Menu >>>                          */ \r
5 ;/*****************************************************************************/\r
6 ;/* This file is part of the uVision/ARM development tools.                   */\r
7 ;/* Copyright (c) 2005-2007 Keil Software. All rights reserved.               */\r
8 ;/* This software may only be used under the terms of a valid, current,       */\r
9 ;/* end user licence from KEIL for a compatible version of KEIL software      */\r
10 ;/* development tools. Nothing else gives you the right to use this software. */\r
11 ;/*****************************************************************************/\r
12 \r
13 \r
14 ;/*\r
15 ; *  The STARTUP.S code is executed after CPU Reset. This file may be \r
16 ; *  translated with the following SET symbols. In uVision these SET \r
17 ; *  symbols are entered under Options - ASM - Define.\r
18 ; *\r
19 ; *  REMAP: when set the startup code initializes the register MEMMAP \r
20 ; *  which overwrites the settings of the CPU configuration pins. The \r
21 ; *  startup and interrupt vectors are remapped from:\r
22 ; *     0x00000000  default setting (not remapped)\r
23 ; *     0x80000000  when EXTMEM_MODE is used\r
24 ; *     0x40000000  when RAM_MODE is used\r
25 ; *\r
26 ; *  EXTMEM_MODE: when set the device is configured for code execution\r
27 ; *  from external memory starting at address 0x80000000.\r
28 ; *\r
29 ; *  RAM_MODE: when set the device is configured for code execution\r
30 ; *  from on-chip RAM starting at address 0x40000000.\r
31 ; *\r
32 ; *  EXTERNAL_MODE: when set the PIN2SEL values are written that enable\r
33 ; *  the external BUS at startup.\r
34 ; */\r
35 \r
36 \r
37 ; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs\r
38 \r
39 Mode_USR        EQU     0x10\r
40 Mode_FIQ        EQU     0x11\r
41 Mode_IRQ        EQU     0x12\r
42 Mode_SVC        EQU     0x13\r
43 Mode_ABT        EQU     0x17\r
44 Mode_UND        EQU     0x1B\r
45 Mode_SYS        EQU     0x1F\r
46 \r
47 I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled\r
48 F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled\r
49 \r
50 \r
51 ;// <h> Stack Configuration (Stack Sizes in Bytes)\r
52 ;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>\r
53 ;//   <o1> Supervisor Mode     <0x0-0xFFFFFFFF:8>\r
54 ;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>\r
55 ;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>\r
56 ;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>\r
57 ;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>\r
58 ;// </h>\r
59 \r
60 UND_Stack_Size  EQU     0x00000008\r
61 SVC_Stack_Size  EQU     0x00000300\r
62 ABT_Stack_Size  EQU     0x00000008\r
63 FIQ_Stack_Size  EQU     0x00000008\r
64 IRQ_Stack_Size  EQU     0x00000300\r
65 USR_Stack_Size  EQU             0x00000008\r
66 \r
67 Stack_Size      EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \\r
68                          FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size )\r
69 \r
70                 AREA    STACK, NOINIT, READWRITE, ALIGN=3\r
71 Stack_Mem       SPACE   Stack_Size\r
72 \r
73 ;__initial_sp    SPACE   ISR_Stack_Size\r
74 \r
75 Stack_Top               EQU  Stack_Mem + Stack_Size\r
76 \r
77 \r
78 ;// <h> Heap Configuration\r
79 ;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF>\r
80 ;// </h>\r
81 \r
82 Heap_Size       EQU     0x00000000\r
83 \r
84                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3\r
85 __heap_base\r
86 Heap_Mem        SPACE   Heap_Size\r
87 __heap_limit\r
88 \r
89 \r
90 ; VPBDIV definitions\r
91 VPBDIV          EQU     0xE01FC100      ; VPBDIV Address\r
92 \r
93 ;// <e> VPBDIV Setup\r
94 ;// <i> Peripheral Bus Clock Rate\r
95 ;//   <o1.0..1>   VPBDIV: VPB Clock\r
96 ;//               <0=> VPB Clock = CPU Clock / 4\r
97 ;//               <1=> VPB Clock = CPU Clock\r
98 ;//               <2=> VPB Clock = CPU Clock / 2\r
99 ;//   <o1.4..5>   XCLKDIV: XCLK Pin\r
100 ;//               <0=> XCLK Pin = CPU Clock / 4\r
101 ;//               <1=> XCLK Pin = CPU Clock\r
102 ;//               <2=> XCLK Pin = CPU Clock / 2\r
103 ;// </e>\r
104 VPBDIV_SETUP    EQU     0\r
105 VPBDIV_Val      EQU     0x00000000\r
106 \r
107 \r
108 ; Phase Locked Loop (PLL) definitions\r
109 PLL_BASE        EQU     0xE01FC080      ; PLL Base Address\r
110 PLLCON_OFS      EQU     0x00            ; PLL Control Offset\r
111 PLLCFG_OFS      EQU     0x04            ; PLL Configuration Offset\r
112 PLLSTAT_OFS     EQU     0x08            ; PLL Status Offset\r
113 PLLFEED_OFS     EQU     0x0C            ; PLL Feed Offset\r
114 PLLCON_PLLE     EQU     (1<<0)          ; PLL Enable\r
115 PLLCON_PLLC     EQU     (1<<1)          ; PLL Connect\r
116 PLLCFG_MSEL     EQU     (0x1F<<0)       ; PLL Multiplier\r
117 PLLCFG_PSEL     EQU     (0x03<<5)       ; PLL Divider\r
118 PLLSTAT_PLOCK   EQU     (1<<10)         ; PLL Lock Status\r
119 \r
120 ;// <e> PLL Setup\r
121 ;//   <o1.0..4>   MSEL: PLL Multiplier Selection\r
122 ;//               <1-32><#-1>\r
123 ;//               <i> M Value\r
124 ;//   <o1.5..6>   PSEL: PLL Divider Selection\r
125 ;//               <0=> 1   <1=> 2   <2=> 4   <3=> 8\r
126 ;//               <i> P Value\r
127 ;// </e>\r
128 PLL_SETUP       EQU     1\r
129 PLLCFG_Val      EQU     0x00000024\r
130 \r
131 \r
132 ; Memory Accelerator Module (MAM) definitions\r
133 MAM_BASE        EQU     0xE01FC000      ; MAM Base Address\r
134 MAMCR_OFS       EQU     0x00            ; MAM Control Offset\r
135 MAMTIM_OFS      EQU     0x04            ; MAM Timing Offset\r
136 \r
137 ;// <e> MAM Setup\r
138 ;//   <o1.0..1>   MAM Control\r
139 ;//               <0=> Disabled\r
140 ;//               <1=> Partially Enabled\r
141 ;//               <2=> Fully Enabled\r
142 ;//               <i> Mode\r
143 ;//   <o2.0..2>   MAM Timing\r
144 ;//               <0=> Reserved  <1=> 1   <2=> 2   <3=> 3\r
145 ;//               <4=> 4         <5=> 5   <6=> 6   <7=> 7\r
146 ;//               <i> Fetch Cycles\r
147 ;// </e>\r
148 MAM_SETUP       EQU     1\r
149 MAMCR_Val       EQU     0x00000002\r
150 MAMTIM_Val      EQU     0x00000004\r
151 \r
152 \r
153 ; External Memory Controller (EMC) definitions\r
154 EMC_BASE        EQU     0xFFE00000      ; EMC Base Address\r
155 BCFG0_OFS       EQU     0x00            ; BCFG0 Offset\r
156 BCFG1_OFS       EQU     0x04            ; BCFG1 Offset\r
157 BCFG2_OFS       EQU     0x08            ; BCFG2 Offset\r
158 BCFG3_OFS       EQU     0x0C            ; BCFG3 Offset\r
159 \r
160 ;// <e> External Memory Controller (EMC)\r
161 EMC_SETUP       EQU     0\r
162 \r
163 ;//   <e> Bank Configuration 0 (BCFG0)\r
164 ;//     <o1.0..3>   IDCY: Idle Cycles <0-15>\r
165 ;//     <o1.5..9>   WST1: Wait States 1 <0-31>\r
166 ;//     <o1.11..15> WST2: Wait States 2 <0-31>\r
167 ;//     <o1.10>     RBLE: Read Byte Lane Enable\r
168 ;//     <o1.26>     WP: Write Protect\r
169 ;//     <o1.27>     BM: Burst ROM\r
170 ;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit\r
171 ;//                                   <2=> 32-bit  <3=> Reserved\r
172 ;//   </e>\r
173 BCFG0_SETUP EQU         0\r
174 BCFG0_Val   EQU         0x0000FBEF\r
175 \r
176 ;//   <e> Bank Configuration 1 (BCFG1)\r
177 ;//     <o1.0..3>   IDCY: Idle Cycles <0-15>\r
178 ;//     <o1.5..9>   WST1: Wait States 1 <0-31>\r
179 ;//     <o1.11..15> WST2: Wait States 2 <0-31>\r
180 ;//     <o1.10>     RBLE: Read Byte Lane Enable\r
181 ;//     <o1.26>     WP: Write Protect\r
182 ;//     <o1.27>     BM: Burst ROM\r
183 ;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit\r
184 ;//                                   <2=> 32-bit  <3=> Reserved\r
185 ;//   </e>\r
186 BCFG1_SETUP EQU         0\r
187 BCFG1_Val   EQU         0x0000FBEF\r
188 \r
189 ;//   <e> Bank Configuration 2 (BCFG2)\r
190 ;//     <o1.0..3>   IDCY: Idle Cycles <0-15>\r
191 ;//     <o1.5..9>   WST1: Wait States 1 <0-31>\r
192 ;//     <o1.11..15> WST2: Wait States 2 <0-31>\r
193 ;//     <o1.10>     RBLE: Read Byte Lane Enable\r
194 ;//     <o1.26>     WP: Write Protect\r
195 ;//     <o1.27>     BM: Burst ROM\r
196 ;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit\r
197 ;//                                   <2=> 32-bit  <3=> Reserved\r
198 ;//   </e>\r
199 BCFG2_SETUP EQU         0\r
200 BCFG2_Val   EQU         0x0000FBEF\r
201 \r
202 ;//   <e> Bank Configuration 3 (BCFG3)\r
203 ;//     <o1.0..3>   IDCY: Idle Cycles <0-15>\r
204 ;//     <o1.5..9>   WST1: Wait States 1 <0-31>\r
205 ;//     <o1.11..15> WST2: Wait States 2 <0-31>\r
206 ;//     <o1.10>     RBLE: Read Byte Lane Enable\r
207 ;//     <o1.26>     WP: Write Protect\r
208 ;//     <o1.27>     BM: Burst ROM\r
209 ;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit\r
210 ;//                                   <2=> 32-bit  <3=> Reserved\r
211 ;//   </e>\r
212 BCFG3_SETUP EQU         0\r
213 BCFG3_Val   EQU         0x0000FBEF\r
214 \r
215 ;// </e> End of EMC\r
216 \r
217 \r
218 ; External Memory Pins definitions\r
219 PINSEL2         EQU     0xE002C014      ; PINSEL2 Address\r
220 PINSEL2_Val     EQU     0x0E6149E4      ; CS0..3, OE, WE, BLS0..3, \r
221                                         ; D0..31, A2..23, JTAG Pins\r
222 \r
223 \r
224                 PRESERVE8\r
225                 \r
226 \r
227 ; Area Definition and Entry Point\r
228 ;  Startup Code must be linked first at Address at which it expects to run.\r
229 \r
230                 AREA    RESET, CODE, READONLY\r
231                 ARM\r
232 \r
233 \r
234 ; Exception Vectors\r
235 ;  Mapped to Address 0.\r
236 ;  Absolute addressing mode must be used.\r
237 ;  Dummy Handlers are implemented as infinite loops which can be modified.\r
238                                 IMPORT  vPortYieldProcessor\r
239 \r
240 Vectors         LDR     PC, Reset_Addr         \r
241                 LDR     PC, Undef_Addr\r
242                 LDR     PC, SWI_Addr\r
243                 LDR     PC, PAbt_Addr\r
244                 LDR     PC, DAbt_Addr\r
245                 NOP                            ; Reserved Vector \r
246 ;               LDR     PC, IRQ_Addr\r
247                 LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr\r
248                 LDR     PC, FIQ_Addr\r
249 \r
250 Reset_Addr      DCD     Reset_Handler\r
251 Undef_Addr      DCD     Undef_Handler\r
252 SWI_Addr        DCD     vPortYieldProcessor\r
253 PAbt_Addr       DCD     PAbt_Handler\r
254 DAbt_Addr       DCD     DAbt_Handler\r
255                 DCD     0                      ; Reserved Address \r
256 IRQ_Addr        DCD     IRQ_Handler\r
257 FIQ_Addr        DCD     FIQ_Handler\r
258 \r
259 Undef_Handler   B       Undef_Handler\r
260 SWI_Handler     B       SWI_Handler\r
261 PAbt_Handler    B       PAbt_Handler\r
262 DAbt_Handler    B       DAbt_Handler\r
263 IRQ_Handler     B       IRQ_Handler\r
264 FIQ_Handler     B       FIQ_Handler\r
265 \r
266 \r
267 ; Reset Handler\r
268 \r
269                 EXPORT  Reset_Handler\r
270 Reset_Handler   \r
271 \r
272 \r
273 ; Setup External Memory Pins\r
274                 IF      :DEF:EXTERNAL_MODE\r
275                 LDR     R0, =PINSEL2\r
276                 LDR     R1, =PINSEL2_Val\r
277                 STR     R1, [R0]\r
278                 ENDIF\r
279 \r
280 \r
281 ; Setup External Memory Controller\r
282                 IF      EMC_SETUP <> 0\r
283                 LDR     R0, =EMC_BASE\r
284 \r
285                 IF      BCFG0_SETUP <> 0\r
286                 LDR     R1, =BCFG0_Val\r
287                 STR     R1, [R0, #BCFG0_OFS]\r
288                 ENDIF\r
289 \r
290                 IF      BCFG1_SETUP <> 0\r
291                 LDR     R1, =BCFG1_Val\r
292                 STR     R1, [R0, #BCFG1_OFS]\r
293                 ENDIF\r
294 \r
295                 IF      BCFG2_SETUP <> 0\r
296                 LDR     R1, =BCFG2_Val\r
297                 STR     R1, [R0, #BCFG2_OFS]\r
298                 ENDIF\r
299 \r
300                 IF      BCFG3_SETUP <> 0\r
301                 LDR     R1, =BCFG3_Val\r
302                 STR     R1, [R0, #BCFG3_OFS]\r
303                 ENDIF\r
304 \r
305                 ENDIF   ; EMC_SETUP\r
306 \r
307 \r
308 ; Setup VPBDIV\r
309                 IF      VPBDIV_SETUP <> 0\r
310                 LDR     R0, =VPBDIV\r
311                 LDR     R1, =VPBDIV_Val\r
312                 STR     R1, [R0]\r
313                 ENDIF\r
314 \r
315 \r
316 ; Setup PLL\r
317                 IF      PLL_SETUP <> 0\r
318                 LDR     R0, =PLL_BASE\r
319                 MOV     R1, #0xAA\r
320                 MOV     R2, #0x55\r
321 \r
322 ;  Configure and Enable PLL\r
323                 MOV     R3, #PLLCFG_Val\r
324                 STR     R3, [R0, #PLLCFG_OFS] \r
325                 MOV     R3, #PLLCON_PLLE\r
326                 STR     R3, [R0, #PLLCON_OFS]\r
327                 STR     R1, [R0, #PLLFEED_OFS]\r
328                 STR     R2, [R0, #PLLFEED_OFS]\r
329 \r
330 ;  Wait until PLL Locked\r
331 PLL_Loop        LDR     R3, [R0, #PLLSTAT_OFS]\r
332                 ANDS    R3, R3, #PLLSTAT_PLOCK\r
333                 BEQ     PLL_Loop\r
334 \r
335 ;  Switch to PLL Clock\r
336                 MOV     R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)\r
337                 STR     R3, [R0, #PLLCON_OFS]\r
338                 STR     R1, [R0, #PLLFEED_OFS]\r
339                 STR     R2, [R0, #PLLFEED_OFS]\r
340                 ENDIF   ; PLL_SETUP\r
341 \r
342 \r
343 ; Setup MAM\r
344                 IF      MAM_SETUP <> 0\r
345                 LDR     R0, =MAM_BASE\r
346                 MOV     R1, #MAMTIM_Val\r
347                 STR     R1, [R0, #MAMTIM_OFS] \r
348                 MOV     R1, #MAMCR_Val\r
349                 STR     R1, [R0, #MAMCR_OFS] \r
350                 ENDIF   ; MAM_SETUP\r
351 \r
352 \r
353 ; Memory Mapping (when Interrupt Vectors are in RAM)\r
354 MEMMAP          EQU     0xE01FC040      ; Memory Mapping Control\r
355                 IF      :DEF:REMAP\r
356                 LDR     R0, =MEMMAP\r
357                 IF      :DEF:EXTMEM_MODE\r
358                 MOV     R1, #3\r
359                 ELIF    :DEF:RAM_MODE\r
360                 MOV     R1, #2\r
361                 ELSE\r
362                 MOV     R1, #1\r
363                 ENDIF\r
364                 STR     R1, [R0]\r
365                 ENDIF\r
366 \r
367 \r
368 ; Initialise Interrupt System\r
369 ;  ...\r
370 \r
371 \r
372 ; Setup Stack for each mode\r
373 \r
374                 LDR     R0, =Stack_Top\r
375 \r
376 ;  Enter Undefined Instruction Mode and set its Stack Pointer\r
377                 MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit\r
378                 MOV     SP, R0\r
379                 SUB     R0, R0, #UND_Stack_Size\r
380 \r
381 ;  Enter Abort Mode and set its Stack Pointer\r
382                 MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit\r
383                 MOV     SP, R0\r
384                 SUB     R0, R0, #ABT_Stack_Size\r
385 \r
386 ;  Enter FIQ Mode and set its Stack Pointer\r
387                 MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit\r
388                 MOV     SP, R0\r
389                 SUB     R0, R0, #FIQ_Stack_Size\r
390 \r
391 ;  Enter IRQ Mode and set its Stack Pointer\r
392                 MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit\r
393                 MOV     SP, R0\r
394                 SUB     R0, R0, #IRQ_Stack_Size\r
395 \r
396 ;  Enter Supervisor Mode and set its Stack Pointer\r
397                 MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit\r
398                 MOV     SP, R0\r
399                 SUB     R0, R0, #SVC_Stack_Size\r
400 \r
401 ; Enter the C code\r
402 \r
403                 IMPORT  __main\r
404                 LDR     R0, =__main\r
405                 BX      R0\r
406 \r
407 \r
408                 IF      :DEF:__MICROLIB\r
409 \r
410                 EXPORT  __heap_base\r
411                 EXPORT  __heap_limit\r
412 \r
413                 ELSE\r
414 ; User Initial Stack & Heap\r
415                 AREA    |.text|, CODE, READONLY\r
416 \r
417                 IMPORT  __use_two_region_memory\r
418                 EXPORT  __user_initial_stackheap\r
419 __user_initial_stackheap\r
420 \r
421                 LDR     R0, =  Heap_Mem\r
422                 LDR     R1, = (Stack_Mem + IRQ_Stack_Size + USR_Stack_Size)\r
423                 LDR     R2, = (Heap_Mem + Heap_Size)\r
424                 LDR     R3, = Stack_Mem\r
425                 BX      LR\r
426                 ENDIF\r
427 \r
428 \r
429                 END\r