S3C2440启动代码分析
时间:11-21
来源:互联网
点击:
- yncBusMode和MMU_SetFastBusMode都在4K代码以上,
- ;如果你想你编译出来的程序能在NAND上运行的话,就不要在这调用这两函数了.
- ;如果你不要求的话,你就用把.啥事没有.
- ;为什么是4K,问三星吧,就提供4K的内部SRAM,要是提供400K多好呀.
- ;好了,好了,4K就4K吧,不能用这两函数,自己写还不行吗,下面的代码这这么来了,
- ;实现和上面两函数一样的功能.
- ;===============================================================================
- ;[CLKdiv_VAL>1;意思是Fclk:Hclk不是1:1.
- ;blMMU_SetAsyncBusMode
- ;|
- ;blMMU_SetFastBusMode;defaultvalue.
- ;]
- ;==手册第243页==
- ;IfHdivNisnot0,theCPUbusmodehastobechangedfromthefastbusmodetotheasynchronous
- ;busmodeusingfollowinginstructions
- ;MMU_SetAsyncBusMode
- ;mrcp15,0,r0,c1,c0,0
- ;orrr0,r0,#R1_nF:OR:R1_iA
- ;mcrp15,0,r0,c1,c0,0
- [CLKdiv_VAL>1;意思是Fclk:Hclk不是1:1.
- mrcp15,0,r0,c1,c0,0
- orrr0,r0,#0xc0000000;R1_nF:OR:R1_iA
- mcrp15,0,r0,c1,c0,0
- |
- mrcp15,0,r0,c1,c0,0
- bicr0,r0,#0xc0000000;R1_iA:OR:R1_nF
- mcrp15,0,r0,c1,c0,0
- ]
- ;配置UPLL
- ;//ConfigureUPLLFin=12.0MHzUFout=48MHz
- ldrr0,=UPLLCON
- ldrr1,=((U_Mdiv<12)+(U_Pdiv<4)+U_Sdiv);//USBPLLCONFIG56,2,2===>48MHz
- strr1,[r0]
- ;7个nop必不可少!!
- nop;//Caution:AfterUPLLsetting,atleast7-clocksdelaymustbeinsertedforsettinghardwarebecompleted.
- nop
- nop
- nop
- nop
- nop
- nop
- ;配置MPLL
- ;//ConfigureMPLLFin=12.0MHzMFout=304.8MHz
- ldrr0,=MPLLCON
- ldrr1,=((M_Mdiv<12)+(M_Pdiv<4)+M_Sdiv);68,1,1==>304MHz
- strr1,[r0]
- ]
- ;检查是否从SLEEP模式中恢复
- ;//Checkifthebootiscausedbythewake-upfromSLEEPmode.
- ldrr1,=GSTATUS2
- ldrr0,[r1]
- tstr0,#0x2;testifbit[1]is1or00->C=1
- ;1->C=0
- ;Incaseofthewake-upfromSLEEPmode,gotoSLEEP_WAKEUPhandler.
- bneWAKEUP_SLEEP;C=0,jump
- EXPORTStartPointAfterSleepWakeUp
- StartPointAfterSleepWakeUp
- ;===============================================================================
- ;设置内存控制器等寄存器的值,因为这些寄存器是连续排列的,所以采用如下办法对这些
- ;寄存器进行连续设置.其中用到了SMRDATA的数据,这在代码后面有定义
- ;===============================================================================
- ;这是设置SDRAM,flashROM存储器连接和工作时序的程序,片选定义的程序
- ;SMRDATAmap在下面的程序中定义
- ;SMRDATA中涉及的值请参考memcfg.inc程序
- ;Setmemorycontrolregisters
- ;ldrr0,=SMRDATA;dangerous!!!
- adrlr0,SMRDATA;becareful!,tinko
- ldrr1,=BWSCON;BWSCONAddress
- addr2,r0,#52;EndaddressofSMRDATA;SMRDATA数据的结束地址,共有52字节的数据
- 0
- ldrr3,[r0],#4
- strr3,[r1],#4
- cmpr2,r0
- bne%B0;%表示搜索,B表示反向-back(F表示向前-forward),0为局部标号(0~99)
- ;================================================================================
- ;如果EINT0产生(这中断就是我们按键产生的),就清除SDRAM,不过好像没人会在这个时候按
- ;================================================================================
- ;checkifEIN0buttonispressed
- ldrr0,=GPFCON
- ldrr1,=0x0;00=Input
- strr1,[r0]
- ldrr0,=GPFUP
- ldrr1,=0xff;1-Thepullupfunctionisdisabled.
- strr1,[r0]
- ldrr1,=GPFDAT
- ldrr0,[r1]
- bicr0,r0,#(0x1e<1);bitclear
- tstr0,#0x1
- bne%F1;如果没有按,就跳到后面的1标号处=>Initializestacks
- ;这就是清零内存的代码
- ldrr0,=GPFCON
- ldrr1,=0x55aa
- strr1,[r0]
- ;ldrr0,=GPFUP
- ;ldrr1,=0xff
- ;strr1,[r0]
- ldrr0,=GPFDAT
- ldrr1,=0x0
- strr1,[r0];LED=****
- movr1,#0
- movr2,#0
- movr3,#0
- movr4,#0
- movr5,#0
- movr6,#0
- movr7,#0
- movr8,#0
- ldrr9,=0x4000000;64MB
- ldrr0,=0x30000000
- 0
- stmiar0!,{r1-r8}
- subsr9,r9,#32
- bne%B0
- ;到这就结束了.
- ;//4.初始化各模式下的栈指针
- ;Initializestacks
- 1
- blInitStacks
- ;=======================================================================
- ;哈哈,下面又有看头了,这个初始化程序好像被名曰hzh的高手改过
- ;能在NORNAND还有内存中运行,当然了,在内存中运行最简单了.
- ;在NORNAND中运行的话都要先把自己拷到内存中.
- ;此外,还记得上面提到的|Image
Base|,|ImageRO
Limit|...吗?RO - ;这就是拷贝的依据了!!!
- ;=========================================================================
- ;BWSCON的[2:1]反映了外部引脚OM[1:0]:若OM[1:0]!=00,从NORFLash启动或直接在内存运行;若OM[1:0]==00,则为NandFlashMode
- ldrr0,=BWSCON
- ldrr0,[r0]
- andsr0,r0,#6;#6==0110-->BWSCON[2:1]
- bnecopy_proc_beg;OM[1:0]
S3C2440启动代 相关文章:
- 深入分析S3C2440启动代码中大小端问题(11-22)
- S3C2440启动代码中应用程序执行环境的初始化(11-22)
- S3C2440启动代码 中断分析(11-22)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)