ldr r1,=0xffffff
str r1,[r0]
[ PLL_ON_START ;defined inoption.inc {TRUE},选择要不要设置频率值
;Added for confirm clock divide. for 2440.
;Setting value Fclk:Hclk:Pclk
ldr r0,=CLKdivN ;CLKdivN 时钟分频控制寄存器
ldr r1,=CLKdiv_VAL ;0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4,
;5=1:4:8,6=1:3:3, 7=1:3:6.
str r1,[r0]
;programhas not been copied, so use these directly
[ CLKdiv_VAL>1 ; means Fclk:Hclk is not 1:1.
;Fclk为cpu的运行时钟,Hclk驱动 AHB总线设备(例如:SDRAM)
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 ;R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
|
mrc p15,0,r0,c1,c0,0
bic r0,r0,#0xc0000000 ;R1_iA:OR:R1_nF
mcr p15,0,r0,c1,c0,0
]
;在配置UPLLCON和MPLLCON寄存器时,必须先配置UPLLCON,然后再配置MPLLCON,而且两者之间要有7 nop的间
;隔。(这是2440文档明确要求的)
;Configure UPLL
ldr r0,=UPLLCON ;UPLLCON: UPLL configuration register
ldr r1,=((U_Mdiv<12)+(U_Pdiv<4)+U_Sdiv) ;Fin = 12.0MHz, UCLK =48MHz,
;对于usb来说必须是48MHz
str r1,[r0]
nop ; Caution: After UPLL setting, at least7-clocks delay must be inserted
; for setting hardware be completed.
nop
nop
nop
nop
nop
nop
;Configure MPLL
ldr r0,=MPLLCON ;MPLLCON: MPLL configuration register
ldr r1,=((M_Mdiv<12)+(M_Pdiv<4)+M_Sdiv) ;Fin = 12.0MHz, FCLK= 400MHz
str r1,[r0]
]
;-------------------------------------------------------------------------------------------------
;Check if the boot is caused by the wake-up from SLEEP mode.
ldr r1,=GSTATUS2 ;这个寄存器数值表示哪个信号引起的复位动作产生
;检测 GSTATUS2[2]来判断是否是由 sleep 模式唤醒引起的电源开启。
ldr r0,[r1]
tst r0,#0x2
;Incase of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.
bne WAKEUP_SLEEP
;-------------------------------------------------------------------------------------------------
;设置总线宽度&等待状态控制寄存器
EXPORT StartPointAfterSleepWakeUp
StartPointAfterSleepWakeUp
;Set memory control registers
;ldr r0,=SMRDATA ;(等效于下边的指令)
adrl r0,SMRDATA ;be careful!中等范围的地址读取伪指令,
;用法类似于ldr(大范围地址读取)伪指令
ldr r1,=BWSCON ;BWSCON Address 总线宽度&等待状态控制寄存器
add r2, r0, #52 ;End address of SMRDATA,共有13个寄存器地址(4字节)需要赋值,13*4=52字节
0
ldr r3, [r0], #4 ;这些都是后变址指令
str r3, [r1], #4
cmp r2, r0
bne % B0 ;当<的时候,跳转到0标号处继续执行
;------------------------------------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;; When EINT0 is pressed, Clear SDRAM
;如果 EINT0 产生(这中断就是我们按键产生的), 就清除SDRAM ,不过好像没人会在这个时候按
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; check if EIN0 button is pressed
ldr r0,=GPFCON ;input,无上拉电阻
ldr r1,=0x0
str r1,[r0]
ldr r0,=GPFUP
ldr r1,=0xff
str r1,[r0]
ldr r1,=GPFDAT
ldr r0,[r1]
bic r0,r0,#(0x1e<1) ; bit clear
tst r0,#0x1
bne? % F1??? ;当按键0没有被按下的时候,也就是不相等,则向下跳到1标号
; 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 ,这几条指令目的是:擦除sdram的所有数据