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

📄 cstartup.s

📁 Sharp LH75401(ARM7)处理器部分控制程序。
💻 S
字号:
.EQU  MODE_BITS,0x1F	@ Bit mask for mode bits in CPSR
.EQU  USR_MODE,	0x10		@ User mode
.EQU  FIQ_MODE,	0x11		@ Fast Interrupt Request mode
.EQU  IRQ_MODE,	0x12		@ Interrupt Request mode
.EQU  SVC_MODE,	0x13		@ Supervisor mode
.EQU  ABT_MODE,	0x17		@ Abort mode
.EQU  UND_MODE,	0x1B		@ Undefined Instruction mode
.EQU  SYS_MODE,	0x1F		@ System mode


.text
reset:  ldr      pc,=cstartup      @  0x0000,0000: RESET Vector
        ldr      pc,=0x0000024     @  0x0000,0004:
        ldr      pc,=0x0000028     @  0x0000,0008:
        ldr      pc,=0x000002c     @  0x0000,000C:
        ldr      pc,=0x0000030     @  0x0000,0010:
        nop                        @  0x0000,0014:
        ldr      pc,[pc,#-0xff0]   @  0x0000,0018: Jump to addr in "VICVectAddr" 0xFFFF0030
        ldr      pc,=0x000003c     @  0x0000,001C: 

@ ---------------------------------------------------------------
@  ?CSTARTUP
@ ---------------------------------------------------------------

@  RTMODEL attributes ensure that
@		RTMODEL "__endian", ENDIAN_MODE
@		RTMODEL "__thumb_aware", "enabled"
@		RTMODEL "__cpu_mode", "*"       @  CPU_MODE_NAME
@		RTMODEL "__code_model", "*"	@  Match all code models

@  Declare segment used with SFE below
@#ifdef _ECPLUSPLUS
@		RSEG	DIFUNCT(2)
@#endif /* _ECPLUSPLUS */

@		RSEG	IRQ_STACK:DATA(2)
@		RSEG	SVC_STACK:DATA:NOROOT(2)
@		RSEG	CSTACK:DATA(2)
@		RSEG	ICODE:CODE:NOROOT(2)
@		PUBLIC	?cstartup
@		EXTERN	__segment_init
@		EXTERN	__low_level_init
@#ifdef _ECPLUSPLUS
@		EXTERN	__call_ctors
@#endif /*  _ECPLUSPLUS */
@		EXTERN	main
@		EXTERN  exit
@		EXTERN	_exit

@  Execution starts here.
@  After a reset, the mode is ARM, Supervisor, interrupts disabled.

		.LTORG

cstartup:

@  Initialize the stack pointers.
@  The pattern below can be used for any of the exception stacks:
@  FIQ, IRQ, SVC, ABT, UND, SYS.
@  The USR mode uses the same stack as SYS. 
@  The stack segments must be defined in the linker command file,
@  and be declared above.
		mrs	r0,cpsr				@  Original PSR value
		bic	r0,r0,#MODE_BITS		@  Clear the mode bits
		orr	r0,r0,#IRQ_MODE			@  Set IRQ mode bits
		msr	cpsr_c,r0			@  Change the mode
		ldr	sp,=0x2030a380 @SFE(IRQ_STACK) & 0xFFFFFFF8	@  End of IRQ_STACK

		bic	r0,r0,#MODE_BITS		@  Clear the mode bits
		orr	r0,r0,#SVC_MODE			@  Set Supervisor mode bits
		msr	cpsr_c,r0		        @  Change the mode
		ldr	sp,=0x2030a180  @SFE(CSTACK) & 0xFFFFFFF8	@  End of CSTACK


/*
 * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
*/

    /*
     * At the end of the reset sequence, MMU, Icache, Dcache,
     * and write buffer are all disabled.
     * Also IRQs and FIQs are disabled in the processor's CPSR
     * The operating mode is SVC (supervisory mode), and the
     * PC is vectored at 0x00000000. A branch in 0x00000000
     * brings us directly here.
     *
     */


	ldr	pc, =coldstart_1
	nop

coldstart_1:
	
    /* Mask off all IRQs and FIQs */
    ldr r2, =0xffffffff	        	/* clear all bits */
    ldr r1, =0xfffff014
    str r2, [r1]

    /*
     * Initialize the LH75401 Clocks
     */
	@ unlock RPC and set HCLK as CLKOUT
        ldr r2, =0x00000263
        ldr r1, =0xfffe2000
    str r2, [r1]

	@ set FCLK to PLL/4 (77.41Mhz)
	ldr r2, =0x00000002
	ldr r1, =0xfffe201c
    str r2, [r1]

	@ set HCLK to PLL/6 (51.61Mhz) - This also sets the SDRAM clock
	@ and the staic memory clock
	ldr r2, =0x00000003
	ldr r1, =0xfffe2018
    str r2, [r1]

	@ enable peripheral clocks
	ldr r2, =0x00000000
	ldr r1, =0xfffe2024
    str r2, [r1]
	ldr r1, =0xfffe2028
    str r2, [r1]

	@ enable sdram clocks
	ldr r2, =0x00000000
	ldr r1, =0xfffe202c
    str r2, [r1]

	@ Peripheral Clock select Register
	ldr r2, =0x00000000
	ldr r1, =0xfffe2030
    str r2, [r1]

	@ enable all memory pins
	ldr r2, =0x000000ef
	ldr r1, =0xfffe5000
    str r2, [r1]

	@ enable all LCD pins
	ldr r2, =0x1fbeda9e
	ldr r1, =0xfffe5004
    str r2, [r1]

	@ enable uart0 and uart1
	ldr r2, =0x00000003
	ldr r1, =0xfffe5010
    str r2, [r1]

        @ disable SSP Multiplex
	ldr r2, =0x00000000
	ldr r1, =0xfffe5014
    str r2, [r1]

	@ enable clkout and nWAIT
	ldr r2, =0x00000402
	ldr r1, =0xfffe5008
    str r2, [r1]

	@ DMA Multiplex
	ldr r2, =0x00000000
	ldr r1, =0xfffe500C
    str r2, [r1]


	@ Setup nCS0 - StrataFLASH, 8Mbytes, 200nsec, 16-btis
	ldr r2, =0x13005540
	ldr r1, =0xffff1000
	str r2, [r1]


	@ Setup nCS1 - CPLD
	ldr r2, =0x1000FFE9
	ldr r1, =0xffff1004
	str r2, [r1]

	@ Setup nCS2 - CS-AD
	ldr r2, =0x1000FFE9
	ldr r1, =0xffff1008
	str r2, [r1]


	/* pause for ~200usec for clocks to stabliz*/
	bl delay_200
	@ ldr pc,=delay_200
	

    /*
     * Initialize SDRAM Controller
     */
	@ Setup SDRAM
	@ issue 2 NOP
        ldr r2, =0x00000003
        ldr r1, =0xffff2004
    str r2, [r1]
	bl	delay_200
	
    str r2, [r1]
	bl	delay_200
	

	@ issue Precharge All
    ldr r2, =0x00000001
    ldr r1, =0xffff2004
    str r2, [r1]
	bl	delay_200
	

	@ set refresh timer to 16 clocks to a force bunch right away
    ldr r2, =0x00000010
    ldr r1, =0xffff2008
    str r2, [r1]
	bl	delay_200
	

	@ now set to the final number to ~15usec @ 51Mhz
    ldr r2, =0x000002e0
    ldr r1, =0xffff2008
    str r2, [r1]
	bl	delay_200
	

	@ set MRS mode
    ldr r2, =0x00000002
    ldr r1, =0xffff2004
    str r2, [r1]
	bl	delay_200
	

	@ 0x22 sets burst mode and cas latency for bank 0
    ldr r1, =0x20022000
    ldr r2, [r1]
	bl	delay_200
	

	@ Write SDRCConfig0, for CAS latency = 2, RAS to CAS = 2, 32-bit, 4 bank
    ldr r2, =0x01A00088
    ldr r1, =0xffff2000
    str r2, [r1]
	bl	delay_200
	

	@ set Normal mode
    ldr r2, =0x00000000
    ldr r1, =0xffff2004
    str r2, [r1]
	bl	delay_200
        ldr  pc,=init_sdram_end
        
init_sdram_end:
	b .
	        
 @ simple delay loop
 delay_200:
	ldr		r3, =200			/* loop count */
 delay_loop:
	subs	        r3,r3,#1
	bne		delay_loop
	nop
        mov		pc, lr

.end

⌨️ 快捷键说明

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