如何从Nand Flash启动uWord文档格式.docx
- 文档编号:21590162
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:12
- 大小:19.12KB
如何从Nand Flash启动uWord文档格式.docx
《如何从Nand Flash启动uWord文档格式.docx》由会员分享,可在线阅读,更多相关《如何从Nand Flash启动uWord文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
withouteventheimpliedwarrantyof*MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe*GNUGeneralPublicLicenseformoredetails.*YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense*alongwiththisprogram;
ifnot,writetotheFreeSoftware*Foundation,Inc.,59TemplePlace,Suite330,Boston,*MA02111-1307USA*/#include#include/*Jumpvectortableasintable3.1in1*/.globl_start_start:
bresetldrpc,_undefined_instructionldrpc,_software_interruptldrpc,_prefetch_abortldrpc,_data_abortldrpc,_not_usedldrpc,_irqldrpc,_fiq_undefined_instruction:
.wordundefined_instruction_software_interrupt:
.wordsoftware_interrupt_prefetch_abort:
.wordprefetch_abort_data_abort:
.worddata_abort_not_used:
.wordnot_used_irq:
.wordirq_fiq:
.wordfiq.balignl16,0xdeadbeef/*StartupCode(resetvector)*doimportantinitonlyifwedontstartfrommemory!
*relocatearmboottoram*setupstack*jumptosecondstage*/_TEXT_BASE:
.wordTEXT_BASE.globl_armboot_start_armboot_start:
.word_start/*Thesearedefinedintheboard-specificlinkerscript.*/.globl_bss_start_bss_start:
.word_bss_start.globl_bss_end_bss_end:
.word_end#ifdefCONFIG_USE_IRQ/*IRQstackmemory(calculatedatrun-time)*/.globlIRQ_STACK_STARTIRQ_STACK_START:
.word0x0badc0de/*IRQstackmemory(calculatedatrun-time)*/.globlFIQ_STACK_STARTFIQ_STACK_START:
.word0x0badc0de#endif/*theactualresetcode*/reset:
/*setthecputoSVC32mode*/mrsr0,cpsrbicr0,r0,#0x1forrr0,r0,#0xd3msrcpsr,r0/*turnoffthewatchdog*/#definepWTCON0x53000000#defineINTMSK0x4A000008/*Interupt-Controllerbaseaddresses*/#defineINTSUBMSK0x4A00001C#defineCLKDIVN0x4C000014/*clockdivisorregister*/ldrr0,=pWTCONmovr1,#0x0strr1,r0/*maskallIRQsbysettingallbitsintheINTMR-default*/movr1,#0xffffffffldrr0,=INTMSKstrr1,r0ldrr1,=0x3ffldrr0,=INTSUBMSKstrr1,r0/*FCLK:
HCLK:
PCLK=1:
2:
4*/*defaultFCLKis120MHz!
*/ldrr0,=CLKDIVNmovr1,#3strr1,r0/*wedosys-criticalinitsonlyatreboot,*notwhenbootingfromram!
*/#ifndefCONFIG_SKIP_LOWLEVEL_INITblcpu_init_crit#endif#ifndefCONFIG_SKIP_RELOCATE_UBOOTmovr5,#0x4e000000ldrr0,=(115)|(112)|(111)|(78)|(74)|(7)strr0,r5blReadNandIDmovr6,#0ldrr0,=0xec73cmpr5,r0beq1fldrr0,=0xec75cmpr5,r0beq1fmovr6,#11:
blReadNandStatusmovr8,#0ldrr9,_TEXT_BASE拷贝到由标号ResetEntry确定的绝对地址(内存绝对地址)中,而不是拷贝到SRAM中。
cmpr8,r9/*dontrelocduringdebug*/beqstack_setupResetEntry的地址在链接(Link)时才能确定注意,与系统自动拷贝4K到SRAM不同。
andsr0,r8,#0x1f取页号,如果页号为0,则标志位Z=1,否则Z=0bne3f如果是第0页,则顺序执行,否则跳转。
如果标志位Z=0,则跳转;
第一次循环Z=1,不跳转movr0,r8blCheckBadBlk通过第0页判断此块是否为坏块cmpr0,#0如果r0为0,则标志位Z=1,说明该块为好块;
否则Z=0,该块为坏块addner8,r8,#32如果该块为坏块,则不读取该块,直接跳转bne4f3:
movr0,r8r8为要读取的页地址movr1,r9r9为要写入的内存地址blReadNandPage跳转入读取函数,读取一块addr9,r9,#512addr8,r8,#14:
cmpr8,#256bcc2bmovr5,#0x4e000000DsNandFlashldrr0,r5andr0,r0,#0x8000strr0,r5/*ldrpc,=copy_proc_beg跳转入内存中执行,地址为BaseOfROM*/#endif/*CONFIG_SKIP_RELOCATE_UBOOT*/*Setupthestack*/stack_setup:
ldrr0,_TEXT_BASE/*upper128KiB:
relocateduboot*/subr0,r0,#CFG_MALLOC_LEN/*mallocarea*/subr0,r0,#CFG_GBL_DATA_SIZE/*bdinfo*/#ifdefCONFIG_USE_IRQsubr0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endifsubsp,r0,#12/*leave3wordsforabort-stack*/clear_bss:
ldrr0,_bss_start/*findstartofbsssegment*/ldrr1,_bss_end/*stophere*/movr2,#0x00000000/*clear*/clbss_l:
strr2,r0/*clearloop.*/addr0,r0,#4cmpr0,r1bleclbss_l#if0/*trydoingthisstuffaftertherelocation*/ldrr0,=pWTCONmovr1,#0x0strr1,r0/*maskallIRQsbysettingallbitsintheINTMR-default*/movr1,#0xffffffffldrr0,=INTMRstrr1,r0/*FCLK:
*/ldrr0,=CLKDIVNmovr1,#3strr1,r0/*ENDstuffafterrelocation*/#endif#ifdefCONFIG_S3C2410_NAND_BOOT/*CONFIG_S3C2410_NAND_BOOT=y*/#endifldrpc,_start_armboot_start_armboot:
.wordstart_armboot/*subfunction*/#ifdefCONFIG_S3C2410_NAND_BOOTReadNandID:
movr7,#0x4e000000ldrr0,r7,#0NFChipEn();
bicr0,r0,#0x800strr0,r7,#0movr0,#0x90WrNFCmd(RdIDCMD);
strbr0,r7,#4movr4,#0WrNFAddr(0);
strbr4,r7,#81:
while(NFIsBusy();
ldrr0,r7,#0x10tstr0,#1beq1bldrbr0,r7,#0xcid=RdNFDat()8)strbr1,r5,#8cmpr6,#0if(NandAddr)movner0,r0,lsr#16WrNFAddr(addr16)strnebr0,r5,#8blWaitNandBusyWaitNFBusy()ldrbr0,r5,#0xcRdNFDat()subr0,r0,#0xffmovr1,#0WrNFCmd(READCMD0)strbr1,r5,#4ldrr1,r5,#0NFChipDs()orrr1,r1,#0x800strr1,r5,#0movpc,r7ReadNandPage:
movr7,lrmovr4,r1movr5,#0x4e000000ldrr1,r5,#0NFChipEn()bicr1,r1,#0x800strr1,r5,#0movr1,#0WrNFCmd(READCMD0)strbr1,r5,#4strbr1,r5,#8WrNFAddr(0)strbr0,r5,#8WrNFAddr(addr)movr1,r0,lsr#8WrNFAddr(addr8)strbr1,r5,#8cmpr6,#0if(NandAddr)movner0,r0,lsr#16WrNFAddr(addr16)strnebr0,r5,#8ldrr0,r5,#0InitEcc()orrr0,r0,#0x1000strr0,r5,#0blWaitNandBusyWaitNFBusy()movr0,#0for(i=0;
i512;
i+)1:
ldrbr1,r5,#0xcbufi=RdNFDat()strbr1,r4,r0addr0,r0,#1bicr0,r0,#0x10000cmpr0,#0x200bcc1bldrr0,r5,#0NFChipDs()orrr0,r0,#0x800strr0,r5,#0movpc,r7#endifCONFIG_S3C2410_NAND_BOOT/*CPU_init_criticalregisters*setupimportantregisters*setupmemorytiming*/cpu_init_crit:
/*flushv4I/Dcaches*/movr0,#0mcrp15,0,r0,c7,c7,0/*flushv3/v4cache*/mcrp15,0,r0,c8,c7,0/*flushv4TLB*/*disableMMUstuffandcaches*/mrcp15,0,r0,c1,c0,0bicr0,r0,#0x00002300clearbits13,9:
8(-V-RS)bicr0,r0,#0x00000087clearbits7,2:
0(B-CAM)orrr0,r0,#0x00000002setbit2(A)Alignorrr0,r0,#0x00001000setbit12(I)I-Cachemcrp15,0,r0,c1,c0,0/*beforerelocating,wehavetosetupRAMtiming*becausememorytimingisboard-dependend,youwill*findalowlevel_init.Sinyourboarddirectory.*/movip,lrbllowlevel_initmovlr,ipmovpc,lr/*Interrupthandling*/IRQstackframe.#defineS_FRAME_SIZE72#defineS_OLD_R068#defineS_PSR64#defineS_PC60#defineS_LR56#defineS_SP52#defineS_IP48#defineS_FP44#defineS_R1040#defineS_R936#defineS_R832#defineS_R728#defineS_R624#defineS_R520#defineS_R416#defineS_R312#defineS_R28#defineS_R14#defineS_R00#defineMODE_SVC0x13#defineI_BIT0x80/*usebad_save_user_regsforabort/prefetch/undef/swi.*useirq_save_user_regs/irq_restore_user_regsforIRQ/FIQhandling*/.macrobad_save_user_regssubsp,sp,#S_FRAME_SIZEstmiasp,r0-r12Callingr0-r12ldrr2,_armboot_startsubr2,r2,#(CONFIG_STACKSIZE+CFG_MALLOC_LEN)subr2,r2,#(CFG_GBL_DATA_SIZE+8)setbase2wordsintoabortstackldmiar2,r2-r3getpc,cpsraddr0,sp,#S_FRAME_SIZErestoresp_SVCaddr5,sp,#S_SPmovr1,lrstmiar5,r0-r3savesp_SVC,lr_SVC,pc,cpsrmovr0,sp.endm.macroirq_save_user_regssubsp,sp,#S_FRAME_SIZEstmiasp,r0-r12Callingr0-r12addr8,sp,#S_PCstmdbr8,sp,lrCallingSP,LRstrlr,r8,#0SavecallingPCmrsr6,spsrstrr6,r8,#4SaveCPSRstrr0,r8,#8SaveOLD_R0movr0,sp.endm.macroirq_restore_user_regsldmiasp,r0-lrCallingr0-lrmovr0,r0ldrlr,sp,#S_PCGetPCaddsp,sp,#S_FRAME_SIZEsubspc,lr,#4return&
movespsr_svcintocpsr.endm.macroget_bad_stackldrr13,_armboot_startsetupourmodestacksubr13,r13,#(CONFIG_STACKSIZE+CFG_MALLOC_LEN)subr13,r13,#(CFG_GBL_DATA_SIZE+8)reservedacouplespotsinabortstackstrlr,r13savecallerlr/spsrmrslr,spsrstrlr,r13,#4movr13,#MODE_SVCprepareSVC-Modemsrspsr_c,r13msrspsr,r13movlr,pcmovspc,lr.endm.macroget_irq_stacksetupIRQstackldrsp,IRQ_STACK_START.endm.macroget_fiq_stacksetupFIQstackldrsp,FIQ_STACK_START.endm/*exceptionhandlers*/.align5undefined_instruction:
get_bad_stackbad_save_user_regsbldo_undefined_instruction.align5software_interrupt:
get_bad_stackbad_save_user_regsbldo_software_interrupt.align5prefetch_abort:
get_bad_stackbad_save_user_regsbldo_prefetch_abort.align5data_abort:
get_bad_stackbad_save_user_regsbldo_data_abort.align5not_used:
get_bad_stackbad_save_user_regsbldo_not_used#ifdefCONFIG_USE_IRQ.align5irq:
get_irq_stackirq_save_user_regsbldo_irqirq_restore_user_regs.align5fiq:
get_fiq_stack/*someoneoughttowriteamoreeffictionfiq_save_user_regs*/irq_save_user_regsbldo_fiqirq_restore_user_regs#else.align5irq:
get_bad_stackbad_save_user_regsbldo_irq.align5fiq:
get_bad_stackbad_save_user_regsbldo_fiq#endif.align2DW_STACK_START:
.wordSTACK_BASE+STACK_SIZE-4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何从Nand Flash启动u 如何 Nand Flash 启动