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