]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/ARM9_STR91X_IAR/91x_init_IAR.s
commit 9f316c246baafa15c542a5aea81a94f26e3d6507
[freertos] / FreeRTOS / Demo / ARM9_STR91X_IAR / 91x_init_IAR.s
1 ;******************** (C) COPYRIGHT 2006 STMicroelectronics ********************\r
2 ;* File Name          : 91x_init.s\r
3 ;* Author             : MCD Application Team\r
4 ;* Date First Issued  : 05/18/2006 : Version 1.0\r
5 ;* Description        : This module performs:\r
6 ;*                      - FLASH/RAM initialization,\r
7 ;*                      - Stack pointer initialization for each mode ,\r
8 ;*                      - Branches to ?main in the C library (which eventually \r
9 ;*                        calls main()).\r
10 ;*\r
11 ;*                    On reset, the ARM core starts up in Supervisor (SVC) mode,\r
12 ;*                    in ARM state,with IRQ and FIQ disabled.\r
13 ;*******************************************************************************\r
14 ; History:\r
15 ; 05/24/2006 : Version 1.1\r
16 ; 05/18/2006 : Version 1.0\r
17 ;*******************************************************************************\r
18 ;* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH\r
19 ;* CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS\r
20 ;* A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT\r
21 ;* OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT\r
22 ;* OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION\r
23 ;* CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
24 ;******************************************************************************/\r
25 \r
26 ; Depending in Your Application, Disable or Enable the following Define\r
27 \r
28 ;         #define  BUFFERED_Mode       ; Work on Buffered mode, when enabling this define\r
29                                ; just enable the Buffered define on 91x_conf.h\r
30 \r
31 ; --- Standard definitions of mode bits and interrupt (I & F) flags in PSRs\r
32 \r
33 Mode_USR           EQU     0x10\r
34 Mode_FIQ           EQU     0x11\r
35 Mode_IRQ           EQU     0x12\r
36 Mode_SVC           EQU     0x13\r
37 Mode_ABT           EQU     0x17\r
38 Mode_UND           EQU     0x1B\r
39 Mode_SYS           EQU     0x1F ; available on ARM Arch 4 and later\r
40 \r
41 I_Bit              EQU     0x80 ; when I bit is set, IRQ is disabled\r
42 F_Bit              EQU     0x40 ; when F bit is set, FIQ is disabled\r
43 \r
44 ;--- BASE ADDRESSES\r
45 ; System memory locations\r
46 \r
47 SRAM_Base               EQU     0x04000000\r
48 SRAM_Limit              EQU     0x04018000                      ; at the top of 96 KB SRAM\r
49 \r
50 SVC_Stack           DEFINE     SRAM_Limit       ; 512 byte SVC stack at\r
51                                                          ; top of memory - used by kernel.\r
52 IRQ_Stack           DEFINE     SVC_Stack-512    ; followed by IRQ stack\r
53 USR_Stack           DEFINE     IRQ_Stack-512    ; followed by USR stack.  Tasks run in\r
54                                                 ; system mode but task stacks are allocated\r
55                                                 ; when the task is created.\r
56 FIQ_Stack           DEFINE     USR_Stack-8      ; followed by FIQ stack\r
57 ABT_Stack           DEFINE     FIQ_Stack-8      ; followed by ABT stack\r
58 UND_Stack               DEFINE     ABT_Stack-8      ; followed by UNDEF stack\r
59 \r
60                                         EXTERN main\r
61 \r
62 ; STR9X register specific definition\r
63 \r
64 FMI_BBSR_AHB_UB                 EQU                     0x54000000\r
65 FMI_BBADR_AHB_UB                EQU                     0x5400000C\r
66 FMI_NBBSR_AHB_UB                EQU                     0x54000004\r
67 FMI_NBBADR_AHB_UB               EQU                     0x54000010\r
68 \r
69 SCU_SCRO_APB1_UB                EQU                     0x4C002034\r
70 SCRO_AHB_UNB    EQU     0x5C002034\r
71 \r
72 \r
73 \r
74 ;---------------------------------------------------------------\r
75 ; ?program_start\r
76 ;---------------------------------------------------------------\r
77                 MODULE  ?program_start\r
78                 RSEG    ICODE:CODE(2)\r
79                 IMPORT    LINK\r
80                 PUBLIC  __program_start\r
81                 EXTERN  ?main\r
82                 CODE32\r
83                 \r
84 \r
85 __program_start:\r
86         LDR     pc, =NextInst\r
87 \r
88 \r
89 NextInst\r
90 \r
91 \r
92         NOP   ; execute some instructions to access CPU registers after wake\r
93         NOP  ; up from Reset, while waiting for OSC stabilization\r
94         NOP\r
95         NOP\r
96         NOP\r
97         NOP\r
98         NOP\r
99         NOP\r
100         NOP\r
101                 ldr r0,=LINK    ; to include the vector table inside the final executable.\r
102 \r
103 \r
104 \r
105 ; --- Remap Flash Bank 0 at address 0x0 and Bank 1 at address 0x80000, \r
106 ;     when the bank 0 is the boot bank, then enable the Bank 1.\r
107 \r
108         LDR R6, =0x54000000\r
109         LDR R7, =0x4\r
110         STR R7, [R6]\r
111 \r
112         LDR R6, =0x54000004\r
113         LDR R7, =0x3\r
114         STR R7, [R6]\r
115 \r
116         LDR R6, =0x5400000C\r
117         LDR R7, =0x0\r
118         STR R7, [R6]\r
119 \r
120         LDR R6, =0x54000010\r
121         LDR R7, =0x20000\r
122         STR R7, [R6]\r
123 \r
124         LDR R6, =0x54000018\r
125         LDR R7, =0x18\r
126         STR R7, [R6]\r
127         \r
128 ; --- Enable 96K RAM\r
129         LDR     R0, = SCRO_AHB_UNB\r
130         LDR     R1, = 0x0196\r
131         STR     R1, [R0]\r
132 \r
133 \r
134         /* Setup a stack for each mode - note that this only sets up a usable stack\r
135         for system/user, SWI and IRQ modes.   Also each mode is setup with\r
136         interrupts initially disabled. */\r
137 \r
138         MSR     CPSR_c, #Mode_FIQ|I_Bit|F_Bit   ; No interrupts\r
139         LDR     SP, =FIQ_Stack\r
140 \r
141         MSR     CPSR_c, #Mode_IRQ|I_Bit|F_Bit   ; No interrupts\r
142         LDR     SP, =IRQ_Stack\r
143 \r
144         MSR     CPSR_c, #Mode_ABT|I_Bit|F_Bit   ; No interrupts\r
145         LDR     SP, =ABT_Stack\r
146 \r
147         MSR     CPSR_c, #Mode_UND|I_Bit|F_Bit   ; No interrupts\r
148         LDR     SP, =UND_Stack\r
149 \r
150         MSR     CPSR_c, #Mode_SVC|I_Bit|F_Bit   ; No interrupts\r
151         LDR     SP, =SVC_Stack\r
152 \r
153         MSR     CPSR_c, #Mode_SYS|I_Bit|F_Bit   ; No interrupts\r
154         LDR     SP, =USR_Stack\r
155 \r
156         /* We want to start in supervisor mode.  Operation will switch to system\r
157         mode when the first task starts. */\r
158         MSR   CPSR_c, #Mode_SVC|I_Bit|F_Bit\r
159 \r
160 \r
161 ; --- Set bits 17-18 of the Core Configuration Control Register\r
162  \r
163         MOV     r0, #0x60000             \r
164         MCR     p15,0x1,r0,c15,c1,0\r
165       \r
166 \r
167 ; --- Now enter the C code\r
168         B       ?main   ; Note : use B not BL, because an application will\r
169                          ; never return this way\r
170 \r
171         LTORG\r
172 \r
173         END\r
174 ;******************* (C) COPYRIGHT 2006 STMicroelectronics *****END OF FILE****\r
175 \r