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

📄 start.s

📁 source code of armboot for s3c4510
💻 S
📖 第 1 页 / 共 2 页
字号:
	 * nTIMER4_INT (36), nTIMER5_INT (37), nWATCHDOG_INT (38)	 */	ldr		r0, =TIMER_TIC	ldr		r1, =0x7f	str		r1, [r0, #0]	mov		pc, lr/* ************************************************************************* * * CPU_init_critical registers * * setup important registers * setup memory timing * ************************************************************************* */MEMCON_INITTBL:	.word 	rB0CON			/* EXT I/O Bank #0 Control Register */	.word 	rB1CON			/* EXT I/O Bank #1 Control Register */			.word 	rB2CON			/* EXT I/O Bank #2 Control Register */	.word 	rB3CON			/* EXT I/O Bank #3 Control Register */	.word 	rB4CON			/* EXT I/O Bank #4 Control Register */	.word 	rB5CON			/* EXT I/O Bank #5 Control Register */	.word 	rB6CON			/* EXT I/O Bank #6 Control Register */	.word 	rB7CON			/* EXT I/O Bank #7 Control Register */	.word 	rMUXBCON		/* Muxed bus Control Register */	.word 	rWAITCON		/* Wait Control Register *//* ************************************************************************* * * Interrupt handling * ************************************************************************* */@@ IRQ stack frame.@#define S_FRAME_SIZE	72#define S_OLD_R0	68#define S_PSR		64#define S_PC		60#define S_LR		56#define S_SP		52#define S_IP		48#define S_FP		44#define S_R10		40#define S_R9		36#define S_R8		32#define S_R7		28#define S_R6		24#define S_R5		20#define S_R4		16#define S_R3		12#define S_R2		8#define S_R1		4#define S_R0		0#define MODE_SVC 0x13#define I_BIT	 0x80/* * use bad_save_user_regs for abort/prefetch/undef/swi ... * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling */	.macro	bad_save_user_regs	sub	sp, sp, #S_FRAME_SIZE	stmia	sp, {r0 - r12}			@ Calling r0-r12	add     r8, sp, #S_PC	ldr	r2, _armboot_end	add	r2, r2, #CONFIG_STACKSIZE	sub	r2, r2, #8	ldmia	r2, {r2 - r4}                   @ get pc, cpsr, old_r0	add	r0, sp, #S_FRAME_SIZE		@ restore sp_SVC	add	r5, sp, #S_SP	mov	r1, lr	stmia	r5, {r0 - r4}                   @ save sp_SVC, lr_SVC, pc, cpsr, old_r	mov	r0, sp	.endm	.macro	irq_save_user_regs	sub	sp, sp, #S_FRAME_SIZE	stmia	sp, {r0 - r12}			@ Calling r0-r12	add     r8, sp, #S_PC	stmdb   r8, {sp, lr}^                   @ Calling SP, LR	str     lr, [r8, #0]                    @ Save calling PC	mrs     r6, spsr	str     r6, [r8, #4]                    @ Save CPSR	str     r0, [r8, #8]                    @ Save OLD_R0	mov	r0, sp	.endm	.macro	irq_restore_user_regs	ldmia	sp, {r0 - lr}^			@ Calling r0 - lr	mov	r0, r0	ldr	lr, [sp, #S_PC]			@ Get PC	add	sp, sp, #S_FRAME_SIZE	subs	pc, lr, #4			@ return & move spsr_svc into cpsr	.endm	.macro get_bad_stack	ldr	r13, _armboot_end		@ setup our mode stack	add	r13, r13, #CONFIG_STACKSIZE	@ resides at top of normal stack	sub	r13, r13, #8	str	lr, [r13]			@ save caller lr / spsr	mrs	lr, spsr	str     lr, [r13, #4]	mov	r13, #MODE_SVC			@ prepare SVC-Mode	msr	spsr_c, r13	mov	lr, pc	movs	pc, lr	.endm	.macro get_irq_stack			@ setup IRQ stack	ldr	sp, IRQ_STACK_START	.endm	.macro get_fiq_stack			@ setup FIQ stack	ldr	sp, FIQ_STACK_START	.endm/* * exception handlers */	.align  5undefined_instruction:	get_bad_stack	bad_save_user_regs	bl 	do_undefined_instruction	.align	5software_interrupt:	get_bad_stack	bad_save_user_regs	bl 	do_software_interrupt	.align	5prefetch_abort:	get_bad_stack	bad_save_user_regs	bl 	do_prefetch_abort	.align	5data_abort:	get_bad_stack	bad_save_user_regs	bl 	do_data_abort	.align	5not_used:	get_bad_stack	bad_save_user_regs	bl 	do_not_used#ifdef CONFIG_USE_IRQ	.align	5irq:	get_irq_stack	irq_save_user_regs	bl 	do_irq	irq_restore_user_regs	.align	5fiq:	get_fiq_stack	/* someone ought to write a more effiction fiq_save_user_regs */	irq_save_user_regs	bl 	do_fiq	irq_restore_user_regs#else	.align	5irq:	get_bad_stack	bad_save_user_regs	bl 	do_irq	.align	5fiq:	get_bad_stack	bad_save_user_regs	bl 	do_fiq#endif	.align	5@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ CACHE Setting    choish 20020827.global _ICache_Enable_ICache_Enable:		mrc	15, 0, r0, c1, c0, 0		orr	r0, r0, #0x1000		mcr	15, 0, r0, c1, c0, 0		mov	pc, lr		.global _ICache_Disable_ICache_Disable:		mrc	15, 0, r0, c1, c0, 0		bic	r0, r0, #0x1000		mcr	15, 0, r0, c1, c0, 0		mov	pc, lr		.global _ICache_Flush_ICache_Flush:		mov	r0, #0		mcr	15, 0, r0, c7, c5, 0		mov	pc, lr		.global _ICache_Flush_Single_ICache_Flush_Single:		mov	r0, r0, lsl #4	@ Segment		mov	r1, r1, lsl #26	@ Line		orr	r0, r0, r1		mcr	15, 0, r0, c7, c5, 2		mov	pc, lr		@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ DCache		.global _DCache_Enable_DCache_Enable:		mrc	15, 0, r0, c1, c0, 0		orr	r0, r0, #0x4		mcr	15, 0, r0, c1, c0, 0		mov	pc, lr		.global _DCache_Disable_DCache_Disable:		mrc	15, 0, r0, c1, c0, 0		bic	r0, r0, #0x4		mcr	15, 0, r0, c1, c0, 0		mov	pc, lr		.global _DCache_Flush_DCache_Flush:		mov	r0, #0		mcr	15, 0, r0, c7, c6, 0		mov	pc, lr		.global _DCache_Flush_Single_DCache_Flush_Single:		mov	r0, r0, lsl #4	@ Segment		mov	r1, r1, lsl #26	@ Line		orr	r0, r0, r1		mcr	15, 0, r0, c7, c6, 2		mov	pc, lr		.global _DCache_Clean_Single_DCache_Clean_Single:		mov	r0, r0, lsl #4	@ Segment		mov	r1, r1, lsl #26	@ Line		orr	r0, r0, r1		mcr	15, 0, r0, c7, c10, 2		mov	pc, lr		.global _DCache_CFlush_Single	@ Clean & flush_DCache_CFlush_Single:		mov	r0, r0, lsl #4	@ Segment		mov	r1, r1, lsl #26	@ Line		orr	r0, r0, r1		mcr	15, 0, r0, c7, c14, 2		mov	pc, lr		.global _DCache_CFlush_DCache_CFlush:		stmfd	sp!, {r1,r2}		mov	r1, #01:		mov	r0, #02:		orr	r2, r1, r0		mcr	15, 0, r0, c7, c14, 2		add	r0, r0, #0x10		cmp	r0, #0x40		bne	2b		add	r1, r1, #0x04000000		cmp	r1, #0		bne	1b		ldmfd	sp!, {r1,r2}		mov	pc, lr		@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Write Buffer WB@ 		void	_WB_Enable (int region);		.global _WB_Enable_WB_Enable:	stmfd	sp!, {r1,r2}		mrc	15, 0, r1, cr3, cr0, 0		mov	r2, #1		orr	r1, r1, r2, lsl r0		mcr	15, 0, r1, cr3, cr0, 0		ldmfd	sp!, {r1,r2}		mov	pc, lr@ 		void	_WB_Disable (int region);		.global _WB_Disable_WB_Disable:	stmfd	sp!, {r1,r2}		mrc	15, 0, r1, cr3, cr0, 0		mov	r2, #1		bic	r1, r1, r2, lsl r0		mcr	15, 0, r1, cr3, cr0, 0		ldmfd	sp!, {r1,r2}		mov	pc, lr		.global _WB_Drain_WB_Drain:	mov	r0, #0		mcr	15, 0, r0, cr7, cr10, 4		mov	pc, lr		@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Protection Unit setting  choish 20020827.globl reset_cpureset_cpu:@@@@@@@@@@@@@@@@@@@@@@@@ instruction region set	ldr	R1, =0x0000003F	 	@ code  region 0 4Gbyte - background	MCR	p15, 0, R1, c6, c0, 1	ldr	R1, =0x00000031		@ code	region 1 32MB - SDRAM	MCR p15, 0, R1, c6, c1, 1	@@@@@@@@@@@@@@@@@@@@@@@@ data region set	ldr	R1, =0x0000003F	 	@ data  region 0 4Gbyte - background	MCR	p15, 0, R1, c6, c0, 0	@ldr	R1, =0x80000029 	@ data  region 1 2MB - Flash	@MCR	p15, 0, R1, c6, c1, 0	@ldr	R1, =0x83000027		@ data	region 2 1MB - SRAM	@MCR p15, 0, R1, c6, c2, 0	ldr	R1, =0x00000031		@ data	region 1 32MB - SDRAM	MCR p15, 0, R1, c6, c1, 0	@	ldr	R1, =0x01E00029		@ data	region 2 2MB - SDRAM@	MCR p15, 0, R1, c6, c2, 0	ldr	R1, =0x0180002D		@ data	region 2 8MB - SDRAM	MCR p15, 0, R1, c6, c2, 0		mov	R1, #0x2		@ code Region Cachable bit setting	MCR	p15, 0, R1, c2, c0, 1	@ 1 cachable	mov	R1, #0x2		@ data Region Cachable bit setting	MCR	p15, 0, R1, c2, c0, 0	@  1 cachable	mov	R1, #0x4		@ Write Buffer Region setting	MCR	p15, 0, R1, c3, c0, 0 @ DMA access region select		ldr	R1,=0xfff	MCR     p15,0,R1,c5,c0,1   	@ enable full access on Inst Region 0-5	MCR     p15,0,R1,c5,c0,0   	@ enable full access on Data Region 0-5	MRC	p15, 0, r0, c1, c0	@ get control register	orr	r0, r0, #1		@ Enable PU	ldr	r1, =0x3fffcf02		@ all "SB0"	bic	r0, r0, r1	orr	r0, r0, #0x0078		@ all "SB1"	bic	r0, r0, #0x2000		@ No alternate vectors	bic	r0, r0, #0x0080		@ Little-endian	orr	r0, r0, #0x0004		@ disable DCache	orr	r0, r0, #0x1000		@ Enable ICache@	and	r0, r0, #0x3fffffff	@ Set Fast bus mode	@ Impossible to set bus mode !?	orr	r0, r0, #0xC0000000	@ Set Async bus mode		MCR     p15,0,R0,c1,c0,0		nop;nop;nop	mov	pc, lr/* ************************************************************************* * * Below is for connection with uClinux environment. * And,  * ************************************************************************* */#ifdef CONFIG_UCBOOTSTRAP	    .global	UndInstrUndInstr:	    str		r6, PtTmp	@ save r6 & r7	    str		r7, PtTmp+4	    ldr		r6, [lr, #-4]	@ get code of undef instr	    ldr		r7, =0xe65a4f10	@ bootstrap magic number	    cmp		r6, r7			@ is it bootstrap syscall	    ldral	r6, PtTmp		@ restore r6 & r7	    ldral	r7, PtTmp+4	    beq		.+12	    @---------------------------< Kernel undefined instr >	    mov		pc, $0xe4	@ 0xe4 is a kernel-2.0 vector_undefinstr addres.	    nop				@ For compability it is still here for kernel-2.4.	    nop				@ But to make it work the following was done :	    nop				@ 1. from this address to the 0x200 (kernel __stub_start)					@    memory was fillout by "nop" instructions.					@ 2. in the kernel-2.4 the vector_undefinstr was moved to					@    the __stub_start.	    	    @---------------------------< Bootstrap system call >@ hans, changed stack area to 0x4000 ( empty area in .text, see system.map file )@<--@	    ldr		sp, =0x00800000	@ Bootstrap stack pointer@-->	    ldr		sp, =0x4000	@ Bootstrap stack pointer@-->	    stmfd	sp, {lr}	@ save return register	    sub		sp, sp, #4	    stmfd	sp, {r0-r12}	@ save work registers	    sub		sp, sp, #52	    ldr		r6, PtCallTable @ r6 <- function table address	    str		r4, [sp, #-4]!	@ push r4->sp 5th argument	    mov		lr, pc		@ save return address		    ldr		pc, [r6, r10, lsl #2] @ bootstrap syscall	    add		sp, sp, #8		    ldmfd	sp, {r1-r12}	@ restore work reg without R0	    add		sp, sp, #48	    ldmfd	sp, {pc}^	@ return @--------------------------------------------------------------	    	    .global	bsc_nullsyscallbsc_nullsyscall:	    mov		pc, lr	    @--------------------------------------------------------------		.global go2go2:		mov	pc, r0		nop@--------------------------------------------------------------PtCallTable:                                /* not implemented */        .word   .+4        .word   bsc_reset       @ bsc_reset         @ 0        .word   bsc_test                            @ 1        .word   bsc_nullsyscall                     @ 2        .word   bsc_nullsyscall                     @ 3        .word   bsc_nullsyscall @ bsc_program           @ 4        .word   bsc_nullsyscall                     @ 5        .word   bsc_nullsyscall                     @ 6        .word   bsc_nullsyscall                     @ 7        .word   bsc_nullsyscall                     @ 8        .word   bsc_nullsyscall                     @ 9        .word   bsc_nullsyscall                     @ 10        .word   bsc_nullsyscall                     @ 11        .word   bsc_gethwaddr                       @ 12        .word   bsc_getserialnum                    @ 13        .word   bsc_getenv                      @ 14        .word   bsc_setenv                      @ 15        .word   bsc_setpmask                        @ 16        .word   bsc_readenv @ bsc_readenv           @ 17        .word   flash_chattr_range @ flash_chattr_range @ 18        .word   flash_erase_range @ flash_erase_range   @ 19        .word   flash_write_range@ flash_write_range        @ 20        .word   bsc_ramload @ bsc_ramload           @ 21    @--------------------------------------------------------------	    	    .global	bspbsp:	    nop@-------------------------------------------------------------PtTmp:	    .word	6	    .word	7#endif	.ltorg#if defined (AM29LV160D) || defined (HY29LV320B)	.org 0x6000#elif defined (SST39VF160)	.org 0x1000#else	.org 0x4000#endif

⌨️ 快捷键说明

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