⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 start.s.l

📁 嵌入式试验箱S3C2410的bootloader源代码
💻 L
字号:
01 /*02  *  armboot - Startup Code for ARM920 CPU-core03  *04  *  Copyright (c) 2001	Marius Gr鰃er <mag@sysgo.de>05  *  Copyright (c) 2002	Alex Z黳ke <azu@sysgo.de>06  *  Copyright (c) 2002	Gary Jennejohn <gj@denx.de>07  *08  * See file CREDITS for list of people who contributed to this09  * project.10  *11  * This program is free software; you can redistribute it and/or12  * modify it under the terms of the GNU General Public License as13  * published by the Free Software Foundation; either version 2 of14  * the License, or (at your option) any later version.15  *16  * This program is distributed in the hope that it will be useful,17  * but WITHOUT ANY WARRANTY; without even the implied warranty of18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the19  * GNU General Public License for more details.20  *21  * You should have received a copy of the GNU General Public License22  * along with this program; if not, write to the Free Software23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,24  * MA 02111-1307 USA25  */26 27 28 #include <config.h>29 #include <version.h>30 31 32 /*33  *************************************************************************34  *35  * Jump vector table as in table 3.1 in [1]36  *37  *************************************************************************38  */39 40 41 .globl _start42 _start:	b       reset43 	ldr	pc, _undefined_instruction44 	ldr	pc, _software_interrupt45 	ldr	pc, _prefetch_abort46 	ldr	pc, _data_abort47 	ldr	pc, _not_used48 	ldr	pc, _irq49 	ldr	pc, _fiq50 51 _undefined_instruction:	.word undefined_instruction52 _software_interrupt:	.word software_interrupt53 _prefetch_abort:	.word prefetch_abort54 _data_abort:		.word data_abort55 _not_used:		.word not_used56 _irq:			.word irq57 _fiq:			.word fiq58 59 	.balignl 16,0xdeadbeef60 61 62 /*63  *************************************************************************64  *65  * Startup Code (reset vector)66  *67  * do important init only if we don't start from memory!68  * relocate armboot to ram69  * setup stack70  * jump to second stage71  *72  *************************************************************************73  */74 75 _TEXT_BASE:76 	.word	TEXT_BASE77 78 .globl _armboot_start79 _armboot_start:80 	.word _start81 82 /*83  * These are defined in the board-specific linker script.84  */85 .globl _bss_start86 _bss_start:87 	.word __bss_start88 89 .globl _bss_end90 _bss_end:91 	.word _end92 93 #ifdef CONFIG_USE_IRQ94 /* IRQ stack memory (calculated at run-time) */95 .globl IRQ_STACK_START96 IRQ_STACK_START:97 	.word	0x0badc0de98 99 /* IRQ stack memory (calculated at run-time) */100 .globl FIQ_STACK_START101 FIQ_STACK_START:102 	.word 0x0badc0de103 #endif104 105 106 /*107  * the actual reset code108  */109 110 reset:111 	/*112 	 * set the cpu to SVC32 mode113 	 */114 	mrs	r0,cpsr115 	bic	r0,r0,#0x1f116 	orr	r0,r0,#0xd3117 	msr	cpsr,r0118 119 /* turn off the watchdog */120 #if defined(CONFIG_S3C2400)121 # define pWTCON		0x15300000122 # define INTMSK		0x14400008	/* Interupt-Controller base addresses */123 # define CLKDIVN	0x14800014	/* clock divisor register */124 #elif defined(CONFIG_S3C2410)125 # define pWTCON		0x53000000126 # define INTMSK		0x4A000008	/* Interupt-Controller base addresses */127 # define INTSUBMSK	0x4A00001C128 # define CLKDIVN	0x4C000014	/* clock divisor register */129 #endif130 131 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)132 	ldr     r0, =pWTCON133 	mov     r1, #0x0134 	str     r1, [r0]135 136 	/*137 	 * mask all IRQs by setting all bits in the INTMR - default138 	 */139 	mov	r1, #0xffffffff140 	ldr	r0, =INTMSK141 	str	r1, [r0]142 # if defined(CONFIG_S3C2410)143 	ldr	r1, =0x3ff144 	ldr	r0, =INTSUBMSK145 	str	r1, [r0]146 # endif147 148 	/* FCLK:HCLK:PCLK = 1:2:4 */149 	/* default FCLK is 120 MHz ! */150 	ldr	r0, =CLKDIVN151 	mov	r1, #3152 	str	r1, [r0]153 #endif	/* CONFIG_S3C2400 || CONFIG_S3C2410 */154 155 	/*156 	 * we do sys-critical inits only at reboot,157 	 * not when booting from ram!158 	 */159 #ifndef CONFIG_SKIP_LOWLEVEL_INIT160 	bl	cpu_init_crit161 #endif162 163 #ifndef CONFIG_SKIP_RELOCATE_UBOOT164 relocate:				/* relocate U-Boot to RAM	    */165 	adr	r0, _start		/* r0 <- current position of code   */166 	ldr	r1, _TEXT_BASE		/* test if we run from flash or RAM */167 	cmp     r0, r1                  /* don't reloc during debug         */168 	beq     stack_setup169 170 	ldr	r2, _armboot_start171 	ldr	r3, _bss_start172 	sub	r2, r3, r2		/* r2 <- size of armboot            */173 	add	r2, r0, r2		/* r2 <- source end address         */174 175 copy_loop:176 	ldmia	r0!, {r3-r10}		/* copy from source address [r0]    */177 	stmia	r1!, {r3-r10}		/* copy to   target address [r1]    */178 	cmp	r0, r2			/* until source end addreee [r2]    */179 	ble	copy_loop180 #endif	/* CONFIG_SKIP_RELOCATE_UBOOT */181 182 	/* Set up the stack						    */183 stack_setup:184 	ldr	r0, _TEXT_BASE		/* upper 128 KiB: relocated uboot   */185 	sub	r0, r0, #CFG_MALLOC_LEN	/* malloc area                      */186 	sub	r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */187 #ifdef CONFIG_USE_IRQ188 	sub	r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)189 #endif190 	sub	sp, r0, #12		/* leave 3 words for abort-stack    */191 192 clear_bss:193 	ldr	r0, _bss_start		/* find start of bss segment        */194 	ldr	r1, _bss_end		/* stop here                        */195 	mov 	r2, #0x00000000		/* clear                            */196 197 clbss_l:str	r2, [r0]		/* clear loop...                    */198 	add	r0, r0, #4199 	cmp	r0, r1200 	ble	clbss_l201 202 #if 0203 	/* try doing this stuff after the relocation */204 	ldr     r0, =pWTCON205 	mov     r1, #0x0206 	str     r1, [r0]207 208 	/*209 	 * mask all IRQs by setting all bits in the INTMR - default210 	 */211 	mov	r1, #0xffffffff212 	ldr	r0, =INTMR213 	str	r1, [r0]214 215 	/* FCLK:HCLK:PCLK = 1:2:4 */216 	/* default FCLK is 120 MHz ! */217 	ldr	r0, =CLKDIVN218 	mov	r1, #3219 	str	r1, [r0]220 	/* END stuff after relocation */221 #endif222 223 	ldr	pc, _start_armboot224 225 _start_armboot:	.word start_armboot226 227 228 /*229  *************************************************************************230  *231  * CPU_init_critical registers232  *233  * setup important registers234  * setup memory timing235  *236  *************************************************************************237  */238 239 240 #ifndef CONFIG_SKIP_LOWLEVEL_INIT241 cpu_init_crit:242 	/*243 	 * flush v4 I/D caches244 	 */245 	mov	r0, #0246 	mcr	p15, 0, r0, c7, c7, 0	/* flush v3/v4 cache */247 	mcr	p15, 0, r0, c8, c7, 0	/* flush v4 TLB */248 249 	/*250 	 * disable MMU stuff and caches251 	 */252 	mrc	p15, 0, r0, c1, c0, 0253 	bic	r0, r0, #0x00002300	@ clear bits 13, 9:8 (--V- --RS)254 	bic	r0, r0, #0x00000087	@ clear bits 7, 2:0 (B--- -CAM)255 	orr	r0, r0, #0x00000002	@ set bit 2 (A) Align256 	orr	r0, r0, #0x00001000	@ set bit 12 (I) I-Cache257 	mcr	p15, 0, r0, c1, c0, 0258 259 	/*260 	 * before relocating, we have to setup RAM timing261 	 * because memory timing is board-dependend, you will262 	 * find a lowlevel_init.S in your board directory.263 	 */264 	mov	ip, lr265 	bl	lowlevel_init266 	mov	lr, ip267 	mov	pc, lr268 #endif /* CONFIG_SKIP_LOWLEVEL_INIT */269 270 /*271  *************************************************************************272  *273  * Interrupt handling274  *275  *************************************************************************276  */277 278 @279 @ IRQ stack frame.280 @281 #define S_FRAME_SIZE	72282 283 #define S_OLD_R0	68284 #define S_PSR		64285 #define S_PC		60286 #define S_LR		56287 #define S_SP		52288 289 #define S_IP		48290 #define S_FP		44291 #define S_R10		40292 #define S_R9		36293 #define S_R8		32294 #define S_R7		28295 #define S_R6		24296 #define S_R5		20297 #define S_R4		16298 #define S_R3		12299 #define S_R2		8300 #define S_R1		4301 #define S_R0		0302 303 #define MODE_SVC 0x13304 #define I_BIT	 0x80305 306 /*307  * use bad_save_user_regs for abort/prefetch/undef/swi ...308  * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling309  */310 311 	.macro	bad_save_user_regs312 	sub	sp, sp, #S_FRAME_SIZE313 	stmia	sp, {r0 - r12}			@ Calling r0-r12314 	ldr	r2, _armboot_start315 	sub	r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)316 	sub	r2, r2, #(CFG_GBL_DATA_SIZE+8)  @ set base 2 words into abort stack317 	ldmia	r2, {r2 - r3}			@ get pc, cpsr318 	add	r0, sp, #S_FRAME_SIZE		@ restore sp_SVC319 320 	add	r5, sp, #S_SP321 	mov	r1, lr322 	stmia	r5, {r0 - r3}			@ save sp_SVC, lr_SVC, pc, cpsr323 	mov	r0, sp324 	.endm325 326 	.macro	irq_save_user_regs327 	sub	sp, sp, #S_FRAME_SIZE328 	stmia	sp, {r0 - r12}			@ Calling r0-r12329 	add     r8, sp, #S_PC330 	stmdb   r8, {sp, lr}^                   @ Calling SP, LR331 	str     lr, [r8, #0]                    @ Save calling PC332 	mrs     r6, spsr333 	str     r6, [r8, #4]                    @ Save CPSR334 	str     r0, [r8, #8]                    @ Save OLD_R0335 	mov	r0, sp336 	.endm337 338 	.macro	irq_restore_user_regs339 	ldmia	sp, {r0 - lr}^			@ Calling r0 - lr340 	mov	r0, r0341 	ldr	lr, [sp, #S_PC]			@ Get PC342 	add	sp, sp, #S_FRAME_SIZE343 	subs	pc, lr, #4			@ return & move spsr_svc into cpsr344 	.endm345 346 	.macro get_bad_stack347 	ldr	r13, _armboot_start		@ setup our mode stack348 	sub	r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)349 	sub	r13, r13, #(CFG_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack350 351 	str	lr, [r13]			@ save caller lr / spsr352 	mrs	lr, spsr353 	str     lr, [r13, #4]354 355 	mov	r13, #MODE_SVC			@ prepare SVC-Mode356 	@ msr	spsr_c, r13357 	msr	spsr, r13358 	mov	lr, pc359 	movs	pc, lr360 	.endm361 362 	.macro get_irq_stack			@ setup IRQ stack363 	ldr	sp, IRQ_STACK_START364 	.endm365 366 	.macro get_fiq_stack			@ setup FIQ stack367 	ldr	sp, FIQ_STACK_START368 	.endm369 370 /*371  * exception handlers372  */373 	.align  5374 undefined_instruction:375 	get_bad_stack376 	bad_save_user_regs377 	bl 	do_undefined_instruction378 379 	.align	5380 software_interrupt:381 	get_bad_stack382 	bad_save_user_regs383 	bl 	do_software_interrupt384 385 	.align	5386 prefetch_abort:387 	get_bad_stack388 	bad_save_user_regs389 	bl 	do_prefetch_abort390 391 	.align	5392 data_abort:393 	get_bad_stack394 	bad_save_user_regs395 	bl 	do_data_abort396 397 	.align	5398 not_used:399 	get_bad_stack400 	bad_save_user_regs401 	bl 	do_not_used402 403 #ifdef CONFIG_USE_IRQ404 405 	.align	5406 irq:407 	get_irq_stack408 	irq_save_user_regs409 	bl 	do_irq410 	irq_restore_user_regs411 412 	.align	5413 fiq:414 	get_fiq_stack415 	/* someone ought to write a more effiction fiq_save_user_regs */416 	irq_save_user_regs417 	bl 	do_fiq418 	irq_restore_user_regs419 420 #else421 422 	.align	5423 irq:424 	get_bad_stack425 	bad_save_user_regs426 	bl 	do_irq427 428 	.align	5429 fiq:430 	get_bad_stack431 	bad_save_user_regs432 	bl 	do_fiq433 434 #endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -