]>
Commit | Line | Data |
---|---|---|
074cff0d WD |
1 | /* |
2 | * Startup Code for S3C44B0 CPU-core | |
3 | * | |
4 | * (C) Copyright 2004 | |
5 | * DAVE Srl | |
6 | * | |
7 | * http://www.dave-tech.it | |
8 | * http://www.wawnet.biz | |
9 | * mailto:[email protected] | |
10 | * | |
11 | * See file CREDITS for list of people who contributed to this | |
12 | * project. | |
13 | * | |
14 | * This program is free software; you can redistribute it and/or | |
15 | * modify it under the terms of the GNU General Public License as | |
16 | * published by the Free Software Foundation; either version 2 of | |
17 | * the License, or (at your option) any later version. | |
18 | * | |
19 | * This program is distributed in the hope that it will be useful, | |
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
22 | * GNU General Public License for more details. | |
23 | * | |
24 | * You should have received a copy of the GNU General Public License | |
25 | * along with this program; if not, write to the Free Software | |
26 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
27 | * MA 02111-1307 USA | |
28 | */ | |
29 | ||
30 | ||
31 | #include <config.h> | |
32 | #include <version.h> | |
33 | ||
34 | ||
35 | /* | |
36 | * Jump vector table | |
37 | */ | |
38 | ||
39 | ||
40 | .globl _start | |
41 | _start: b reset | |
42 | add pc, pc, #0x0c000000 | |
43 | add pc, pc, #0x0c000000 | |
44 | add pc, pc, #0x0c000000 | |
45 | add pc, pc, #0x0c000000 | |
46 | add pc, pc, #0x0c000000 | |
47 | add pc, pc, #0x0c000000 | |
48 | add pc, pc, #0x0c000000 | |
49 | ||
50 | .balignl 16,0xdeadbeef | |
51 | ||
52 | ||
53 | /* | |
54 | ************************************************************************* | |
55 | * | |
56 | * Startup Code (reset vector) | |
57 | * | |
58 | * do important init only if we don't start from memory! | |
59 | * relocate u-boot to ram | |
60 | * setup stack | |
61 | * jump to second stage | |
62 | * | |
63 | ************************************************************************* | |
64 | */ | |
65 | ||
66 | _TEXT_BASE: | |
67 | .word TEXT_BASE | |
68 | ||
69 | .globl _armboot_start | |
70 | _armboot_start: | |
71 | .word _start | |
72 | ||
73 | /* | |
42dfe7a1 | 74 | * These are defined in the board-specific linker script. |
074cff0d | 75 | */ |
42dfe7a1 WD |
76 | .globl _bss_start |
77 | _bss_start: | |
78 | .word __bss_start | |
79 | ||
80 | .globl _bss_end | |
81 | _bss_end: | |
82 | .word _end | |
074cff0d WD |
83 | |
84 | #ifdef CONFIG_USE_IRQ | |
85 | /* IRQ stack memory (calculated at run-time) */ | |
86 | .globl IRQ_STACK_START | |
87 | IRQ_STACK_START: | |
88 | .word 0x0badc0de | |
89 | ||
90 | /* IRQ stack memory (calculated at run-time) */ | |
91 | .globl FIQ_STACK_START | |
92 | FIQ_STACK_START: | |
93 | .word 0x0badc0de | |
94 | #endif | |
95 | ||
96 | ||
97 | /* | |
98 | * the actual reset code | |
99 | */ | |
100 | ||
101 | reset: | |
102 | /* | |
103 | * set the cpu to SVC32 mode | |
104 | */ | |
105 | mrs r0,cpsr | |
106 | bic r0,r0,#0x1f | |
107 | orr r0,r0,#0x13 | |
108 | msr cpsr,r0 | |
109 | ||
110 | /* | |
111 | * we do sys-critical inits only at reboot, | |
112 | * not when booting from ram! | |
113 | */ | |
114 | ||
8aa1a2d1 | 115 | #ifndef CONFIG_SKIP_LOWLEVEL_INIT |
074cff0d WD |
116 | bl cpu_init_crit |
117 | /* | |
118 | * before relocating, we have to setup RAM timing | |
119 | * because memory timing is board-dependend, you will | |
400558b5 | 120 | * find a lowlevel_init.S in your board directory. |
074cff0d | 121 | */ |
400558b5 | 122 | bl lowlevel_init |
074cff0d WD |
123 | #endif |
124 | ||
8aa1a2d1 | 125 | #ifndef CONFIG_SKIP_RELOCATE_UBOOT |
074cff0d WD |
126 | relocate: /* relocate U-Boot to RAM */ |
127 | adr r0, _start /* r0 <- current position of code */ | |
128 | ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ | |
129 | cmp r0, r1 /* don't reloc during debug */ | |
130 | beq stack_setup | |
131 | ||
132 | ldr r2, _armboot_start | |
42dfe7a1 | 133 | ldr r3, _bss_start |
074cff0d WD |
134 | sub r2, r3, r2 /* r2 <- size of armboot */ |
135 | add r2, r0, r2 /* r2 <- source end address */ | |
136 | ||
137 | copy_loop: | |
138 | ldmia r0!, {r3-r10} /* copy from source address [r0] */ | |
139 | stmia r1!, {r3-r10} /* copy to target address [r1] */ | |
140 | cmp r0, r2 /* until source end addreee [r2] */ | |
141 | ble copy_loop | |
142 | ||
143 | /* | |
144 | now copy to sram the interrupt vector | |
145 | */ | |
146 | adr r0, real_vectors | |
147 | add r2, r0, #1024 | |
148 | ldr r1, =0x0c000000 | |
149 | add r1, r1, #0x08 | |
150 | vector_copy_loop: | |
151 | ldmia r0!, {r3-r10} | |
152 | stmia r1!, {r3-r10} | |
153 | cmp r0, r2 | |
154 | ble vector_copy_loop | |
8aa1a2d1 | 155 | #endif /* CONFIG_SKIP_RELOCATE_UBOOT */ |
074cff0d WD |
156 | |
157 | /* Set up the stack */ | |
158 | stack_setup: | |
159 | ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ | |
160 | sub r0, r0, #CFG_MALLOC_LEN /* malloc area */ | |
161 | sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */ | |
162 | #ifdef CONFIG_USE_IRQ | |
163 | sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) | |
164 | #endif | |
165 | sub sp, r0, #12 /* leave 3 words for abort-stack */ | |
166 | ||
167 | ldr pc, _start_armboot | |
168 | ||
169 | _start_armboot: .word start_armboot | |
170 | ||
171 | ||
172 | /* | |
173 | ************************************************************************* | |
174 | * | |
175 | * CPU_init_critical registers | |
176 | * | |
177 | * setup important registers | |
178 | * setup memory timing | |
179 | * | |
180 | ************************************************************************* | |
181 | */ | |
182 | ||
183 | #define INTCON (0x01c00000+0x200000) | |
184 | #define INTMSK (0x01c00000+0x20000c) | |
185 | #define LOCKTIME (0x01c00000+0x18000c) | |
186 | #define PLLCON (0x01c00000+0x180000) | |
187 | #define CLKCON (0x01c00000+0x180004) | |
188 | #define WTCON (0x01c00000+0x130000) | |
189 | cpu_init_crit: | |
190 | /* disable watch dog */ | |
53677ef1 | 191 | ldr r0, =WTCON |
074cff0d WD |
192 | ldr r1, =0x0 |
193 | str r1, [r0] | |
194 | ||
195 | /* | |
196 | * mask all IRQs by clearing all bits in the INTMRs | |
197 | */ | |
198 | ldr r1,=INTMSK | |
199 | ldr r0, =0x03fffeff | |
200 | str r0, [r1] | |
201 | ||
202 | ldr r1, =INTCON | |
203 | ldr r0, =0x05 | |
204 | str r0, [r1] | |
205 | ||
206 | /* Set Clock Control Register */ | |
207 | ldr r1, =LOCKTIME | |
208 | ldrb r0, =800 | |
209 | strb r0, [r1] | |
210 | ||
211 | ldr r1, =PLLCON | |
212 | ||
213 | #if CONFIG_S3C44B0_CLOCK_SPEED==66 | |
53677ef1 | 214 | ldr r0, =0x34031 /* 66MHz (Quartz=11MHz) */ |
074cff0d WD |
215 | #elif CONFIG_S3C44B0_CLOCK_SPEED==75 |
216 | ldr r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz */ | |
217 | #else | |
218 | # error CONFIG_S3C44B0_CLOCK_SPEED undefined | |
219 | #endif | |
220 | ||
221 | str r0, [r1] | |
222 | ||
223 | ldr r1,=CLKCON | |
224 | ldr r0, =0x7ff8 | |
225 | str r0, [r1] | |
226 | ||
227 | mov pc, lr | |
228 | ||
229 | ||
230 | /*************************************************/ | |
231 | /* interrupt vectors */ | |
232 | /*************************************************/ | |
233 | real_vectors: | |
234 | b reset | |
235 | b undefined_instruction | |
236 | b software_interrupt | |
237 | b prefetch_abort | |
238 | b data_abort | |
239 | b not_used | |
240 | b irq | |
241 | b fiq | |
242 | ||
243 | /*************************************************/ | |
244 | ||
245 | undefined_instruction: | |
246 | mov r6, #3 | |
247 | b reset | |
248 | ||
249 | software_interrupt: | |
250 | mov r6, #4 | |
251 | b reset | |
252 | ||
253 | prefetch_abort: | |
254 | mov r6, #5 | |
255 | b reset | |
256 | ||
257 | data_abort: | |
258 | mov r6, #6 | |
259 | b reset | |
260 | ||
261 | not_used: | |
262 | /* we *should* never reach this */ | |
263 | mov r6, #7 | |
264 | b reset | |
265 | ||
266 | irq: | |
267 | mov r6, #8 | |
268 | b reset | |
269 | ||
270 | fiq: | |
271 | mov r6, #9 | |
272 | b reset |