]> git.sur5r.net Git - freertos/blob - Demo/lwIP_Demo_Rowley_ARM7/AT91SAM7_Startup.s
Update to FreeRTOS V6.1.0 release candidate.
[freertos] / Demo / lwIP_Demo_Rowley_ARM7 / AT91SAM7_Startup.s
1 /*****************************************************************************\r
2   Exception handlers and startup code for ATMEL AT91SAM7.\r
3 \r
4   Copyright (c) 2004 Rowley Associates Limited.\r
5 \r
6   This file may be distributed under the terms of the License Agreement\r
7   provided with this software. \r
8  \r
9   THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE\r
10   WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
11  *****************************************************************************/\r
12 \r
13 #define REG_BASE 0xFFFFF000\r
14 #define CKGR_MOR_OFFSET 0xC20\r
15 #define CKGR_PLLR_OFFSET 0xC2C\r
16 #define PMC_MCKR_OFFSET 0xC30\r
17 #define PMC_SR_OFFSET 0xC68\r
18 #define WDT_MR_OFFSET 0xD44\r
19 #define MC_RCR_OFFSET 0xF00\r
20 #define MC_FMR_OFFSET 0xF60\r
21 \r
22 #define CKGR_MOR_MOSCEN (1 << 0)\r
23 #define CKGR_MOR_OSCBYPASS (1 << 1)\r
24 #define CKGR_MOR_OSCOUNT_BIT_OFFSET (8)\r
25 \r
26 #define CKGR_PLLR_DIV_BIT_OFFSET (0)\r
27 #define CKGR_PLLR_PLLCOUNT_BIT_OFFSET (8)\r
28 #define CKGR_PLLR_OUT_BIT_OFFSET (14)\r
29 #define CKGR_PLLR_MUL_BIT_OFFSET (16)\r
30 #define CKGR_PLLR_USBDIV_BIT_OFFSET (28)\r
31 \r
32 #define PMC_MCKR_CSS_MAIN_CLOCK (0x1)\r
33 #define PMC_MCKR_CSS_PLL_CLOCK (0x3)\r
34 #define PMC_MCKR_PRES_CLK (0)\r
35 #define PMC_MCKR_PRES_CLK_2 (1 << 2)\r
36 #define PMC_MCKR_PRES_CLK_4 (2 << 2)\r
37 #define PMC_MCKR_PRES_CLK_8 (3 << 2)\r
38 #define PMC_MCKR_PRES_CLK_16 (4 << 2)\r
39 #define PMC_MCKR_PRES_CLK_32 (5 << 2)\r
40 #define PMC_MCKR_PRES_CLK_64 (6 << 2)\r
41 \r
42 #define PMC_SR_MOSCS (1 << 0)\r
43 #define PMC_SR_LOCK (1 << 2)\r
44 #define PMC_SR_MCKRDY (1 << 3)\r
45 #define PMC_SR_PCKRDY0 (1 << 8)\r
46 #define PMC_SR_PCKRDY1 (1 << 9)\r
47 #define PMC_SR_PCKRDY2 (1 << 10)\r
48 \r
49 #define MC_RCR_RCB (1 << 0)\r
50 \r
51 #define MC_FMR_FWS_0FWS (0)\r
52 #define MC_FMR_FWS_1FWS (1 << 8)\r
53 #define MC_FMR_FWS_2FWS (2 << 8)\r
54 #define MC_FMR_FWS_3FWS (3 << 8)\r
55 #define MC_FMR_FMCN_BIT_OFFSET 16\r
56 \r
57 #define WDT_MR_WDDIS (1 << 15)\r
58 \r
59   .section .vectors, "ax"\r
60   .code 32\r
61   .align 0\r
62   \r
63 /*****************************************************************************\r
64   Exception Vectors\r
65  *****************************************************************************/\r
66 _vectors:\r
67   ldr pc, [pc, #reset_handler_address - . - 8]  /* reset */\r
68   ldr pc, [pc, #undef_handler_address - . - 8]  /* undefined instruction */\r
69   ldr pc, [pc, #swi_handler_address - . - 8]    /* swi handler */\r
70   ldr pc, [pc, #pabort_handler_address - . - 8] /* abort prefetch */\r
71   ldr pc, [pc, #dabort_handler_address - . - 8] /* abort data */\r
72   nop\r
73   ldr pc, [PC, #-0xF20]    /* irq */\r
74   ldr pc, [pc, #fiq_handler_address - . - 8]    /* fiq */\r
75 \r
76 reset_handler_address:\r
77   .word reset_handler\r
78 undef_handler_address:\r
79   .word undef_handler\r
80 swi_handler_address:\r
81   .word swi_handler\r
82 pabort_handler_address:\r
83   .word pabort_handler\r
84 dabort_handler_address:\r
85   .word dabort_handler\r
86 irq_handler_address:\r
87   .word irq_handler\r
88 fiq_handler_address:\r
89   .word fiq_handler\r
90 \r
91   .section .init, "ax"\r
92   .code 32\r
93   .align 0\r
94 \r
95 /******************************************************************************\r
96   Reset handler\r
97  ******************************************************************************/\r
98 reset_handler:\r
99 \r
100 \r
101   ldr r10, =REG_BASE\r
102 \r
103   /* Set up FLASH wait state */\r
104   ldr r0, =(50 << MC_FMR_FMCN_BIT_OFFSET) | MC_FMR_FWS_1FWS\r
105   str r0, [r10, #MC_FMR_OFFSET]\r
106 \r
107   /* Disable Watchdog */\r
108   ldr r0, =WDT_MR_WDDIS\r
109   str r0, [r10, #WDT_MR_OFFSET]\r
110 \r
111   /* Enable the main oscillator */\r
112   ldr r0, =(6 << CKGR_MOR_OSCOUNT_BIT_OFFSET) | CKGR_MOR_MOSCEN\r
113   str r0, [r10, #CKGR_MOR_OFFSET]\r
114   \r
115 1:/* Wait for main oscillator to stabilize */\r
116   ldr r0, [r10, #PMC_SR_OFFSET]\r
117   tst r0, #PMC_SR_MOSCS\r
118   beq 1b\r
119 \r
120   /* Set up the PLL */\r
121   ldr r0, =(5 << CKGR_PLLR_DIV_BIT_OFFSET) | (28 << CKGR_PLLR_PLLCOUNT_BIT_OFFSET) | (25 << CKGR_PLLR_MUL_BIT_OFFSET)\r
122   str r0, [r10, #CKGR_PLLR_OFFSET]\r
123   \r
124 1:/* Wait for PLL to lock */\r
125   ldr r0, [r10, #PMC_SR_OFFSET]\r
126   tst r0, #PMC_SR_LOCK\r
127   beq 1b\r
128 \r
129   /* Select PLL as clock source */\r
130   ldr r0, =(PMC_MCKR_CSS_PLL_CLOCK | PMC_MCKR_PRES_CLK_2)\r
131   str r0, [r10, #PMC_MCKR_OFFSET]\r
132   \r
133 #ifdef __FLASH_BUILD\r
134   /* Copy exception vectors into Internal SRAM */\r
135   mov r8, #0x00200000\r
136   ldr r9, =_vectors\r
137   ldmia r9!, {r0-r7}\r
138   stmia r8!, {r0-r7}\r
139   ldmia r9!, {r0-r6}\r
140   stmia r8!, {r0-r6}\r
141 \r
142   /* Remap Internal SRAM to 0x00000000 */\r
143   ldr r0, =MC_RCR_RCB\r
144   strb r0, [r10, #MC_RCR_OFFSET]\r
145 #endif\r
146 \r
147 \r
148   /* Jump to the default C runtime startup code. */\r
149   b _start\r
150 \r
151 /******************************************************************************\r
152   Default exception handlers\r
153   (These are declared weak symbols so they can be redefined in user code)\r
154  ******************************************************************************/\r
155 undef_handler:\r
156   b undef_handler\r
157   \r
158 swi_handler:\r
159   b swi_handler\r
160   \r
161 pabort_handler:\r
162   b pabort_handler\r
163   \r
164 dabort_handler:\r
165   b dabort_handler\r
166   \r
167 irq_handler:\r
168   b irq_handler\r
169   \r
170 fiq_handler:\r
171   b fiq_handler\r
172 \r
173   .weak undef_handler, swi_handler, pabort_handler, dabort_handler, irq_handler, fiq_handler\r