微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > TQ2440启动代码分析(二)

TQ2440启动代码分析(二)

时间:11-26 来源:互联网 点击:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;; When EINT0 is pressed, Clear SDRAM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; check if EIN0 button is pressed

;这一段检测EINT0是否被按下,假如EINT0被按下,则清空SDRAM

ldr r0,=GPFCON

ldr r1,=0x0

str r1,[r0]

ldr r0,=GPFUP

ldr r1,=0xff

str r1,[r0]

;配置GPF

ldr r1,=GPFDAT

ldr r0,[r1]

bic r0,r0,#(0x1e<1) ; bit clear

tst r0,#0x1

bne %F1

; Clear SDRAM Start

ldr r0,=GPFCON

ldr r1,=0x55aa

str r1,[r0]

; ldr r0,=GPFUP

; ldr r1,=0xff

; str r1,[r0]

ldr r0,=GPFDAT

ldr r1,=0x0

str r1,[r0] ;LED=****

mov r1,#0

mov r2,#0

mov r3,#0

mov r4,#0

mov r5,#0

mov r6,#0

mov r7,#0

mov r8,#0

ldr r9,=0x4000000 ;64MB

ldr r0,=0x30000000

0

stmia r0!,{r1-r8}

subs r9,r9,#32

bne %B0

;以上这段清空SDRAM

;Clear SDRAM End

1

;Initialize stacks

bl InitStacks

;检测引脚OM[1:0],如果OM[1:0]!=0,选择从NOR Flash启动,如果OM[1:0]==0,则表示从nand flash启动

;===========================================================

ldr r0, =BWSCON

ldr r0, [r0]

ands r0, r0, #6 ;OM[1:0] != 0, NOR FLash boot

bne copy_proc_beg ;do not read nand flash

adr r0, ResetEntry ;OM[1:0] == 0, NAND FLash boot

cmp r0, #0 ;if use Multi-ice,

bne copy_proc_beg ;do not read nand flash for boot

;nop

;===========================================================

nand_boot_beg

[ {TRUE}

bl RdNF2SDRAM

]

;nand flash启动,拷贝程序到steppingstone区域

ldr pc, =copy_proc_beg

;===========================================================

copy_proc_beg;

adr r0, ResetEntry

ldr r2, BaseOfROM

cmp r0, r2

ldreq r0, TopOfROM

beq InitRam

ldr r3, TopOfROM

0

ldmia r0!, {r4-r7}

stmia r2!, {r4-r7}

cmp r2, r3

bcc %B0

sub r2, r2, r3

sub r0, r0, r2

InitRam

ldr r2, BaseOfBSS

ldr r3, BaseOfZero

0

cmp r2, r3

ldrcc r1, [r0], #4

strcc r1, [r2], #4

bcc %B0

mov r0, #0

ldr r3, EndOfBSS

1

cmp r2, r3

strcc r0, [r2], #4

bcc %B1

ldr pc, =%F2 ;goto compiler address

2

; [ CLKdiv_VAL>1 ; means Fclk:Hclk is not 1:1.

; bl MMU_SetAsyncBusMode

; |

; bl MMU_SetFastBusMode ; default value.

; ]

;===========================================================

; Setup IRQ handler

ldr r0,=HandleIRQ ;This routine is needed

ldr r1,=IsrIRQ ;if there is not subs pc,lr,#4 at 0x18, 0x1c

str r1,[r0]

[ :LNOT:THUMBCODE

bl Main ;Do not use main() because ......

b .

]

[ THUMBCODE ;for start-up code for Thumb mode

orr lr,pc,#1

bx lr

CODE16

bl Main ;Do not use main() because ......

b .

CODE32

]

;堆栈初始化的顺序决定系统最后运行在哪种处理器模式,最后初始化哪种模式的堆栈,系

;统就运行在哪种模式。

;function initializing stacks

InitStacks

;Do not use DRAM,such as stmfd,ldmfd......

;SVCstack is initialized before

;Under toolkit ver 2.5, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1

mrs r0,cpsr

bic r0,r0,#MODEMASK

orr r1,r0,#UNDEFMODE|NOINT

msr cpsr_cxsf,r1 ;UndefMode

ldr sp,=UndefStack ; UndefStack=0x33FF_5C00

;先通过mrs 指令将状态寄存器值读取到r0,然后将r0 对应的处理器模式为修改成未定

;义指令中止模式,再写回状态寄存器使处理器真正切换到未定义指令中止模式,这就

;是“读出-修改-写回”的方式来修改状态寄存器的内容。最后将该模式的堆栈指针sp 指

; 向UndefStack 定义的地址,其他的模式操作方式也是一样

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;AbortMode

ldr sp,=AbortStack ; AbortStack=0x33FF_6000

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;IRQMode

ldr sp,=IRQStack ; IRQStack=0x33FF_7000

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;FIQMode

ldr sp,=FIQStack ; FIQStack=0x33FF_8000

bic r0,r0,#MODEMASK|NOINT

orr r1,r0,#SVCMODE

msr cpsr_cxsf,r1 ;SVCMode

ldr sp,=SVCStack ; SVCStack=0x33FF_5800

;USER mode has not be initialized.

mov pc,lr

;The LR register will not

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top