]> rtime.felk.cvut.cz Git - lincan.git/blob - embedded/arch/arm/mach-lpc21xx/libs/hal/startup.S
Included ARM LPC21xx related code from uLan project. The snapshot date is 2008-07-05
[lincan.git] / embedded / arch / arm / mach-lpc21xx / libs / hal / startup.S
1 #/***********************************************************************/
2 #/*  Startup file for LPC21xx MCU applications                          */
3 #/*  Partially inspired by KEIL ELEKTRONIK startup code                 */
4 #/***********************************************************************/
5
6
7 # *** Startup Code (executed after Reset) ***
8
9 # Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
10         .set  MODE_USR, 0x10            // User Mode
11         .set  MODE_FIQ, 0x11            // FIQ Mode
12         .set  MODE_IRQ, 0x12            // IRQ Mode
13         .set  MODE_SVC, 0x13            // Supervisor Mode
14         .set  MODE_ABT, 0x17            // Abort Mode
15         .set  MODE_UND, 0x1B            // Undefined Mode
16         .set  MODE_SYS, 0x1F            // System Mode
17
18         .equ  I_BIT, 0x80               // when I bit is set, IRQ is disabled
19         .equ  F_BIT, 0x40               // when F bit is set, FIQ is disabled
20
21         .set  UND_STACK_SIZE, 0x00000004
22         .set  ABT_STACK_SIZE, 0x00000004
23         .set  FIQ_STACK_SIZE, 0x00000004
24         .set  IRQ_STACK_SIZE, 0X00000400
25         .set  SVC_STACK_SIZE, 0x00000004
26
27 # Starupt Code must be linked first at Address at which it expects to run.
28
29         .text
30 #       .arm
31
32         .global _stack                  // top of stack
33         .global _startup
34         .global  reset_handler
35         .func   _startup
36 _startup:
37
38 reset_handler:  
39
40 # Memory Mapping (when Interrupt Vectors are in RAM)
41         .equ    MEMMAP, 0xE01FC040  /* Memory Mapping Control */
42
43         MOV     R1, #1
44         LDR     R0, =hal_vectors
45         CMP     R0, #0
46         BEQ     mam_sram
47         MOV     R1, #2
48 mam_sram:
49         LDR     R0, =MEMMAP
50         STR     R1, [R0]
51
52 # Initialize Interrupt System
53 # - Set stack location for each mode
54 # - Leave in System Mode with Interrupts Disabled
55 # -----------------------------------------------
56         ldr   r0,=_stack
57         msr   CPSR_c,#MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode
58         mov   sp,r0
59         sub   r0,r0,#UND_STACK_SIZE
60         msr   CPSR_c,#MODE_ABT|I_BIT|F_BIT // Abort Mode
61         mov   sp,r0
62         sub   r0,r0,#ABT_STACK_SIZE
63         msr   CPSR_c,#MODE_FIQ|I_BIT|F_BIT // FIQ Mode
64         mov   sp,r0
65         sub   r0,r0,#FIQ_STACK_SIZE
66         msr   CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode
67         mov   sp,r0
68         sub   r0,r0,#IRQ_STACK_SIZE
69         msr   CPSR_c,#MODE_SVC|I_BIT|F_BIT // Supervisor Mode
70         mov   sp,r0
71         sub   r0,r0,#SVC_STACK_SIZE
72         msr   CPSR_c,#MODE_SYS|I_BIT|F_BIT // System Mode
73         mov   sp,r0
74
75 # Disable interrupt from VIC
76         .equ    VICINTENABLE,    0xFFFFF010
77         .equ    VICINTENCLR,     0xFFFFF014
78         .equ    VICSOFTINT,      0xFFFFF018
79         .equ    VICSOFTINTCLEAR, 0xFFFFF01C
80         LDR     R0, =VICINTENABLE
81         MOV     R1, #0
82         STR     R1, [R0]
83         MOV     R1, #0xFFFFFFFF
84         STR     R1, [R0,#VICINTENCLR-VICINTENABLE]
85         STR     R1, [R0,#VICSOFTINTCLEAR-VICINTENABLE]
86
87 # Enable interrupts and return back into supervisor mode
88         msr   CPSR_c,#MODE_SVC  // Supervisor Mode
89
90 # Relocate .data section (Copy from ROM to RAM)
91         LDR     R1, =_etext
92         LDR     R2, =_data
93         LDR     R3, =_edata
94         CMP     R1, R2
95         BEQ     ZI
96 LoopRel:CMP     R2, R3
97         LDRLO   R0, [R1], #4
98         STRLO   R0, [R2], #4
99         BLO     LoopRel
100
101 ZI:
102 # Clear .bss section (Zero init)
103         MOV     R0, #0
104         LDR     R1, =__bss_start__
105         LDR     R2, =__bss_end__
106 LoopZI: CMP     R1, R2
107         STRLO   R0, [R1], #4
108         BLO     LoopZI
109
110
111 # Enter the C _setup_board code
112         ADR     LR, __main_start
113         LDR     R0, =_setup_board
114         CMP     R0, #0
115         BEQ     __main_start
116         BX      R0
117
118 __main_start:   
119         ADR     LR, __main_exit
120         LDR     R0, =main
121         BX      R0
122
123 __main_exit:    B       __main_exit
124
125         .size   _start, . - _start
126         .endfunc
127
128         .end