]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/ARM9_STR91X_IAR/91x_init.s
commit 9f316c246baafa15c542a5aea81a94f26e3d6507
[freertos] / FreeRTOS / Demo / ARM9_STR91X_IAR / 91x_init.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/22/2007 : Version 1.2\r
16 ;* 05/24/2006 : Version 1.1\r
17 ;* 05/18/2006 : Version 1.0\r
18 ;*******************************************************************************\r
19 ;* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH\r
20 ;* CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS\r
21 ;* A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT\r
22 ;* OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT\r
23 ;* OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION\r
24 ;* CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
25 ;******************************************************************************/\r
26 \r
27 ; At power up, the CPU defaults to run on the oscillator clock, so Depending\r
28 ; of your Application, Disable or Enable the following Define\r
29 \r
30   #define  PLL_Clock   ; Use PLL as the default clock source @ 96 MHz only with\r
31                         ; Bank 0 @ 0x0 and Bank 1 @ 0x80000\r
32 ;   #define  RTC_Clock  ; Use RTC as the default clock source\r
33 ;   #define  OSC_Clock  ; Use OSC as the default clock source\r
34 \r
35 \r
36 ; --- Standard definitions of mode bits and interrupt (I & F) flags in PSRs\r
37 \r
38 Mode_USR           EQU     0x10\r
39 Mode_FIQ           EQU     0x11\r
40 Mode_IRQ           EQU     0x12\r
41 Mode_SVC           EQU     0x13\r
42 Mode_ABT           EQU     0x17\r
43 Mode_UND           EQU     0x1B\r
44 Mode_SYS           EQU     0x1F ; available on ARM Arch 4 and later\r
45 \r
46 I_Bit              EQU     0x80 ; when I bit is set, IRQ is disabled\r
47 F_Bit              EQU     0x40 ; when F bit is set, FIQ is disabled\r
48 \r
49 \r
50 \r
51 ; --- STR9X SCU specific definitions\r
52 \r
53 SCU_BASE_Address    EQU     0x5C002000 ; SCU Base Address\r
54 SCU_CLKCNTR_OFST    EQU     0x00000000 ; Clock Control register Offset\r
55 SCU_PLLCONF_OFST    EQU     0x00000004 ; PLL Configuration register Offset\r
56 SCU_SYSSTATUS_OFST  EQU     0x00000008 ; System Status Register Offset\r
57 SCU_SCR0_OFST       EQU     0x00000034 ; System Configuration Register 0 Offset\r
58 \r
59 ; --- STR9X FMI specific definitions\r
60 \r
61 FMI_BASE_Address    EQU     0x54000000 ; FMI Base Address\r
62 FMI_BBSR_OFST       EQU     0x00000000 ; Boot Bank Size Register\r
63 FMI_NBBSR_OFST      EQU     0x00000004 ; Non-boot Bank Size Register\r
64 FMI_BBADR_OFST      EQU     0x0000000C ; Boot Bank Base Address Register\r
65 FMI_NBBADR_OFST     EQU     0x00000010 ; Non-boot Bank Base Address Register\r
66 FMI_CR_OFST         EQU     0x00000018 ; Control Register\r
67 \r
68 ;---------------------------------------------------------------\r
69 ; ?program_start\r
70 ;---------------------------------------------------------------\r
71        MODULE  ?program_start\r
72 \r
73        SECTION     IRQ_STACK:DATA:NOROOT(3)\r
74        SECTION     FIQ_STACK:DATA:NOROOT(3)\r
75        SECTION     UND_STACK:DATA:NOROOT(3)\r
76        SECTION     ABT_STACK:DATA:NOROOT(3)             \r
77        SECTION     SVC_STACK:DATA:NOROOT(3)\r
78        SECTION     CSTACK:DATA:NOROOT(3)\r
79        SECTION .icode:CODE:NOROOT(2)\r
80        PUBLIC __iar_program_start\r
81        EXTERN  ?main\r
82        CODE32\r
83 \r
84 __iar_program_start:\r
85         LDR     pc, =NextInst\r
86 \r
87 \r
88 NextInst\r
89 \r
90 \r
91         NOP   ; execute some instructions to access CPU registers after wake\r
92         NOP   ; up from Reset, while waiting for OSC stabilization\r
93         NOP\r
94         NOP\r
95         NOP\r
96         NOP\r
97         NOP\r
98         NOP\r
99         NOP\r
100 \r
101 \r
102 ; BUFFERED_Mode\r
103 ; ------------------------------------------------------------------------------\r
104 ; Description  :  Enable the Buffered mode.\r
105 ;                 Just enable the buffered define on the 91x_conf.h\r
106 ; http://www.arm.com/pdfs/DDI0164A_966E_S.pdf\r
107 ; ------------------------------------------------------------------------------\r
108 \r
109        MRC     p15, 0, r0, c1, c0, 0   ; Read CP15 register 1 into r0\r
110        ORR     r0, r0, #0x8          ; Enable Write Buffer on AHB\r
111        MCR     p15, 0, r0, c1, c0, 0   ; Write CP15 register 1\r
112 \r
113 \r
114 \r
115 ; --- Remap Flash Bank 0 at address 0x0 and Bank 1 at address 0x80000,\r
116 ;     when the bank 0 is the boot bank, then enable the Bank 1.\r
117 \r
118         LDR     R6, =FMI_BASE_Address\r
119 \r
120         LDR     R7, = 0x4                     ; BOOT BANK Size = 512KB\r
121         STR     R7, [R6, #FMI_BBSR_OFST]      ; (2^4) * 32 = 512KB\r
122 \r
123         LDR     R7, = 0x2                     ; NON BOOT BANK Size = 32KB\r
124         STR     R7, [R6, #FMI_NBBSR_OFST]     ; (2^2) * 8 = 32KB\r
125 \r
126         LDR     R7, = 0x0                     ; BOOT BANK Address = 0x0\r
127         STR     R7, [R6, #FMI_BBADR_OFST]\r
128 \r
129         LDR     R7, = 0x20000                 ; NON BOOT BANK Address = 0x80000\r
130         STR     R7, [R6, #FMI_NBBADR_OFST]    ; need to put 0x20000 because FMI\r
131                                               ; bus on A[25:2] of CPU bus\r
132 \r
133         LDR     R7, = 0x18                    ; Enable CS on both banks\r
134         STR     R7, [R6, #FMI_CR_OFST]        ; LDR     R7, = 0x19 ;in RevD\r
135                                               ; to enable 8 words PFQ deepth\r
136 \r
137 ; --- Enable 96K RAM, PFQBC enabled, DTCM & AHB wait-states disabled\r
138         LDR     R0, = SCU_BASE_Address\r
139         LDR     R1, = 0x0191\r
140         STR     R1, [R0, #SCU_SCR0_OFST]\r
141 \r
142 ; ------------------------------------------------------------------------------\r
143 ; --- System clock configuration\r
144 ; ------------------------------------------------------------------------------\r
145 \r
146 #ifdef PLL_Clock  ; Use 96 MHZ PLL clock as the default frequency\r
147 \r
148 ; --- wait states Flash confguration\r
149 \r
150         LDR     R6, = 0x00080000            ;Write a Write Flash Configuration\r
151         LDR     R7, =0x60                   ;Register command (60h) to any word\r
152         STRH    R7, [R6]                    ;address in Bank 1.\r
153 \r
154         LDR     R6, = 0x00083040            ;Write a Write Flash Configuration\r
155         LDR     R7, = 0x3                   ;Register Confirm command (03h)\r
156         STRH    R7, [R6]                    ;2Wstaites in read,PWD,LVD enabled,\r
157                                             ;High BUSCFG.\r
158 ; --- PLL configuration\r
159         LDR     R1, = 0x00020002              ;Set OSC as clock source\r
160         STR     R1, [R0, #SCU_CLKCNTR_OFST ]\r
161 \r
162 \r
163         NOP     ; Wait for OSC stabilization\r
164         NOP\r
165         NOP\r
166         NOP\r
167         NOP\r
168         NOP\r
169         NOP\r
170         NOP\r
171         NOP\r
172         NOP\r
173         NOP\r
174         NOP\r
175 \r
176 \r
177                 \r
178                 \r
179         LDR     R1, = 0x000ac019               ;Set PLL ENABLE, to 96Mhz\r
180         STR     R1, [R0, #SCU_PLLCONF_OFST]\r
181 \r
182 Wait_Loop\r
183         LDR     R1,[R0, #SCU_SYSSTATUS_OFST]   ;Wait until PLL is Locked\r
184         ANDS    R1, R1, #0x01\r
185         BEQ     Wait_Loop\r
186 \r
187         LDR     R1, = 0x00020080             ;Set PLL as clock source after pll\r
188         STR     R1, [R0, #SCU_CLKCNTR_OFST ] ;is locked and  FMICLK=RCLK,\r
189                                              ;PCLK=RCLK/2\r
190 #endif\r
191 \r
192 #ifdef  RTC_Clock   ;Use RTC  as the default clock source\r
193         LDR     R1, = 0x00020001              ;Set RTC as clock source and\r
194         STR     R1, [R0, #SCU_CLKCNTR_OFST ]  ;FMICLK=RCLK, PCLK=RCLK\r
195 #endif\r
196 \r
197 #ifdef OSC_Clock  ;Use Osc as the default clock source\r
198         LDR     R1, = 0x00020002              ;Set OSC as clock source  and\r
199         STR     R1, [R0, #SCU_CLKCNTR_OFST ]  ;FMICLK=RCLK, PCLK=RCLK\r
200 #endif\r
201 \r
202 \r
203 ; --- Initialize Stack pointer registers\r
204 \r
205 ; Enter each mode in turn and set up the stack pointer\r
206 \r
207        MSR     CPSR_c, #Mode_FIQ|I_Bit|F_Bit    ; No interrupts\r
208        LDR     SP, =SFE(FIQ_STACK)\r
209 \r
210        MSR     CPSR_c, #Mode_IRQ|I_Bit|F_Bit    ; No interrupts\r
211        LDR     SP, = SFE(IRQ_STACK)\r
212 \r
213        MSR     CPSR_c, #Mode_ABT|I_Bit|F_Bit    ; No interrupts\r
214        LDR     SP, = SFE(ABT_STACK)\r
215         \r
216        MSR     CPSR_c, #Mode_UND|I_Bit|F_Bit    ; No interrupts\r
217        LDR     SP, = SFE(UND_STACK)\r
218 \r
219         MSR     CPSR_c, #Mode_SYS               ; IRQs & FIQs are now enabled\r
220         LDR     SP, = SFE(CSTACK)\r
221 \r
222        MSR     CPSR_c, #Mode_SVC|I_Bit|F_Bit    ; No interrupts\r
223        LDR     SP, = SFE(SVC_STACK)\r
224 \r
225 ; --- Set bits 17-18(DTCM/ITCM order bits)of the Core Configuration Control\r
226 ;     Register\r
227        MOV     r0, #0x60000\r
228        MCR     p15,0x1,r0,c15,c1,0\r
229 \r
230 ; --- Now enter the C code\r
231         B       ?main   ; Note : use B not BL, because an application will\r
232                          ; never return this way\r
233 \r
234         LTORG\r
235 \r
236 \r
237         END\r
238 ;******************* (C) COPYRIGHT 2006 STMicroelectronics *****END OF FILE****\r
239 \r
240 \r
241 \r
242 \r