;==;========================================= - ;NAME:2440INIT.S
- ;DESC:Cstartupcodes
- ;Configurememory,ISR,stacks
- ;InitializeC-variables
- ;彻底注释;=========================================
- ;NAME:2440INIT.S
- ;DESC:Cstartupcodes
- ;Configurememory,ISR,stacks
- ;InitializeC-variables
- ;彻底注释
- ;HISTORY:
- ;2002.02.25:kwtark:ver0.0
- ;2002.03.20:purnnamu:AddsomefunctionsfortestingSTOP,Sleepmode
- ;2003.03.14:DonGo:Modifiedfor2440.
- ;200906.24:TinkoModified
- ;=========================================
- ;汇编不能运用include包含头文件,一切用Get
- ;汇编也不认识*.h文件,一切只能用*.inc
- GEToption.inc;界说芯片相关的装备
- GETmemcfg.inc;界说存储器装备
- GET2440addr.inc;界说了寄存器符号
- ;REFRESH寄存器[22]bit:0-autorefresh;1-selfrefresh
- BIT_SELFREFRESHEQU(1<<22);用于节电形式中,SDRAM主动改写
- ;处理器形式常量:CPSR寄存器的后5位决议现在处理器形式M[4:0]
- USERMODEEQU0x10
- FIQMODEEQU0x11
- IRQMODEEQU0x12
- SVCMODEEQU0x13
- ABORTMODEEQU0x17
- UNDEFMODEEQU0x1b
- MODEMASKEQU0x1f;M[4:0]
- NOINTEQU0xc0
- ;界说处理器各形式下仓库地址常量
- UserStackEQU(_STACK_BASEADDRESS-0x3800);0x33ff4800~_STACK_BASEADDRESS界说在option.inc中
- SVCStackEQU(_STACK_BASEADDRESS-0x2800);0x33ff5800~
- UndefStackEQU(_STACK_BASEADDRESS-0x2400);0x33ff5c00~
- AbortStackEQU(_STACK_BASEADDRESS-0x2000);0x33ff6000~
- IRQStackEQU(_STACK_BASEADDRESS-0x1000);0x33ff7000~
- FIQStackEQU(_STACK_BASEADDRESS-0x0);0x33ff8000~
- ;arm处理器有两种作业状况1.arm:32位这种作业状况下履行字对准的arm指令2.Thumb:16位这种作业状
- ;态履行半字对准的Thumb指令
- ;由于处理器分为16位32位两种作业状况程序的编译器也是分16位和32两种编译办法所以下面的程序用
- ;于依据处理器作业状况确认编译器编译办法
- ;code16伪指令指示汇编编译器后边的指令为16位的thumb指令
- ;code32伪指令指示汇编编译器后边的指令为32位的arm指令
- ;
- ;Arm上电时处于ARM状况,故不管指令为ARM集或Thumb集,都先强制成ARM集,待init.s初始化完结后
- ;再依据用户的编译装备转化成相应的指令形式。为此,界说变量THUMBCODE作为指示,跳转到main之前
- ;依据其值切换指令形式
- ;
- ;这段是为了一致现在的处理器作业状况和软件编译办法(16位编译环境运用tasm.exe编译
- ;Checkiftasm.exe(armasm-16…@ADS1.0)isused.
- GBLLTHUMBCODE;界说THUMBCODE全局变量留意EQU所界说的宏与变量的差异
- [{CONFIG}=16;假如发现是在用16位代码的话(编译选项中指定运用thumb指令)
- THUMBCODESETL{TRUE};一方面把THUMBCODE设置为TURE
- CODE32;另一方面暂时把处理器设置成为ARM形式,以便利初始化
- |;(|表明else)假如编译选项本来就指定为ARM形式
- THUMBCODESETL{FALSE};把THUMBCODE设置为FALSE就行了
- ];完毕
- MACRO;一个依据THUMBCODE把PC寄存的值保存到LR的宏
- MOV_PC_LR;宏称号
- [THUMBCODE;假如界说了THUMBCODE,则
- bxlr;在ARM形式中要运用BX指令转跳到THUMB指令,并转化形式.bx指令会依据PC终究1位来确认是否进入thumb状况
- |;不然,
- movpc,lr;假如方针地址也是ARM指令的话就选用这种办法
- ]
- MEND;宏界说完毕标志
- MACRO;和上面的宏相同,仅仅多了一个持平的条件
- MOVEQ_PC_LR
- [THUMBCODE
- bxeqlr
- |
- moveqpc,lr
- ]
- MEND
- ;=======================================================================================
- ;下面这个宏是用于榜首次查表进程的完结中止向量的重定向,假如你比较仔细的话便是发现
- ;在_ISR_STARTADDRESS=0x33FF_FF00里界说的榜首级中止向量表是选用型如Handle***的办法的.
- ;而在程序的ENTRY处(程序开端处)选用的是bHandler***的办法.
- ;在这儿Handler***便是经过HANDLER这个宏和Handle***树立联络的.
- ;这种办法的长处便是正真界说的向量数据在内存空间里,而不是在ENTRY处的ROM(FLASH)空间里,
- ;这样,咱们就能够在程序里灵敏的改动向量的数据了.
- ;========================================================================================
- ;;这段程序用于把中止服务程序的首地址装载到pc中,有人称之为“加载程序”。
- ;本初始化程序界说了一个数据区(在文件终究),34个字空间,寄存相应中止服务程序的首地址。每个字
- ;空间都有一个标号,以Handle***命名。
- ;在向量中止形式下运用“加载程序”来履行中止服务程序。
- ;这儿就有必要讲一下向量中止形式和非向量中止形式的概念
- ;向量中止形式是当cpu读取坐落0x18处的IRQ中止指令的时分,体系主动读取对应于该中止源确认地址上的;
- ;指令替代0x18处的指令,经过跳转指令体系就直接跳转到对应地址
- ;函数中节省了中止处理时刻提高了中止处理速度标例如ADC中止的向量地址为0xC0,则在0xC0处放如下
- ;代码:ldrPC,=HandlerADC当ADC中止发生的时分体系会
- ;主动跳转到HandlerADC函数中
- ;非向量中止形式处理办法是一种传统的中止处理办法,当体系发生中止的时分,体系将interrupt
- ;pending寄存器中对应标志方位位然后跳转到坐落0x18处的一致中止
- ;函数中该函数经过读取interruptpending寄存器中对应标志位来判别中止源并依据优先级联络再跳到
- ;对应中止源的处理代码中
- ;
- ;H|——|H|——|H|——|H|——|H|——|
- ;|///||///||///||///||///|
- ;|——|<----sp|------||------||------||------|<------sp
- ;L|||——|<----spL|------||-isr--||------|isr==>pc
- ;|||||–r0–|<----sp|---r0-|<----spL|------|r0==>r0
- ;(0)(1)(2)(3)(4)
- MACRO
- $HandlerLabelHANDLER$HandleLabel
- $HandlerLabel;标号
- subsp,sp,#4;(1)削减sp(用于寄存转跳地址)
- stmfdsp!,{r0};(2)把作业寄存器压入栈(lrdoesnotpushbecauseitreturntooriginaladdress)
- ldrr0,=$HandleLabel;将HandleXXX的址址放入r0
- ldrr0,[r0];把HandleXXX所指向的内容(也便是中止程序的进口)放入r0
- strr0,[sp,#4];(3)把中止服务程序(ISR)压入栈
- ldmfdsp!,{r0,pc};(4)用出栈的办法康复r0的原值和为pc设定新值(也就完结了到ISR的转跳)
- MEND
- ;=========================================================================================
- ;在这儿用IMPORT伪指令(和c言语的extren相同)引进|Image
RO Base|,|Image
RO Limit|…
- ;这些变量是经过ADS的工程设置里边设定的ROBase和RWBase设定的,
- ;终究由编译脚本和衔接程序导入程序.
- ;那为什么要引进这玩意呢,最简略的用途是能够依据它们仿制自已
- ;==========================================================================================
- ;Image
RO Base等比较乖僻的变量是编译器生成的。RO,RW,ZI这三个段都保存在Flash中,但RW,ZI在Flash中
- ;的地址必定不是程序运转时变量所存储的方位,因而咱们的程序在初始化时应该把Flash中的RW,ZI仿制到RAM的对应方位。
- ;一般状况下,咱们能够运用编译器替咱们完结这个操作。比方咱们跳转到main()时,运用b__Main,编译器就会在__Main
- ;和Main之间刺进一段汇编代码,来替咱们完结RW,ZI段的初始化。假如咱们运用bMain,那么初始化作业要咱们自己做。
- ;编译器会生成如下变量告知咱们RO,RW,ZI三个段应该坐落什么方位,可是它并没有告知咱们RW,ZI在Flash中存储在什么方位,
- ;实际上RW,ZI在Flash中的方位就紧接着RO存储。咱们知道了Image
RO Base,Image
RO Limit,那么Image
RO Limit就
- ;是RW(ROMdata)的开端。
- IMPORT|Image
RO Base|;BaseofROMcode
- IMPORT|Image
RO Limit|;EndofROMcode(=startofROMdata)
- IMPORT|Image
RW Base|;BaseofRAMtoinitialise
- IMPORT|Image
ZI Base|;Baseandlimitofarea
- IMPORT|Image
ZI Limit|;tozeroinitialise
- ;这儿引进一些在其它文件中完结在函数,包含为咱们所熟知的main函数
- ;IMPORTMMU_SetAsyncBusMode
- ;IMPORTMMU_SetFastBusMode;hzh
- IMPORTMain
- ;从这儿开端便是正真的代码进口了!
- AREAInit,CODE,READONLY;这表明下面的是一个名为Init的代码段
- ENTRY;界说程序的进口(调试用)
- EXPORT__ENTRY;导出符号_ENTRY,但在那用到就还没查明
- __ENTRY
- ResetEntry
- ;1)Thecode,whichconvertstoBig-endian,shouldbeinlittleendiancode.
- ;2)ThefollowinglittleendiancodewillbecompiledinBig-Endianmode.
- ;Thecodebyteordershouldbechangedasthememorybuswidth.
- ;3)Thepseudoinstruction,DCDcannotbeusedherebecausethelinkergenerateserror.
- ;条件编译,在编译成机器码前就设定好
- ASSERT:DEF:ENDIAN_CHANGE;判别ENDIAN_CHANGE是否已界说
- [ENDIAN_CHANGE;假如现已界说了ENDIAN_CHANGE,则(在Option.inc里现已设为FALSE)
- ASSERT:DEF:ENTRY_BUS_WIDTH;判别ENTRY_BUS_WIDTH是否已界说
- [ENTRY_BUS_WIDTH=32;假如现已界说了ENTRY_BUS_WIDTH,则判别是不是为32
- bChangeBigEndian;DCD0xea000007
- ]
- ;在bigendian中,地址为A的字单元包含字节单元A,A+1,A+2,A+3,字节单元由高位到低位为A,A+1,A+2,A+3
- ;地址为A的字单元包含半字单元A,A+2,半字单元由高位到低位为A,A+2
- [ENTRY_BUS_WIDTH=16
- andeqr14,r7,r0,lsl#20;DCD0x0007ea00也是bChangeBigEndian指令,仅仅由于总线不相同而取机器码的次序不相同
- ];先取低位->高位上述指令是经过机器码装换而来的
- [ENTRY_BUS_WIDTH=8
- streqr0,[r0,-r10,ror#1];DCD0x070000ea也是bChangeBigEndian指令,仅仅由于总线不相同而取机器码的次序不相同
- ]
- |
- bResetHandler;咱们的程序由于ENDIAN_CHANGE设成FALSE就到这儿了,转跳到复位程序进口
- ]
- bHandlerUndef;handlerforUndefinedmode;0x04
- bHandlerSWI;handlerforSWIinterrupt;0x08
- bHandlerPabort;handlerforPAbort;0x0c
- bHandlerDabort;handlerforDAbort;0x10
- b.;reserved留意小圆点;0x14
- bHandlerIRQ;handlerforIRQinterrupt;0x18
- bHandlerFIQ;handlerforFIQinterrupt;0x1c
- ;@0x20
- bEnterPWDN;Mustbe@0x20.
- ;==================================================================================
- ;下面是改动巨细端的程序,这儿选用直接界说机器码的办法,至说为什么这么做就得问三星了
- ;横竖咱们程序里这段代码也不会去履行,不必去管它
- ;==================================================================================
- ;经过设置CP15的C1的位7,设置存储格局为Bigendian,三种总线办法
- ChangeBigEndian;//hereENTRY_BUS_WIDTH=16
- ;@0x24
- [ENTRY_BUS_WIDTH=32
- DCD0xee110f10;0xee110f10=>mrcp15,0,r0,c1,c0,0
- DCD0xe3800080;0xe3800080=>orrr0,r0,#0x80;//Big-endian
- DCD0xee010f10;0xee010f10=>mcrp15,0,r0,c1,c0,0
- ;对存储器操控寄存器操作,指定内存形式为Big-endian
- ;由于刚开端CPU都是依照32位总线的指令格局运转的,假如选用其他的话,CPU别不了,有必要转化
- ;但当体系初始化好今后,则CPU能主动识别
- ]
- [ENTRY_BUS_WIDTH=16
- DCD0x0f10ee11
- DCD0x0080e380
- DCD0x0f10ee01
- ;由于选用Big-endian形式,选用16位总线时,物理地址的高位和数据的方位对应
- ;所以指令的机器码也相应的凹凸对调
- ]
- [ENTRY_BUS_WIDTH=8
- DCD0x100f11ee
- DCD0x800080e3
- DCD0x100f01ee
- ]
- DCD0xffffffff;swinv0xffffffissimilarwithNOPandrunwellinbothendianmode.
- DCD0xffffffff
- DCD0xffffffff
- DCD0xffffffff
- DCD0xffffffff
- bResetHandler
- ;=========================================================================================
- ;Functionforenteringpowerdownmode
- ;1.SDRAMshouldbeinself-refreshmode.
- ;2.AllinterruptshouldbemakskedforSDRAM/DRAMself-refresh.
- ;3.LCDcontrollershouldbedisabledforSDRAM/DRAMself-refresh.
- ;4.TheI-cachemayhavetobeturnedon.
- ;5.Thelocationofthefollowingcodemayhavenottobechanged.
- ;voidEnterPWDN(intCLKCON);
- EnterPWDN
- movr2,r0;r2=rCLKCON保存原始数据0x4c00000c使能各模块的时钟输入
- tstr0,#0x8;测验bit[3]SLEEPmode?1=>sleep
- bneENTER_SLEEP;C=0,即TST成果非0,bit[3]=1
- ;//进入PWDN后假如不是sleep则进入stop
- ;//进入Stopmode
- ENTER_STOP
- ldrr0,=REFRESH;0x48000024DRAM/SDRAMrefreshconfig
- ldrr3,[r0];r3=rREFRESH
- movr1,r3
- orrr1,r1,#BIT_SELFREFRESH;EnableSDRAMself-refresh
- strr1,[r0];EnableSDRAMself-refresh
- movr1,#16;waituntilself-refreshisissued.maynotbeneeded.
- 0
- subsr1,r1,#1
- bne%B0
- ;//wait16fclksforself-refresh
- ldrr0,=CLKCON;enterSTOPmode.
- strr2,[r0]
- movr1,#32
- 0
- subsr1,r1,#1;1)waituntiltheSTOPmodeisineffect.
- bne%B0;2)OrwaithereuntiltheCPU&Peripheralswillbeturned-off
- ;EnteringSLEEPmode,onlytheresetbywake-upisavailable.
- ldrr0,=REFRESH;exitfromSDRAMselfrefreshmode.
- strr3,[r0]
- MOV_PC_LR;backtomainprocess
- ENTER_SLEEP
- ;NOTE.
- ;1)rGSTATUS3shouldhavethereturnaddressafterwake-upfromSLEEPmode.
- ldrr0,=REFRESH
- ldrr1,[r0];r1=rREFRESH
- orrr1,r1,#BIT_SELFREFRESH
- strr1,[r0];EnableSDRAMself-refresh
- ;//EnableSDRAMself-refresh
- movr1,#16;Waituntilself-refreshisissued,whichmaynotbeneeded.
- 0
- subsr1,r1,#1
- bne%B0
- ;//Waituntilself-refreshisissued,whichmaynotbeneeded
- ldrr1,=MISCCR;IOregister
- ldrr0,[r1]
- orrr0,r0,#(7<<17);SetSCLK0=1,SCLK1=1,SCKE=1.
- strr0,[r1]
- ldrr0,=CLKCON;Entersleepmode
- strr2,[r0]
- b.;CPUwilldiehere.
- ;//进入SleepMode,1)设置SDRAM为self-refresh
- ;//2)设置MISCCRbit[17]1:sclk0=sclk0:sclk0=0
- ;//bit[18]1:sclk1=sclk0:sclk1=0
- ;//bit[19]1:Selfrefreshretainenable
- ;//0:Selfrefreshretaindisable
- ;//When1,Afterwake-upfromsleep,Theself-refreshwillberetained.
- WAKEUP_SLEEP
- ;ReleaseSCLKnafterwake-upfromtheSLEEPmode.
- ldrr1,=MISCCR
- ldrr0,[r1]
- bicr0,r0,#(7<<17);SCLK0:0->SCLK,SCLK1:0->SCLK,SCKE:0->=SCKE.
- strr0,[r1]
- ;//设置MISCCR
- ;Setmemorycontrolregisters
- ;ldrr0,=SMRDATA
- adrlr0,SMRDATA
- ldrr1,=BWSCON;BWSCONAddress;//总线宽度和等候操控寄存器
- addr2,r0,#52;EndaddressofSMRDATA
- 0
- ldrr3,[r0],#4;数据处理后R0自加4,[R0]->R3,R0+4->R0
- strr3,[r1],#4
- cmpr2,r0
- bne%B0
- ;//设置一切的memorycontrolregister,他的初始地址为BWSCON,初始化
- ;//数据在以SMRDATA为开端的存储区
- movr1,#256
- 0
- subsr1,r1,#1;1)waituntiltheSelfRefreshisreleased.
- bne%B0
- ;//1)waituntiltheSelfRefreshisreleased.
- ldrr1,=GSTATUS3;GSTATUS3hasthestartaddressjustafterSLEEPwake-up
- ldrr0,[r1]
- movpc,r0
- ;//跳出SleepMode,进入Sleep状况前的PC
- ;============================================================================================
- ;如上所说,这儿选用HANDLER宏去树立Hander***和Handle***之间的联络
- LTORG;声明文字池,由于咱们用了ldr伪指令
- HandlerFIQHANDLERHandleFIQ
- HandlerIRQHANDLERHandleIRQ
- HandlerUndefHANDLERHandleUndef
- HandlerSWIHANDLERHandleSWI
- HandlerDabortHANDLERHandleDabort
- HandlerPabortHANDLERHandlePabort
- ;===================================================================================
- ;呵呵,来了来了.好戏来了,这一段程序便是用来进行第2次查表的进程了.
- ;假如说榜首次查表是由硬件来完结的,那这一次查表便是由软件来完结的了.
- ;为什么要查两次表??
- ;没有办法,ARM把一切的中止都概括成一个IRQ中止反常和一个FIRQ中止反常
- ;榜首次查表主要是查出是什么反常,可咱们总要知道是这个中止反常中的什么中止呀!
- ;没办法了,再查一次表呗!
- ;===================================================================================
- ;//外部中止号判别,经过中止服务程序进口地址存储器的地址偏移确认
- ;//PC=[HandleEINT0+[INTOFFSET]]
- ;H|——|
- ;|///|
- ;|–isr-|====>pc
- ;L|–r8–|
- ;|–r9–|<----sp
- IsrIRQ
- subsp,sp,#4;给PC寄存器保存reservedforPC
- stmfdsp!,{r8-r9};把r8-r9压入栈
- ldrr9,=INTOFFSET;把INTOFFSET的地址装入r9INTOFFSET是一个内部的寄存器,存着中止的偏移
- ldrr9,[r9];I_ISR
- ldrr8,=HandleEINT0;这便是咱们第二个中止向量表的进口的,先装入r8
- ;===================================================================================
- ;哈哈,这查表办法够好了吧,r8(进口)+index*4(别望了一条指令是4bytes的喔),
- ;这不便是咱们要找的那一项了吗.找到了表项,下一步做什么?必定先装入了!
- ;==================================================================================
- addr8,r8,r9,lsl#2;地址对齐,由于每个中止向量占4个字节,即isr=IvectTable+Offeset*4
- ldrr8,[r8];装入中止服务程序的进口
- strr8,[sp,#8];把进口也入栈,预备用旧招
- ldmfdsp!,{r8-r9,pc};施招,弹出栈,哈哈,顺便把r8弹出到PC了,跳转成功!
- LTORG
- ;==============================================================================
- ;ENTRY(好了,咱们的CPU要在这复位了.)
- ;==============================================================================
- ResetHandler
- ldrr0,=WTCON;1.关看门狗
- ldrr1,=0x0;bit[5]:0-disable;1-enable(reset默许)
- strr1,[r0]
- ldrr0,=INTMSK
- ldrr1,=0xffffffff;2.关中止
- strr1,[r0]
- ldrr0,=INTSUBMSK
- ldrr1,=0x7fff;3.关子中止
- strr1,[r0]
- [{FALSE};4.得有些表明了,该点点LED灯了,不过被FALSE掉了.
- ;rGPFDAT=(rGPFDAT&~(0xf<<4))|((~data&0xf)<<4);
- ;Led_Display
- ldrr0,=GPFCON
- ldrr1,=0x5500
- strr1,[r0]
- ldrr0,=GPFDAT
- ldrr1,=0x10
- strr1,[r0]
- ]
- ;5.为了削减PLL的locktime,调整LOCKTIME寄存器.
- ;ToreducePLLlocktime,adjusttheLOCKTIMEregister.
- ldrr0,=LOCKTIME
- ldrr1,=0xffffff;reset的默许值
- strr1,[r0]
- ;6.下面就来设置PLL了,你的板快不快就看这了!!
- ;这儿介绍一下核算公式
- ;//Fpllo=(m*Fin)/(p*2^s)
- ;//m=MDIV+8,p=PDIV+2,s=SDIV
- ;TheproperrangeofPandM:1<=P<=62,1<=M<=248
- ;Fpllo有必要大于200Mhz小于600Mhz
- ;Fpllo*2^s有必要小于1.2GHz
- ;如下面的PLLCON设定中的M_DIVP_DIVS_DIV是取自option.h中
- ;#elif(MCLK==40000000)
- ;#definePLL_M(0x48)
- ;#definePLL_P(0x3)
- ;#definePLL_S(0x2)
- ;所以m=MDIV+8=80,p=PDIV+2=5,s=SDIV=2
- ;硬件运用晶振为10Mhz,即Fin=10Mhz
- ;Fpllo=80*10/5*2^2=40Mhz
- [PLL_ON_START
- ;Addedforconfirmclockdivide.for2440.
- ;SettingvalueFclk:Hclk:Pclk
- ldrr0,=CLKDIVN
- ldrr1,=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中界说CLKDIV_VAL=7
- strr1,[r0];//数据表明分频数
- ;===============================================================================
- ;MMU_SetAsyncBusMode和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
RO Base|,|Image
RO Limit|…吗?
- ;这便是仿制的依据了!!!
- ;=========================================================================
- ;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]!=00,NORFLashboot,不读取NANDFLASH
- adrr0,ResetEntry;不然,OM[1:0]==0,为从NANDFLash发动
- cmpr0,#0;再比较进口是否为0地址处
- ;假如是0才是真正从NAND发动,由于其4k被仿制到0地址开端的stepingstone内部sram中
- ;留意adr得到的是相对地址,非肯定地址==ifuseMulti-ice,
- bnecopy_proc_beg;假如!=0,阐明在usingice,这种状况也不读取NANDFLASH.dontreadnandflashforboot
- ;nop
- ;==============这一段代码完结从NANDFlash读代码到RAM=====================
- nand_boot_beg;
- movr5,#NFCONF;首要设定NAND的一些操控寄存器
- ;settimingvalue
- ldrr0,=(7<<12)|(7<<8)|(7<<4)
- strr0,[r5]
- ;enablecontrol
- ldrr0,=(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
- strr0,[r5,#4]
- blReadNandID;按着读取NAND的ID号,成果保存在r5里
- movr6,#0;r6设初值0.
- ldrr0,=0xec73;希望的NANDID号
- cmpr5,r0;这儿进行比较
- beq%F1;持平的话就跳到下一个1标号处
- ldrr0,=0xec75;这是另一个希望值
- cmpr5,r0
- beq%F1;持平的话就跳到下一个1标号处
- movr6,#1;不持平,设置r6=1.
- 1
- blReadNandStatus;读取NAND状况,成果放在r1里
- movr8,#0;r8设初值0,含义为页号
- ldrr9,=ResetEntry;r9设初值为初始化程序进口地址
- ;留意,在这儿运用的是ldr伪指令,而不是上面用的adr伪指令,它加载的是ResetEntry
- ;的肯定地址,也便是咱们希望的RAM中的地址,在这儿,它和|Image
RO Base|相同
- ;也便是说,我如咱们编译程序时RObase指定的地址在RAM里,而把生成的文件拷到
- ;NAND里运转,由ldr加载的r9的值仍是定位在内存.???
- 2
- andsr0,r8,#0x1f;凡r8为0x1f(32)的整数倍-1,eq有用,ne无效
- bne%F3;这句的意思是对每个块(32页)进行检错–在每个块的开端页进行
- movr0,r8;r8->r0
- blCheckBadBlk;查看NAND的坏区
- cmpr0,#0;比较r0和0
- addner8,r8,#32;存在坏块的话就越过这个坏块:+32得到下一块.故:r8=blockpageaddr,由于读写是按页进行的(每页512Byte)
- bne%F4;然后跳到4进行循环条件判别。没有的话就跳到标号3处copy当时页
- 3
- movr0,r8;当时页号->r0
- movr1,r9;当时方针地址->r1
- blReadNandPage;读取该页的NAND数据到RAM
- addr9,r9,#512;每一页的巨细是512Bytes
- addr8,r8,#1;r8指向下一页
- 4
- cmpr8,#256;比较是否读完256页即128KBytes
- ;留意:这阐明此程序默许仿制128KByte的代码(byTinko)
- bcc%B2;假如r8小于256(没读完),就回来前面的标号2处
- ;nowcopycompleted
- movr5,#NFCONF;DisableNandFlash
- ldrr0,[r5,#4]
- bicr0,r0,#1
- strr0,[r5,#4]
- ldrpc,=copy_proc_beg;调用copy_proc_beg
- ;个人认为应该为InitRam?????????????????????????????
- ;===========================================================
- copy_proc_beg
- adrlr0,ResetEntry;ResetEntry值->r0
- ;这儿应该留意,运用的是adr,而不是ldr。运用ldr阐明ResetEntry是个肯定地址,这个地址是在程序链接的时分
- ;确认的。而运用adr则阐明ResetEntry的地址和当时代码的履行方位有关,它是一个相对的地址。比方这段代码
- ;在stepingstone里边履行,那么ResetEntry的地址便是零。假如在RAM里履行,那么ResetEntry就应是RAM的一个
- ;地址,应该等于RObase。
- ldrr2,BaseOfROM;BaseOfROM值(后边有界说)->r2
- cmpr0,r2;比较ResetEntry和BaseOfROM
- ldreqr0,TopOfROM;假如持平的话(在内存运转—ice–无需仿制code区中的ro段,但需求仿制code区中的rw段),TopOfROM->r0
- beqInitRam;一起跳到InitRam
- ;不然,下面开端仿制code的RO段
- ;=========================================================
- ;下面这个是针对代码在NORFLASH时的仿制办法
- ;功用为把从ResetEntry起,TopOfROM-BaseOfROM巨细的数据拷到BaseOfROM
- ;TopOfROM和BaseOfROM为|Image
RO Limit|和|Image
RO Base|
- ;|Image
RO Limit|和|Image
RO Base|由衔接器生成
- ;为生成的代码的代码段运转时的起启和停止地址
- ;BaseOfBSS和BaseOfZero为|Image
RW Base|和|Image
ZI Base|
- ;|Image
RW Base|和|Image
ZI Base|也是由衔接器生成
- ;两者之间便是初始化数据的寄存地
- ;–在加载阶段,不存在ZI区域–
- ;=======================================================
- ldrr3,TopOfROM
- 0
- ldmiar0!,{r4-r7};开端时,r0=ResetEntry—source
- stmiar2!,{r4-r7};开端时,r2=BaseOfROM—destination
- cmpr2,r3;停止条件:仿制了TopOfROM-BaseOfROM巨细
- bcc%B0
- ;—————————————————————
- ;下面2行,依据了解,由tinko增加
- ;猜想上面的代码不该该用”!”,以至于地址被修正。这儿从头赋值
- ;—————————————————————
- adrlr0,ResetEntry;dontuseadr,causeoutofrangeerroroccures
- ldrr2,BaseOfROM
- ;旨在核算出正确的RW区开端方位
- ;下面2行意图是为了核算正确的r0(有必要使之指向code区中的rw域开端处)
- subr2,r2,r3;r2=BaseOfROM-TopOfROM=(-)代码长度
- subr0,r0,r2;r0=ResetEntry-(-)代码长度=ResetEntry+代码长度
- InitRam
- ;仿制代码加载方位中的RM区到|Image
RW Base|
- ldrr2,BaseOfBSS;BaseOfBSS->r2,BaseOfBSS=|Image
RW Base|
- ldrr3,BaseOfZero;BaseOfZero->r3,BaseOfZero=|Image
ZI Base|
- 0
- cmpr2,r3;比较BaseOfBSS和BaseOfZero
- ldrccr1,[r0],#4;当代码在内存中运转时,r0(初始值)=TopOfROM.这之后的BaseOfZero-BaseOfBSS仍归于code,需仿制到BaseOfBSS
- strccr1,[r2],#4
- bcc%B0
- ;用0初始化ZI区
- movr0,#0
- ldrr3,EndOfBSS;EndOfBSS=|Image
ZI Limit|
- 1
- cmpr2,r3
- strccr0,[r2],#4
- bcc%B1
- ;要是r21;meansFclk:Hclkisnot1:1.
- ;blMMU_SetAsyncBusMode
- ;|
- ;blMMU_SetFastBusMode;defaultvalue.
- ;]
- ;blLed_Test
- ;===========================================================
- ;进入C言语前的终究一步了,便是把咱们用说查二级向量表
- ;的中止例程安装到一级向量表(反常向量表)里.
- ;//5.设置缺省中止处理函数
- ;SetupIRQhandler
- ldrr0,=HandleIRQ;Thisroutineisneeded
- ldrr1,=IsrIRQ;ifthereisntsubspc,lr,#4at0x18,0x1c
- strr1,[r0]
- ;//initializetheIRQ将一般中止判别程序的进口地址给HandleIRQ
- ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ;留意,以下这段或许不需求!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ;//6.将数据段仿制到ram中将零初始化数据段清零跳入C言语的main函数履行到这步完毕bootloader开始引导完毕
- ;Ifmain()isused,thevariableinitializationwillbedonein__main().
- [{FALSE};bytinko–最外面的条件由tinko增加,实际上不再履行这段
- [:LNOT:USE_MAIN;initialized{FALSE}
- ;CopyandpasteRWdata/zeroinitializeddata
- LDRr0,=|Image
RO Limit|;GetpointertoROMdata
- LDRr1,=|Image
RW Base|;andRAMcopy
- LDRr3,=|Image
ZI Base|
- ;Zeroinitbase=>topofinitialiseddata
- CMPr0,r1;Checkthattheyaredifferentjustfordebug??????????????????????????
- BEQ%F2
- 1
- CMPr1,r3;Copyinitdata
- LDRCCr2,[r0],#4;–>LDRCCr2,[r0]+ADDr0,r0,#4
- STRCCr2,[r1],#4;–>STRCCr2,[r1]+ADDr1,r1,#4
- BCC%B1
- 2
- LDRr1,=|Image
ZI Limit|;Topofzeroinitsegment
- MOVr2,#0
- 3
- CMPr3,r1;Zeroinit
- STRCCr2,[r3],#4
- BCC%B3
- ]
- ]
- ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ;***************************************
- ;bytinko
- [{TRUE};得有些表明了,该点点LED灯了
- ;rGPFDAT=(rGPFDAT&~(0xf<<4))|((~data&0xf)<<4);
- ;Led_Display
- ldrr0,=GPFCON
- ldrr1,=0x5500
- strr1,[r0]
- ldrr0,=GPFDAT
- ldrr1,=0xe0
- strr1,[r0]
- ldrr2,=0xffffffff;
- 1
- subr2,r2,#1
- bne%b1
- ldrr0,=GPFDAT
- ldrr1,=0xe0
- ;b.;diehere
- ]
- ;*****************************************
- ;*****************************************************************************
- ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ;妈呀,终说见到艳阳天了!!!!!!!!!!
- ;跳到C言语的main函数处了.
- ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ;*****************************************************************************
- [:LNOT:THUMBCODE;ifthumbcode={false}blmainL代表logic变量
- blMain;Dontusemain()because……
- b.;留意小圆点
- ]
- ;//ifthumbcod={ture}
- [THUMBCODE;forstart-upcodeforThumbmode
- orrlr,pc,#1
- bxlr
- CODE16
- blMain;Dontusemain()because……
- b.;留意小圆点
- CODE32
- ]
- ;functioninitializingstacks
- InitStacks
- ;DontuseDRAM,suchasstmfd,ldmfd……
- ;SVCstackisinitializedbefore
- ;Undertoolkitver2.5,msrcpsr,r1canbeusedinsteadofmsrcpsr_cxsf,r1
- mrsr0,cpsr
- bicr0,r0,#MODEMASK
- orrr1,r0,#UNDEFMODE|NOINT
- msrcpsr_cxsf,r1;UndefMode
- ldrsp,=UndefStack;UndefStack=0x33FF_5C00
- orrr1,r0,#ABORTMODE|NOINT
- msrcpsr_cxsf,r1;AbortMode
- ldrsp,=AbortStack;AbortStack=0x33FF_6000
- orrr1,r0,#IRQMODE|NOINT
- msrcpsr_cxsf,r1;IRQMode
- ldrsp,=IRQStack;IRQStack=0x33FF_7000
- orrr1,r0,#FIQMODE|NOINT
- msrcpsr_cxsf,r1;FIQMode
- ldrsp,=FIQStack;FIQStack=0x33FF_8000
- bicr0,r0,#MODEMASK|NOINT
- orrr1,r0,#SVCMODE
- msrcpsr_cxsf,r1;SVCMode
- ldrsp,=SVCStack;SVCStack=0x33FF_5800
- ;USERmodehasnotbeinitialized.
- ;//为什么不必初始化user的stacks,体系刚发动的时分运转在哪个形式下?
- movpc,lr
- ;TheLRregisterwontbevalidifthecurrentmodeisnotSVCmode.?
- ;//系一致开端运转便是SVCmode?
- ;===========================================================
- ReadNandID
- movr7,#NFCONF
- ldrr0,[r7,#4];NFChipEn();
- bicr0,r0,#2
- strr0,[r7,#4]
- movr0,#0x90;WrNFCmd(RdIDCMD);
- strbr0,[r7,#8]
- movr4,#0;WrNFAddr(0);
- strbr4,[r7,#0xc]
- 1;while(NFIsBusy());
- ldrr0,[r7,#0x20]
- tstr0,#1
- beq%B1
- ldrbr0,[r7,#0x10];id=RdNFDat()<<8;
- movr0,r0,lsl#8
- ldrbr1,[r7,#0x10];id|=RdNFDat();
- orrr5,r1,r0
- ldrr0,[r7,#4];NFChipDs();
- orrr0,r0,#2
- strr0,[r7,#4]
- movpc,lr
- ReadNandStatus
- movr7,#NFCONF
- ldrr0,[r7,#4];NFChipEn();
- bicr0,r0,#2
- strr0,[r7,#4]
- movr0,#0x70;WrNFCmd(QUERYCMD);
- strbr0,[r7,#8]
- ldrbr1,[r7,#0x10];r1=RdNFDat();
- ldrr0,[r7,#4];NFChipDs();
- orrr0,r0,#2
- strr0,[r7,#4]
- movpc,lr
- WaitNandBusy
- movr0,#0x70;WrNFCmd(QUERYCMD);
- movr1,#NFCONF
- strbr0,[r1,#8]
- 1;while(!(RdNFDat()&0x40));
- ldrbr0,[r1,#0x10]
- tstr0,#0x40
- beq%B1
- movr0,#0;WrNFCmd(READCMD0);
- strbr0,[r1,#8]
- movpc,lr
- CheckBadBlk
- movr7,lr
- movr5,#NFCONF
- bicr0,r0,#0x1f;addr&=~0x1f;
- ldrr1,[r5,#4];NFChipEn()
- bicr1,r1,#2
- strr1,[r5,#4]
- movr1,#0x50;WrNFCmd(READCMD2)
- strbr1,[r5,#8]
- movr1,#5;6;6->5
- strbr1,[r5,#0xc];WrNFAddr(5);(6)6->5
- strbr0,[r5,#0xc];WrNFAddr(addr)
- movr1,r0,lsr#8;WrNFAddr(addr>>8)
- strbr1,[r5,#0xc]
- cmpr6,#0;if(NandAddr)
- movner0,r0,lsr#16;WrNFAddr(addr>>16)
- strnebr0,[r5,#0xc]
- ;blWaitNandBusy;WaitNFBusy()
- ;donotuseWaitNandBusy,afterWaitNandBusywillreadpartA!
- movr0,#100
- 1
- subsr0,r0,#1
- bne%B1
- 2
- ldrr0,[r5,#0x20]
- tstr0,#1
- beq%B2
- ldrbr0,[r5,#0x10];RdNFDat()
- subr0,r0,#0xff
- movr1,#0;WrNFCmd(READCMD0)
- strbr1,[r5,#8]
- ldrr1,[r5,#4];NFChipDs()
- orrr1,r1,#2
- strr1,[r5,#4]
- movpc,r7
- ReadNandPage
- movr7,lr
- movr4,r1
- movr5,#NFCONF
- ldrr1,[r5,#4];NFChipEn()
- bicr1,r1,#2
- strr1,[r5,#4]
- movr1,#0;WrNFCmd(READCMD0)
- strbr1,[r5,#8]
- strbr1,[r5,#0xc];WrNFAddr(0)
- strbr0,[r5,#0xc];WrNFAddr(addr)
- movr1,r0,lsr#8;WrNFAddr(addr>>8)
- strbr1,[r5,#0xc]
- cmpr6,#0;if(NandAddr)
- movner0,r0,lsr#16;WrNFAddr(addr>>16)
- strnebr0,[r5,#0xc]
- ldrr0,[r5,#4];InitEcc()
- orrr0,r0,#0x10
- strr0,[r5,#4]
- blWaitNandBusy;WaitNFBusy()
- movr0,#0;for(i=0;i<512;i++)
- 1
- ldrbr1,[r5,#0x10];buf[i]=RdNFDat()
- strbr1,[r4,r0]
- addr0,r0,#1
- bicr0,r0,#0x10000
- cmpr0,#0x200
- bcc%B1
- ldrr0,[r5,#4];NFChipDs()
- orrr0,r0,#2
- strr0,[r5,#4]
- movpc,r7
- ;——————–LEDtest
- EXPORTLed_Test
- Led_Test
- movr0,#0x56000000
- movr1,#0x5500
- strr1,[r0,#0x50]
- 0
- movr1,#0x50
- strr1,[r0,#0x54]
- movr2,#0x100000
- 1
- subsr2,r2,#1
- bne%B1
- movr1,#0xa0
- strr1,[r0,#0x54]
- movr2,#0x100000
- 2
- subsr2,r2,#1
- bne%B2
- b%B0
- movpc,lr
- ;===========================================================
- ;=====================================================================
- ;Clockdivisiontest
- ;Assemblecode,becauseVSYNCtimeisveryshort
- ;=====================================================================
- EXPORTCLKDIV124
- EXPORTCLKDIV144
- CLKDIV124
- ldrr0,=CLKDIVN
- ldrr1,=0x3;0x3=1:2:4
- strr1,[r0]
- ;waituntilclockisstable
- nop
- nop
- nop
- nop
- nop
- ldrr0,=REFRESH
- ldrr1,[r0]
- bicr1,r1,#0xff
- bicr1,r1,#(0x7<<8)
- orrr1,r1,#0x470;REFCNT135
- strr1,[r0]
- nop
- nop
- nop
- nop
- nop
- movpc,lr
- CLKDIV144
- ldrr0,=CLKDIVN
- ldrr1,=0x4;0x4=1:4:4
- strr1,[r0]
- ;waituntilclockisstable
- nop
- nop
- nop
- nop
- nop
- ldrr0,=REFRESH
- ldrr1,[r0]
- bicr1,r1,#0xff
- bicr1,r1,#(0x7<<8)
- orrr1,r1,#0x630;REFCNT675-1520
- strr1,[r0]
- nop
- nop
- nop
- nop
- nop
- movpc,lr
- ;存储器操控寄存器的界说区
- LTORG
- SMRDATADATA
- ;Memoryconfigurationshouldbeoptimizedforbestperformance
- ;Thefollowingparameterisnotoptimized.
- ;Memoryaccesscycleparameterstrategy
- ;1)ThememorysettingsissafeparametersevenatHCLK=75Mhz.
- ;2)SDRAMrefreshperiodisforHCLK<=75Mhz.
- DCD(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28));各bank的buswidth;没有B0,由于由OM[1:0]pins确认
- DCD((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC));GCS0
- DCD((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC));GCS1
- DCD((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC));GCS2
- DCD((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC));GCS3
- DCD((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC));GCS4
- DCD((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC));GCS5
- DCD((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN));GCS6B6_MT界说在memcfg.inc中,11-->SDRAM;B6_SCAN-非reset默许值
- DCD((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN));GCS7
- DCD((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT);Tchr-notused
- ;DCD0x32;SCLKpowersavingmode,BANKSIZE128M/128M
- DCD0x31;SCLKpowersavingmode,BANKSIZE64M/64M
- DCD0x30;MRSR6CL=3clk
- DCD0x30;MRSR7CL=3clk
- BaseOfROMDCD|Image
RO Base|
- TopOfROMDCD|Image
RO Limit|
- BaseOfBSSDCD|Image
RW Base|
- BaseOfZeroDCD|Image
ZI Base|
- EndOfBSSDCD|Image
ZI Limit|
- ALIGN
- AREARamData,DATA,READWRITE
- ^_ISR_STARTADDRESS;_ISR_STARTADDRESS=0x33FF_FF00
- HandleReset#4
- HandleUndef#4
- HandleSWI#4
- HandlePabort#4
- HandleDabort#4
- HandleReserved#4
- HandleIRQ#4
- HandleFIQ#4
- ;DontusethelabelIntVectorTable,
- ;ThevalueofIntVectorTableisdifferentwiththeaddressyouthinkitmaybe.
- ;IntVectorTable
- ;@0x33FF_FF20
- HandleEINT0#4
- HandleEINT1#4
- HandleEINT2#4
- HandleEINT3#4
- HandleEINT4_7#4
- HandleEINT8_23#4
- HandleCAM#4;Addedfor2440.
- HandleBATFLT#4
- HandleTICK#4
- HandleWDT#4
- HandleTIMER0#4
- HandleTIMER1#4
- HandleTIMER2#4
- HandleTIMER3#4
- HandleTIMER4#4
- HandleUART2#4
- ;@0x33FF_FF60
- HandleLCD#4
- HandleDMA0#4
- HandleDMA1#4
- HandleDMA2#4
- HandleDMA3#4
- HandleMMC#4
- HandleSPI0#4
- HandleUART1#4
- HandleNFCON#4;Addedfor2440.
- HandleUSBD#4
- HandleUSBH#4
- HandleIIC#4
- HandleUART0#4
- HandleSPI1#4
- HandleRTC#4
- HandleADC#4
- ;@0x33FF_FFA0
- END
S3C2440发动代码剖析
spanstyle=font-size:18px;>;==;=========================================;NAME:2440INITS;DESC:Cstar
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/262796.html