]> git.sur5r.net Git - freertos/blob - Demo/ARM7_LPC2129_IAR/SrcIAR/lpc2xxx_cstartup.s
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / ARM7_LPC2129_IAR / SrcIAR / lpc2xxx_cstartup.s
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
2 ;;\r
3 ;; Part one of the system initialization code,\r
4 ;; contains low-level\r
5 ;; initialization.\r
6 ;;\r
7 ;; Copyright 2006 IAR Systems. All rights reserved.\r
8 ;;\r
9 ;; $Revision: 10608 $\r
10 ;;\r
11 \r
12         MODULE  ?cstartup\r
13 \r
14         ;; Forward declaration of sections.\r
15         SECTION IRQ_STACK:DATA:NOROOT(3)\r
16         SECTION ABT_STACK:DATA:NOROOT(3)\r
17         SECTION SVC_STACK:DATA:NOROOT(3)\r
18         SECTION UND_STACK:DATA:NOROOT(3)\r
19         SECTION FIQ_STACK:DATA:NOROOT(3)\r
20         SECTION CSTACK:DATA:NOROOT(3)\r
21 \r
22 ;\r
23 ; The module in this file are included in the libraries, and may be\r
24 ; replaced by any user-defined modules that define the PUBLIC symbol\r
25 ; __iar_program_start or a user defined start symbol.\r
26 ;\r
27 ; To override the cstartup defined in the library, simply add your\r
28 ; modified version to the workbench project.\r
29 \r
30         SECTION .intvec:CODE:NOROOT(2)\r
31 \r
32         PUBLIC  __vector\r
33         PUBLIC  __vector_0x14\r
34         PUBLIC  __iar_program_start\r
35                 EXTERN  vPortYieldProcessor\r
36 \r
37         ARM\r
38 __vector:\r
39         ;;\r
40         ldr   pc,[pc,#+24]              ;; Reset\r
41         ldr   pc,[pc,#+24]              ;; Undefined instructions\r
42 ;;        ldr   pc,[pc,#+24]              ;; Software interrupt (SWI/SVC)\r
43                 b vPortYieldProcessor\r
44         ldr   pc,[pc,#+24]              ;; Prefetch abort\r
45         ldr   pc,[pc,#+24]              ;; Data abort\r
46 __vector_0x14\r
47         DC32  0                         ;; RESERVED\r
48         ldr   pc, [PC, #-0xFF0]         ;; IRQ\r
49         ldr   pc,[pc,#+24]              ;; FIQ\r
50 \r
51         DC32  __iar_program_start       ;; Reset\r
52         DC32  undef_handler             ;; Undefined instructions\r
53         DC32  0       ;; Software interrupt (SWI/SVC)\r
54         DC32  prefetch_handler          ;; Prefetch abort\r
55         DC32  data_handler              ;; Data abort\r
56         DC32  0                         ;; RESERVED\r
57         DC32  0                                 ;; IRQ\r
58         DC32  fiq_handler               ;; FIQ\r
59 \r
60 undef_handler\r
61     b         undef_handler\r
62         \r
63 prefetch_handler\r
64     b         prefetch_handler\r
65 \r
66 data_handler\r
67     b         data_handler\r
68 \r
69 fiq_handler\r
70     b         fiq_handler\r
71 ; --------------------------------------------------\r
72 ; ?cstartup -- low-level system initialization code.\r
73 ;\r
74 ; After a reser execution starts here, the mode is ARM, supervisor\r
75 ; with interrupts disabled.\r
76 ;\r
77 \r
78 \r
79 \r
80         SECTION .text:CODE:NOROOT(2)\r
81 \r
82 ;        PUBLIC  ?cstartup\r
83         EXTERN  ?main\r
84         REQUIRE __vector\r
85 \r
86         ARM\r
87 \r
88 __iar_program_start:\r
89 ?cstartup:\r
90 \r
91 ;\r
92 ; Add initialization needed before setup of stackpointers here.\r
93 ;\r
94 \r
95 ; Errata  MAM.1Incorrect read of data from SRAM after Reset and MAM\r
96 ; is not enabled or partially enabled.\r
97 ; Work-around: User code should enable the MAM after Reset and before\r
98 ; any RAM accesses\r
99 MAMCR    DEFINE  0xE01FC000     ; MAM Control Register\r
100 MAMTIM   DEFINE  0xE01FC004     ; MAM Timing register\r
101 \r
102         ldr     r0,=MAMCR\r
103         ldr     r1,=MAMTIM\r
104         ldr     r2,=0\r
105         str     r2,[r0]\r
106         ldr     r2,=3     ; 1 < 20 MHz; 20 MHz < 2 < 40 MHz; 40MHz > 3\r
107         str     r2,[r1]\r
108         ldr     r2,=2\r
109         str     r2,[r0]\r
110 \r
111 ; Initialize the stack pointers.\r
112 ; The pattern below can be used for any of the exception stacks:\r
113 ; FIQ, IRQ, SVC, ABT, UND, SYS.\r
114 ; The USR mode uses the same stack as SYS.\r
115 ; The stack segments must be defined in the linker command file,\r
116 ; and be declared above.\r
117 ;\r
118 ; --------------------\r
119 ; Mode, correspords to bits 0-5 in CPSR\r
120 MODE_BITS DEFINE  0x1F    ; Bit mask for mode bits in CPSR\r
121 USR_MODE  DEFINE  0x10    ; User mode\r
122 FIQ_MODE  DEFINE  0x11    ; Fast Interrupt Request mode\r
123 IRQ_MODE  DEFINE  0x12    ; Interrupt Request mode\r
124 SVC_MODE  DEFINE  0x13    ; Supervisor mode\r
125 ABT_MODE  DEFINE  0x17    ; Abort mode\r
126 UND_MODE  DEFINE  0x1B    ; Undefined Instruction mode\r
127 SYS_MODE  DEFINE  0x1F    ; System mode\r
128 \r
129         MRS     r0, cpsr                ; Original PSR value\r
130 \r
131         BIC     r0, r0, #MODE_BITS      ; Clear the mode bits\r
132         ORR     r0, r0, #ABT_MODE       ; Set ABT mode bits\r
133         MSR     cpsr_c, r0              ; Change the mode\r
134         LDR     sp, =SFE(ABT_STACK)     ; End of ABT_STACK\r
135 \r
136         BIC     r0, r0, #MODE_BITS      ; Clear the mode bits\r
137         ORR     r0, r0, #SVC_MODE       ; Set SVC mode bits\r
138         MSR     cpsr_c, r0              ; Change the mode\r
139         LDR     sp, =SFE(SVC_STACK)     ; End of SVC_STACK\r
140 \r
141         BIC     r0, r0, #MODE_BITS      ; Clear the mode bits\r
142         ORR     r0, r0, #UND_MODE       ; Set UND mode bits\r
143         MSR     cpsr_c, r0              ; Change the mode\r
144         LDR     sp, =SFE(UND_STACK)     ; End of UND_STACK\r
145 \r
146         BIC     r0, r0, #MODE_BITS      ; Clear the mode bits\r
147         ORR     r0, r0, #FIQ_MODE       ; Set FIQ mode bits\r
148         MSR     cpsr_c, r0              ; Change the mode\r
149         LDR     sp, =SFE(FIQ_STACK)     ; End of FIQ_STACK\r
150 \r
151         BIC     r0, r0, #MODE_BITS      ; Clear the mode bits\r
152         ORR     r0, r0, #IRQ_MODE       ; Set IRQ mode bits\r
153         MSR     cpsr_c, r0              ; Change the mode\r
154         LDR     sp, =SFE(IRQ_STACK)     ; End of IRQ_STACK\r
155 \r
156         BIC     r0 ,r0, #MODE_BITS      ; Clear the mode bits\r
157         ORR     r0 ,r0, #SYS_MODE       ; Set System mode bits\r
158         MSR     cpsr_c, r0              ; Change the mode\r
159         LDR     sp, =SFE(CSTACK)        ; End of CSTACK\r
160 \r
161 #ifdef __ARMVFP__\r
162         ;; Enable the VFP coprocessor.\r
163 \r
164         MOV     r0, #0x40000000         ; Set EN bit in VFP\r
165         FMXR    fpexc, r0               ; FPEXC, clear others.\r
166 \r
167 ;\r
168 ; Disable underflow exceptions by setting flush to zero mode.\r
169 ; For full IEEE 754 underflow compliance this code should be removed\r
170 ; and the appropriate exception handler installed.\r
171 ;\r
172 \r
173         MOV     r0, #0x01000000         ; Set FZ bit in VFP\r
174         FMXR    fpscr, r0               ; FPSCR, clear others.\r
175 #endif\r
176 \r
177 ;\r
178 ; Add more initialization here\r
179 ;\r
180         BIC     r0, r0, #MODE_BITS      ; Clear the mode bits\r
181         ORR     r0, r0, #SVC_MODE       ; Set SVC mode bits\r
182         MSR     cpsr_c, r0              ; Change the mode\r
183                 \r
184 ; Continue to ?main for C-level initialization.\r
185 \r
186         LDR     r0, =?main\r
187         BX      r0\r
188 \r
189         END\r