crt0.s

来自「ADS下的bios工程」· S 代码 · 共 509 行

S
509
字号
#include <bios/s3c2410x.h>#include <bios/linkage.h>	.text	.macro delay	ldr	r0, =0xffff1:	subs	r0, r0, #1	bne	1b	.endm@ Entry	.globl	_entry_entry:/*------------------------------------------------------ * Setup interrupt vector table ------------------------------------------------------*/	b	reset_handler	b	undef_handler	b	swi_handler	b	prefetch_handler	b	abort_handler	nop	b	irq_handler	b	fiq_handler@ Setup vectored interrupt        nop@ldr	pc,=HandlerEINT0	@ 0x20        nop@ldr	pc,=HandlerEINT1	@ 0x24        nop@ldr	pc,=HandlerEINT2	@ 0x28        nop@ldr	pc,=HandlerEINT3	@ 0x2c        nop@ldr	pc,=HandlerEINT4	@ 0x30        nop@ldr	pc,=HandlerRTICK	@ 0x34        nop				@ 0x38        nop				@ 0x3c        nop@ldr	pc,=HandlerZDMA0	@ 0x40        nop@ldr	pc,=HandlerZDMA1	@ 0x44        nop@ldr	pc,=HandlerBDMA0	@ 0x48        nop@ldr	pc,=HandlerBDMA1	@ 0x4c        nop@ldr	pc,=HandlerWDT		@ 0x50        nop@ldr	pc,=HandlerUERROR	@ 0x54        nop				@ 0x58        nop				@ 0x5c        nop@ldr	pc,=HandlerTIMER0	@ 0x60        nop@ldr	pc,=HandlerTIMER1	@ 0x64        nop@ldr	pc,=HandlerTIMER2	@ 0x68        nop@ldr	pc,=HandlerTIMER3	@ 0x6c        nop@ldr	pc,=HandlerTIMER4	@ 0x70        nop@ldr	pc,=HandlerTIMER5	@ 0x74        nop				@ 0x78        nop				@ 0x7c        nop@ldr	pc,=HandlerURXD0	@ 0x80        nop@ldr	pc,=HandlerURXD1	@ 0x84        nop@ldr	pc,=HandlerIIC		@ 0x88        nop@ldr	pc,=HandlerSIO		@ 0x8c        nop@ldr	pc,=HandlerUTXD0	@ 0x90        nop@ldr	pc,=HandlerUTXD1	@ 0x94        nop				@ 0x98        nop				@ 0x9c        nop@ldr	pc,=HandlerRTC		@ 0xa0        nop				@ 0xa4        nop				@ 0xa8        nop				@ 0xac        nop				@ 0xb0        nop				@ 0xb4        nop				@ 0xb8        nop				@ 0xbc        nop@ldr	pc,=HandlerADC		@ 0xc0reset_handler :/*------------------------------------------------------ * Watch-Dog Timer Disable ------------------------------------------------------*/	ldr     r0,=WTCON	ldr     r1,=rWTCON		/* watch dog disable */	str     r1,[r0]/*------------------------------------------------------ * Interrupt Disable All ------------------------------------------------------*/	ldr     r0,=INTMSK	ldr     r1,=INT_MASK_DIS	/* all interrupt disable */	str     r1,[r0]	ldr     r0,=INTSUBMSK	str	r1,[r0]/*------------------------------------------------------ * LOCK Time Count Setup ------------------------------------------------------*/	ldr	r0,=LOCKTIME	ldr	r1,=rLOCKTIME				str	r1,[r0]/*------------------------------------------------------ * PLL & CLOCK Setup ------------------------------------------------------*/	ldr     r0,=MPLLCON	ldr     r1,=rMPLLCON	str     r1,[r0]	ldr     r0,=UPLLCON	ldr     r1,=rUPLLCON	str     r1,[r0]	ldr	r0,=CLKDIVN	ldr	r1,=rCLKDIVN	str	r1,[r0]/*------------------------------------------------------ * General I/O ports Setup ------------------------------------------------------*/	ldr     r0, =GPACON	ldr     r1, =0x7FFFFF	str     r1, [r0]	ldr     r0, =GPBCON	ldr     r1, =0x044555	str     r1, [r0]	ldr     r0, =GPBUP	ldr     r1, =0x7FF	/* All pull-up is disabled. */	str     r1, [r0]	ldr     r0, =GPCCON	ldr     r1, =0xAAAA56AA	str     r1, [r0]	ldr     r0, =GPCUP	ldr     r1, =0xFFFF	/* All pull-up is disabled. */	str     r1, [r0]	ldr     r0, =GPDCON	ldr     r1, =0xAAAAAAAA	str     r1, [r0]	ldr     r0, =GPDUP	ldr     r1, =0xFFFF	/* All pull-up is disabled. */	str     r1, [r0]	ldr     r0, =GPECON	ldr     r1, =0xAAAAAAAA   	str     r1, [r0]	ldr     r0, =GPEUP 	ldr     r1, =0xFFFF	str     r1, [r0]	ldr     r0, =GPFCON	ldr     r1, =0xAAAA	str     r1, [r0]	ldr     r0, =GPFUP	ldr     r1, =0xFF	str     r1, [r0]	ldr     r0, =GPGCON	ldr     r1, =0xFFDDFFF9	str     r1, [r0]	ldr     r0, =GPGUP	ldr     r1, =0xFFFF	str     r1, [r0]	ldr     r0, =GPHCON	ldr     r1, =0x2AFAAA	str     r1, [r0]	ldr     r0, =GPHUP	ldr     r1, =0x7FF	str     r1, [r0]/* * External Interrupt Control Register */	ldr     r0, =EXTINT0	ldr     r1, =0x22222222		/* All Falling edge triggered mode */	str     r1, [r0]	ldr     r0, =EXTINT1	str     r1, [r0]	ldr     r0, =EXTINT2	str     r1, [r0]/*------------------------------------------------------ * Initialize debug port ------------------------------------------------------*/        bl	dbg_init	mov 	r0,#'\n'	bl	printch	mov 	r0,#'l'	bl	printch/*------------------------------------------------------- * disable the interrupts in CPU and switch to SVC32 mode  -------------------------------------------------------*/	mrs	r0, cpsr	bic	r0, r0, #MODE_MASK	orr	r0, r0, #SUP_MODE | IBit | FBit	msr	cpsr, r0	mov 	r0,#'i'	bl	printch/*------------------------------------------------------ * Setup DRAM ------------------------------------------------------*//* ROM and DRAM Configuration(Multiple Load and Store) */        @Set memory control registers	adr	r0, .L_DRAM_SysInitData_Reset	ldr	r1, =SYS_INIT_BASE        add     r2, r0, #52     @End address of SMRDATA0:        ldr     r3, [r0], #4        str     r3, [r1], #4        cmp     r2, r0        bne     0b	mov 	r0,#'a'	bl	printch	mov 	r0,#'o'	bl	printch/*------------------------------------------------------ * Initialize MMU ------------------------------------------------------*/	ldr	r1, =MMUTT_STARTADDRESS	mov	r0, #0x4000	mov	r2, #0x01:	subs	r0, r0, #4	str	r2, [r1], #4		/* MMU Table Clear */	bne	1b	bl	SYMBOL_NAME(MMU_Init)/*------------------------------------------------------ *	Clear bss section and setup stack pointer ------------------------------------------------------*/.L_clear_bss_section :	mov	r0, #0	ldr	r1, =SYMBOL_NAME(_bss_start)	ldr	r2, =SYMBOL_NAME(_bss_end)1:	str	r0, [r1], #4	cmp	r1, r2	blt	1b	ldr	sp, =0x30280000   @hardcode, modified later/*------------------------------------------------------ * Initialize vector, in this boot code, only timer interrupt is used * setup stack pointer to end of DRAM */	bl      vec_init/*------------------------------------------------------ * got a RAM size ------------------------------------------------------*/	ldr	r0, =SYMBOL_NAME(ram_size)	str	r12, [r0]/*------------------------------------------------------ * branch to start_main() function * here is a really start point of boot code ------------------------------------------------------*/	ldr	r0, =SYMBOL_NAME(_end)	mrc     p15, 0, r0, c1, c0, 0	bl	SYMBOL_NAME(start_main)	b	.	.ltorg/*------------------------------------------------------ * void ser_write(const char *buffer, int nr) ------------------------------------------------------*/ENTRY(ser_write)	stmfd	sp!, {r9 - r11, lr}	bl	ser_prints	ldmfd	sp!, {r9 - r11, pc}ENTRY(ser_stat)	mov	pc, lr/*------------------------------------------------------ * Define some useful macro for UART debug interface ------------------------------------------------------*/	.macro  addruart,rx	ldr     \rx, =DEBUG_TX_BUFF_BASE	.endm	.macro  senduart,rd,rx	strb     \rd, [\rx]	.endm	.macro  busyuart,rd,rx1001:	ldr     \rx, =DEBUG_CHK_STAT_BASE	ldr     \rd, [\rx]	and     \rd, \rd, #DEBUG_TX_DONE_CHECK_BIT	teq     \rd, #DEBUG_TX_DONE_CHECK_BIT	bne     1001b	.endm	.macro  waituart,rd,rx	.endm/*------------------------------------------------------ * UART printout function for debug ------------------------------------------------------*/ENTRY(dbg_init)	ldr     r0, =DEBUG_UARTMCON_BASE	ldr     r1, =DEBUG_UMCON_REG_VAL	/* 0x00 */	str     r1, [r0]	ldr     r0, =DEBUG_UARTFCON_BASE	ldr     r1, =DEBUG_UFCON_REG_VAL	/* 0x00 */	str     r1, [r0]	ldr     r0, =DEBUG_UARTLCON_BASE	ldr     r1, =DEBUG_ULCON_REG_VAL	/* 0x03 */	str     r1, [r0]	ldr     r0, =DEBUG_UARTCONT_BASE	ldr     r1, =DEBUG_UCONT_REG_VAL	/* 0x245 */	str     r1, [r0]	ldr     r0, =DEBUG_UARTBAUD_BASE	ldr     r1, =DEBUG_UBAUD_REG_VAL	str     r1, [r0]	mov	pc, lrENTRY(printreg)	mov     r13, lr	mov     r5, #28	mov     r6, r0	mov     r7, #0xf1001:	and     r0, r7, r6, lsr r5	cmp     r0, #10	addge   r0, r0, #'a'-10         @ greater or equal	addlt   r0, r0, #'0'            @ less than	bl      printch	subs    r5, r5, #4	bpl     1001b	mov     r0, #'\n'	bl      printch	mov     r0, #'\r'	bl      printch	mov     pc, r13ENTRY(printascii)	addruart r3	b       2f1:	waituart r2, r3	senduart r1, r3	busyuart r2, r3	teq     r1, #'\n'	moveq   r1, #'\r'	beq     1b2:	teq     r0, #0	ldrneb  r1, [r0], #1	teqne   r1, #0	bne     1b	mov     pc, lrENTRY(printch)	addruart r3	mov     r1, r0	mov     r0, #0	b       1bENTRY(FindRAMSize)@       mov     r0, #0x30000000         @ start at base of physical RAM@       mov     r1, #0x100              @ 4 byte grain is fine enoughchecksize:	mov     r7, r1                  @ keep step size in r7	mov     r6, r0                  @ keep base address in r6	mov     r5, r6                  @ r5 is probe address	ldr     r4, [r6, #0]            @ preserve original base contents	mov     r2, #0x55               @ build adjacent bit tests	orr     r2, r2, #0xAA00         @ make 0xAA55 pattern	orr     r2, r2, r2, lsl #16     @ final pattern 0xAA55AA55	mvn     r3, r2                  @ use inverse copy as alternate pattern	@ Move up memory insteps, probing each location with two different	@ patterns to see if memory is present, and checking the base of	@ memory too (to detect aliasing of wrapped memory).	@ save AA55AA55 in base which should be there until wrapped	str     r2, [r6, #0]            @ store first pattern at base	ldr     r0, [r6, #0]            @ and read back	cmp     r0, r2                  @ check okay	bne     checksizefail           @ give up if not	@ byte testing valuable as ARM broadcasts 4 bytes	@ and any faulty write enables will corrupt other bytescheckbyte0:             @ check byte writes work independently (endian-independent)	ldrb    r1, [r6, #0]            @ byte at a time	mov     r0, #0xA5               @ using local pattern	strb    r0, [r6, #0]            @ test byte 0	ldrb    r0, [r6, #0]            @ read back	cmp     r0, #0xA5               @ test	bne     checksizefail           @ fail if different	strb    r1, [r6, #0]            @ restore byte	ldr     r0, [r6, #0]            @ test word still intact	cmp     r0, r2                  @ still pattern one	bne     checksizefail           @ fail if differentcheckbyte1:             @ in line for zero stack usage, etc.	ldrb    r1, [r6, #1]            @ preserve byte 1	mov     r0, #0xA5               @ using local pattern	strb    r0, [r6, #1]            @ test byte 1	ldrb    r0, [r6, #1]            @ read back	cmp     r0, #0xA5               @ test	bne     checksizefail           @ fail if different	strb    r1, [r6, #1]            @ restore byte	ldr     r0, [r6, #0]            @ test word still intact	cmp     r0, r2                  @ still pattern one	bne     checksizefail           @ fail if differentcheckbyte2:	ldrb    r1, [r6, #2]            @ preserve byte 2	mov     r0, #0xA5               @ using local pattern	strb    r0, [r6, #2]            @ test byte 2	ldrb    r0, [r6, #2]            @ read back	cmp     r0, #0xA5               @ test	bne     checksizefail           @ fail if different	strb    r1, [r6, #2]            @ restore byte	ldr     r0, [r6, #0]            @ test word still intact	cmp     r0, r2                  @ still pattern one	bne     checksizefail           @ fail if differentcheckbyte3:	ldrb    r1, [r6, #3]            @ preserve byte 3	mov     r0, #0xA5               @ using local pattern	strb    r0, [r6, #3]            @ test byte 3	ldrb    r0, [r6, #3]            @ read back	cmp     r0, #0xA5               @ test	bne     checksizefail           @ fail if different	strb    r1, [r6, #3]            @ restore byte	ldr     r0, [r6, #0]            @ test word still intact	cmp     r0, r2                  @ still pattern one	bne     checksizefail           @ fail if different	add     r5, r6, r7              @ r5 is probe address (base+step)checksizeloop:	ldr     r1, [r5, #0]            @ preserve probed value in r1	ldr     r8, [r5, r7]	str     r2, [r5, #0]            @ store first pattern	str     r3, [r5, r7]            @ inverse pattern	ldr     r0, [r5, #0]            @ read it back	cmp     r0, r2                  @ is it correct?	bne     checksizefail           @ no working memory here	str     r1, [r5, #0]            @ restore probed value	add     r5, r5, r7              @ r5 is probe address (base+step)	ldr     r0, [r5, #0]            @ read it back	cmp     r0, r3                  @ is it correct?	movne   r1, r8	bne     checksizefail           @ not working	@ if reads and writes okay did last write wrap to base?	ldr     r0, [r6, #0]	str     r8, [r5, #0]            @ restore probed value	cmp     r0, r2                  @ base still reads as first pattern?	bne     checksizefail	addeq   r5, r5, r7              @ if okay then increment probe	beq     checksizeloop           @ and loop, else fall through to fail	@ Address of first failing location in r2, original contents in r6	@ Original contents of base in r7checksizefail:	str     r1, [r5, #0]            @ restore original contents of probe	str     r4, [r6, #0]            @ restore original contents of base	sub     r0, r5, r6              @ valid size is (probe - base)	mov     pc, lr/*------------------------------------------------------ * Define variable ------------------------------------------------------*/	.align 4sdram_str:      .asciz  "SDRAM Size : 0x"	.align 4.L_DRAM_SysInitData_Reset:	.long	rBWSCON	.long	rBANKCON0	.long	rBANKCON1	.long	rBANKCON2	.long	rBANKCON3	.long	rBANKCON4	.long	rBANKCON5	.long	rBANKCON6	.long	rBANKCON7	.long	rREFRESH	.long	rBANKSIZE	.long	rMRSRB6	.long	rMRSRB7

⌨️ 快捷键说明

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