TQ2440启动代码分析(一)
DCD 0xee110f10 ;0xee110f10 =>
DCD 0xe3800080 ;0xe3800080 =>
DCD 0xee010f10 ;0xee010f10 =>
r with NOP and run well in both endian mode.
DCD 0xffffffff
DCD 0xffffffff
DCD 0xffffffff
DCD 0xffffffff
b ResetHandler
;如第前面所说,这里采用HANDLER宏去建立Hander***和Handle***之间的联系
HandlerFIQ HANDLER HandleFIQ
Ha ndlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
IsrIRQ
sub sp,sp,#4 ;reserved for PC,给PC寄存器保留
stmfd sp!,{r8-r9};工作寄存器入栈保护
ldr r9,=INTOFFSET;INTOFFSET在2440addr.inc中定义
ldr r9,[r9]
ldr r8,=HandleEINT0;HandleEINT0 的地址就是中断的入口地址
add r8,r8,r9,lsl #2;逻辑左移就相当于乘以4
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc},将地址从堆栈中弹出给PC
LTORG
;用于声明一个数据缓冲池
;=======
上电和复位后,程序开始从位于0x0 执行b ResetHandler 程序跳转到这里执行,将看门
狗,中断之类的程序关掉,以免打扰初始化程序的进行。
; ENTRY
;=======
ResetHandler
ldr r0,=WTCON ;watch dog disable
ldr r1,=0x0
str r1,[r0]
WTCON 为看门狗控制寄存器,此处将其写入0x0,就是禁止它的所有功能,包括定时
器定时,溢出中断及溢出复位。
ldr r0,=INTMSK
ldr r1,=0xffffffff ;all interrupt disable
str r1,[r0]
INTMSK 为中断屏蔽寄存器,写入0xffffffff,就是禁止所有的中断产生,因为中断
向量表还未初始化,如果此时产生中断会使程序进入未知的状态而跑飞。因为外设的中断太
多,INTMSK 不够用,还需要INTSUBMSK 来将剩余的中断源也禁止掉。
ldr r0,=INTSUBMSK
ldr r1,=0x7fff ;all sub interrupt disable
str r1,[r0]
[ {FALSE} ;亮灯用的,可以用来调试用
;rGPFDAT = (rGPFDAT & ~(0xf<4)) | ((~data & 0xf)<4);
; Led_Display
ldr r0,=GPBCON
ldr r1,=0x155500
str r1,[r0]
ldr r0,=GPBDAT
ldr r1,=0x0
str r1,[r0]
]
;To reduce PLL lock time, adjust the LOCKTIME register.
ldr r0,=LOCKTIME;设置pll 锁定时间
ldr r1,=0xffffff
str r1,[r0]
LOCKTIME 为PLL 锁定时间计数寄存器,重新设定分频值时,PLL 进入锁定,输出稳
定频率的时钟需要一定的时间。这里设置成默认的值,以满足锁定的要求。
[ PLL_ON_START
; Added for confirm clock divide. for 2440.
; Setting value Fclk:Hclk:Pclk
ldr r0,=CLKdivN;用于设定FCLK,HCLK和PCLK的比例
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.,在option.inc中有定义
str r1,[r0]
;program has not been copied, so use these directly
[ CLKdiv_VAL>1 ; means Fclk:Hclk is not 1:1.
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
]
;Configure UPLL
ldr r0,=UPLLCON
ldr r1,=((U_Mdiv<12)+(U_Pdiv<4)+U_Sdiv) ;Fin = 12.0MHz, UCLK = 48MHz
str r1,[r0]
nop ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed. ;在UPP 设定之后,必须等待7 个时钟的延迟,设定才会有效
nop
nop
nop
nop
nop
nop
;Configure MPLL,设置MPLL
ldr r0,=MPLLCON
ldr r1,=((M_Mdiv<12)+(M_Pdiv<4)+M_Sdiv) ;Fin = 12.0MHz, FCLK = 400MHz
str r1,[r0]
]
;查看是否是由睡眠状态启动,如果是则跳转到WAKEUP_SLEEP状态
;Check if the boot is caused by the wake-up from SLEEP mode.
ldr r1,=GSTATUS2
ldr r0,[r1]
tst r0,#0x2
;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.
bne WAKEUP_SLEEP
EXPORTStartPointAfterSleepWakeUp
StartPointAfterSleepWakeUp
初始化内存控制器其实就是对S3C2440 的memory bank 进行设置,使其扩展的存储器
或外部设备能够被处理器通过内存控制器正确读写。由于S3C2440 的最终应用程序是在
SDRAM(bank6)中运行,并与C 语言变量等的用户数据,各种模式的堆栈,中断向量表,
都被定位在SDRAM 的空间,所以它必须在涉及这些处理之前完成初始化工作。
;Set memory control registers
;ldr r0,=SMRDATA
adrl r0, SMRDATA ;be careful!
ldr r1,=BWSCON ;BWSCON Address
add r2, r0, #52 ;End address of SMRDATA
0
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne %B0
这段是功能寄存器初始化,把13 个存储控制器的内容批量的读取到了对应的特殊功能
寄存器中,首先是下面有一个数据区SMRDATA,在程序的后
TQ2440启动代 相关文章:
- TQ2440启动代码分析(二)(11-26)
- TQ2440启动代码分析(三)(11-20)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)