U-BOOT裁减移植----汇编启动代码startS分析

上传人:suij****uang 文档编号:172146019 上传时间:2022-12-01 格式:DOCX 页数:10 大小:38.28KB
返回 下载 相关 举报
U-BOOT裁减移植----汇编启动代码startS分析_第1页
第1页 / 共10页
U-BOOT裁减移植----汇编启动代码startS分析_第2页
第2页 / 共10页
U-BOOT裁减移植----汇编启动代码startS分析_第3页
第3页 / 共10页
点击查看更多>>
资源描述
U-BOOT裁减移植(一)汇编启动代码start.S分析2010-07-0523:31stage1阶段的启动代码,主要就在start.s文件里。2 此start.s也是系统上电后执行的第一个代码。它全部由汇编编写下面的代码已经针对我自己开发板S3C2440裁减移植好了红色字体表示针对开发板新添加的蓝色字体表示注释灰色底表示原本u-boot有的函数然后被删除了1#include#include4.globl_start_start:7bstart_code8ldrpc,_undefined_instruction9ldrpc,_software_interrupt10ldrpc,_prefetch_abort11ldrpc,_data_abort12ldrpc,_not_used13ldrpc,_irq14ldrpc,_fiq1516_undefined_instruction:.wordundefined_instruction17_software_interrupt:.wordsoftware_interrupt18_prefetch_abort:.wordprefetch_abort19_data_abort:.worddata_abort20_not_used:.wordnot_used21_irq:.wordirq22_fiq:.wordfiq2324.balignl16,0xdeadbeef2526_TEXT_BASE:27.wordTEXT_BASE2829.globl_armboot_start30_armboot_start:31.word_start3233.globl_bss_start34_bss_start:37 35.word_bss_start36.globl_bss_end_bss_end:43 .word_end#ifdefCONFIG_USE_IRQ/*IRQstackmemory(calculatedatrun-time)*/.globlIRQ_STACK_STARTIRQ_STACK_START:44 .wordOxObadcOde48/*IRQstackmemory(calculatedatrun-time)*/.globlFIQ_STACK_STARTFIQ_STACK_START:.word0x0badc0de#endif5455/*theactualstartcode*/4O41/复位启动子程序,设置为管理模式42start_code:43/*44*setthecputoSVC32mode45*/46mrsr0,cpsr47bicr0,r0,#0x1f48orrr0,r0,#0xd349msrcpsr,r05O69blcoloured_LED_init70blredLEDon7172#ifdefined(C0NFIG_AT91RM9200DK)defined(C0NFIG_AT91RM9200EK)73/*74*relocateexceptiontable花*/76 ldrldr78 movcopyex:67 subsldrstrbne#endifrO,=_startrl,=0x0r2,#16r2,r2,#1r3,r0,#4r3,r1,#4copyex85#ifdefined(C0NFIG_S3C2400)|defined(C0NFIG_S3C2410)/*turnoffthewatchdog*/88#ifdefined(C0NFIG_S3C2400)#definepWTCON0x15300000#defineINTMSK0x14400008/*Interupt-Controllerbaseaddresses*/#defineCLKDIVN0x14800014/*clockdivisorregister*/#else#definepWTCON0x53000000#defineINTMSK0x4A000008addresses*/#defineINTSUBMSK0x4A00001C#defineCLKDIVN0x4C000014/*Interupt-Controllerbase/*clockdivisorregister*/#endif51#definepWTCON#defineINTMSK#defineINTSUBMSK#defineCLKDIVN0x530000000x4A0000080x4A00001C0x4C00001456/*关闭看门狗*/ldrr0,=pWTCONmovr1,#0x0strr1,r061/*关中断*/*从注释可以看出此段代码的作用:屏蔽掉所有的irq中断。为了屏蔽这些中*我们只要把INTMSK的所有的bit位都置1即可。INTMSK寄存器共32bit断,66*位,每个bit对应着不同的中断源。事实上,笔者认为这个代码是多余的只是*为了心里更踏实而已。因为S3C2440的datasheet文档里明确指出,cpu*在复位的时候,这个寄存器的值就是OXFFFFFFFF,以防止发生异常中断。68 */70movr1,#0xffffffff71ldrr0,=INTMSK72strr1,r073#ifdefined(C0NFIG_S3C2410)ldrrl,=0x3ff74ldr75ldr76str114#endifr1,=0x7fffr0,=INTSUBMSKr1,r077/*修改系统时钟*/#defineCLK_CTL_BASE0x4C000000#defineMDIV_4050x7f12#definePSDIV_4050x2184/*FCLK:HCLK:PCLK=1:4:8*/ldrr0,=CLKDIVN119movr1,#391orrr1,r1,#0xc0000000movr1,#5strr1,r089121#endif/*CONFIGS3C2400CONFIGS3C2410*/122123/*124*wedosys-criticalinitsonlyatreboot.125*notwhenbootingfromram!126*/127#ifndefCONFIGSKIPLOWLEVELINIT90mrcp15,0,r1,c1,c0,092mcrp15,0,r1,c1,c0,09495movr1,#CLK_CTL_BASE96movr2,#MDIV_40597addr2,r2,#PSDIV_40598strr2,r1,#0x04/*MPLLCON*/99100blcpu_init_crit101#endif130#ifndefCONFIG_SKIP_RELOCATE_UBOOT132relocate:/*relocateU-BoottoRAM133*/adrr0,start/*r0-currentpositionofcode*/134ldrr1,TEXTBASE/*testifwerunfromflashorRAM*/135cmpr0,r1/*dontrelocduringdebug*/102/*103*104*105*106*/107108109110111112113getmovmovreadtocallCfunctions(fornand_read_lowlevel()sp,fp,#0x33000000setupstackpointer#0nopreviousframe,sofp=0copyldrU-BoottoRAMr0,=TEXT_BASE/*_TEXT_BASE是RAM中的地址,r0代码段的连接地址*/114115116movr1,#0x0117ldr代码段的结束地址r2,bss_start/在连接脚本u-boot.lds中定义,是118119subr2,r2,r0/代码段长度120121blnand_read_lowlevel122123tstr0,#0x0124beqok_nand_read125126bad_nand_read:127loop2:128bloop2infiniteloopblecopy_loop129130131ok_nand_read:132verify133movr0,#0134ldrr1,=TEXT_BASE135movr2,#0x4004bytes*1024=4K-bytes136go_next:137ldrr3,r0,#4138ldrr4,r1,#4139teqr3,r4140bnenotmatch141subsr2,r2,#4142beqstack_setup138ldrr2,_armboot_start139ldrr3,_bss_start140subr2,r3,r2/*r2-sizeofarmboot*/141addr2,r0,r2/*r2sourceendaddress*/142143copy_loop:144ldmiarO!,r3r10/*copyfromsourceaddressr0*/145stmiar1!,r3-r10/*copytotargetaddressr1*/146cmprO,r2/*untilsourceendaddreee145 */r2147#endif/*CONFIG_SKIP_RELOCATE_UBOOT*/149143bnego_next144notmatch:146 loop3:153 bloop3infiniteloop148149/*150*151*152*/*初始化堆栈等*/stack_setup:154 ldrr0,_TEXT_BASE/代码段的开始地址,0x33f80000subr0,r0,#CONFIG_SYS_MALLOC_LEN/代码段下面,留出一段内存以实现mallocsubr0,r0,#CONFIG_SYS_GBL_DATA_SIZE/再留出一段内存,存一些全局参数#ifdefCONFIG_USE_IRQsubr0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endifsubsp,rO,#12/最后留出12字节的内存给abort异常,往下内存就是栈了160/*先设置了BSS段的起始地址与结束地址,然后循环清楚所有的*BSS段。至此,所有的cpu初始化工作(stage1阶段)已经全部结束了。后*面的代码,将通过ldrpc,_start_armboot,进入C代码执行*/166clear_bss:167ldrrO,_bss_start168ldrr1,_bss_end169movr2,#O17O171clbssl:172strr2,rO173addrO,rO,#4/*bss段地址空间清零循环.*/174cmpr0,r1175bleclbss_l176177ldrpc,_start_armboot/start_armboot函数在lib_arm/board.c中实现178179_start_armboot:.wordstart_armboot180181/SDRAM进行初始化,这对我们的cpu是必要的182187#ifndefCONFIG_SKIP_LOWLEVEL_INIT183cpu_init_crit:184movr0,#0185mcrp15,0,r0,c7,c7,0/*flushv3/v4cache*/186mcrp15,0,r0,c8,c7,0/*flushv4TLB*/188 187/*disableMMUstuffandcaches*我们无效掉了指令cache和数据cache,并禁止MMU与cache。189 *为什么会有这一步呢?笔者曾经深受cache的伤害。在调试代码的*时候,下载完修改的bin文件后,如果只按复位键,而不关掉板子*重新上电,就会造成cache中可能残留之前对cache操作的数据。190 *我们称之为脏数据,它会映像我们的调试结果,造成假象。196 195*当然,在这里无效cache和MMU肯定还有别的原因。比如在初始化阶段,*可以认为我们只有一个任务在跑,没有必要,也不允许使用地址变换。因此最好*应该无效掉MMU。197 */199mrcp15,0,r0,c1,c0,0200bicr0,r0,#0x00002300clearbits13,9:8(-V-RS)201bicr0,r0,#0x00000087clearbits7,2:0(B-CAM)202orrr0,r0,#0x00000002setbit2(A)Align203orrr0,r0,#0x00001000setbit12(I)I-Cache204mcrp15,0,r0,c1,c0,0209 205206/*由于在cpu_init_cri子程序中又一次调用子程序lowlevel_init,因此,需*要事先保护好lr寄存器的内容。当返回时候,再恢复它。在进入lowlevel_init*之前,有必要详细说一下movip,lr,这个语句的ip。213 *为了使单独编译的C语言程序和汇编程序之间能相互调用,必须为子程序间211*的调用规定一定的规则。这就是ATPCS规则。它规定了一些子程序间调用的基212*寄存器R12作用子程序间的scratch寄存器,本规则。在寄存器的使用规则里,*记做ip。movip,lr语句的ip由此而来。笔者认为,这里使用别的通用寄存器*来代替ip,实现的功能也是一样的。详情请参考ARM体系结构与编程第6*章ATPCS介绍。214 */217movip,lr218219bllowlevel_init220221movlr,ip222movpc,lr215 #endif/*CONFIG_SKIP_LOWLEVEL_INIT*/(中断部分暂时用不到不需修改)357not_used:358359360361357 get_bad_stackbad_save_user_regsbldo_not_used#ifdefCONFIG_USE_IRQ358.align5irq:358 get_irq_stackirq_save_user_regsbldo_irqirq_restore_user_regs365.align5fiq:get_fiq_stack/*someoneoughttowriteamoreeffictionfiq_save_user_regs*/370371372irq_save_user_regsbldo_fiqirqrestoreuserregs#else.align5irq:get_bad_stackbad_save_user_regsbldo_irq.align5fiq:get_bad_stackbad_save_user_regsbldo_fiq373374375362363364365366367368369370371372注:注释摘自跟国嵌手册
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!