已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
s3c2410启动代码详解通常,启动代码是指cpu复位后到进入c语言的main函数之前需要执行的那段汇编代码.这是由于c语言程序的运行需要具备一定的条件,比如:分配好外部数据空闿堆栈空间和中断入口等筿另外汇编代码可以更直接的对硬件进行操使效率更高. 通常启动代码是放圿410init.s汇编文件;特殊功能寄存器定义在2410addr.s;memory bank 配置在mencfg.s;还有系统的选项等在option.s文件;2410init.s不仅包括复位后执行的代码,还包括cpu进入掉电模式,产生中断等和处理器直接相关的,用汇编实现的代码.;=; name: 2410init.s; desc: c start up codes; configure memory, isr ,stacks;initialize c-variables; history:; 2002.02.25:kwtark: ver 0.0; 2002.03.20:purnnamu: add some functions for testing stop,power_off mode; 2003.05.19:jcs:configure upll in init.s not usbmain.c;=/首先,启动代码定义了一些常量,相当于c中的includeget option.incget memcfg.incget 2410addr.incbit_selfrefresh equ(1 mrc p15,0,r0,c1,c0,0 dcd 0xe3800080 ;0xe3800080 = orr r0,r0,#0x80; /big-endian dcd 0xee010f10 ;0xee010f10 = mcr p15,0,r0,c1,c0,0 entry_bus_width=16 dcd 0x0f10ee11 dcd 0x0080e380 dcd 0x0f10ee01 entry_bus_width=8 dcd 0x100f11ee dcd 0x800080e3 dcd 0x100f01ee dcd 0xffffffff ;swinv 0xffffff is similar with nop and run well in both endian mode. dcd 0xffffffff dcd 0xffffffff dcd 0xffffffff dcd 0xffffffff b resethandler ;function for entering power down mode,下面这段程序为进入掉电模式及从掉电模式中唤醒的相关设置和处理; 1. sdram should be in self-refresh mode. sdram应该设置为自刷新的模式; 2. all interrupt should be maksked for sdram/dram self-refresh. 所有中断必须屏蔽 for sdram/dram self-ref; 3. lcd controller should be disabled for sdram/dram self-refresh. lcd 控制器关闭; 4. the i-cache may have to be turned on. ; 5. the location of the following code may have not to be changed./;void enterpwdn(int clkcon); /pwdn:powerdownenterpwdnmov r2,r0;r2=rclkcon /rclkconr 3;2位为电源模式标置位。若3为1,表示转为了掉电模式tst r0,#0x8;power_off mode? /按位与判断,若3为1则跳转到enter_power_offbne enter_power_offenter_stop /进入停止模式相关处理ldr r0,=refreshldr r3,r0;r3=rrefreshmov r1, r3orr r1, r1, #bit_selfrefreshstr r1, r0 ;enable sdram self-refreshmov r1,#16 ;wait until self-refresh is issued. may not be needed.等待自刷新生效0subs r1,r1,#1bne %b0 /表示不相等则往回跳转到标号为0的位置,在此为上一句。ldr r0,=clkcon;enter stop mode.str r2,r0 mov r1,#320subs r1,r1,#1 ;1) wait until the stop mode is in effect.bne %b0 ;2) or wait here until the cpu&peripherals will be turned-off ; entering power_off mode, only the reset by wake-up is available. /进入掉电 模式后,仅唤醒中断有效ldr r0,=refresh;exit from sdram self refresh mode.str r3,r0mov_pc_lr /开始处定义的返回跳转宏enter_power_off;note.注意在rgstatus3寄存器中应该保存掉电模式唤醒的返回地址,rgstatus3,4可在掉电下保存信息;1) rgstatus3 should have the return address after wake-up from power_off mode.ldr r0,=refreshldr r1,r0;r1=rrefreshorr r1, r1, #bit_selfrefreshstr r1, r0;enable sdram self-refreshmov r1,#16 ;wait until self-refresh is issued,which may not be needed.0subs r1,r1,#1bne %b0ldr r1,=misccrldrr0,r1orrr0,r0,#(70, sclk1:sclk-0, scke=l during boot-up strr0,r1ldr r0,=clkconstr r2,r0 b .;cpu will die here.;=从掉电模式唤醒的过程1、 某个唤醒源生效将产生一个内部复位信号。复位时间由一个内部16位计数器决定,此计数器的时钟是trst=(65535/xtal_frequency)。2、 查询gstatus2位看从掉电模式唤醒是否产生了一个power-up。3、 通过将misccr19:17设置为000b,释放sdram信号保护。4、 配置sdram控制器。5、 等待sdram自我刷新完毕。大部分sdram需要refresh cycle of all sdram row。6、 gstatus3,4的信息可以被用户使用,因为gstatus3,4的值已经在掉电模式下被保存了。7、 对于eint3:0,检查srcpnd寄存器;对于eint15:4,检查eintpnd寄存器;对于rtc报警唤醒,检查rtc时间,因为在唤醒时srcpnd寄存器的rtc位不被置位;如果在掉电模式期间有nbatt-flt assertion,srcpnd寄存器的相关位被置位。;=wakeup_power_off;release sclkn after wake-up from the power_off mode.ldr r1,=misccr /misccr寄存器用来设置一些usb等相关的时钟周期等ldrr0,r1bicr0,r0,#(7sclk, sclk1:0-sclk, scke:l-hstrr0,r1/通过将misccr19:17设置为000b,释放sdram信号保护。;set memory control registers配置内存控制寄存器。ldrr0,=smrdata /在程序的后面ltorg smrdata data中定义了 /一个数据缓冲池就是用来配置相关的内存控制寄存器的ldrr1,=bwscon ;bwscon addressaddr2, r0, #52 ;end address of smrdata0 ldrr3, r0, #4 strr3, r1, #4 cmpr2, r0bne%b0mov r1,#2560subs r1,r1,#1 ;1) wait until the selfrefresh is released.bne %b0ldr r1,=gstatus3 ; gstatus3 has the start address just after power_off wake-upldr r0,r1mov pc,r0 /从掉电模式下唤醒后,将保存在gstatus3 返回地址传给pc如上所说,这里采用handler宏去建立hander*和handle*之间的联系 ltorg ;声明文字池,因为我们用了ldr伪指令 handlerfiq handler handlefiq handlerirq handler handleirq handlerundef handler handleundef handlerswi handler handleswi handlerdabort handler handledabort handlerpabort handler handlepabort ;= ;呵呵,来了来了.好戏来了,这一段程序就是用来进行第二次查表的过程了. ;如果说第一次查表是由硬件来完成的,那这一次查表就是由软件来实现的了. ;为什么要查两次表? ;没有办法,arm把所有的中断都归纳成一个irq中断异常和一个firq中断异常 ;第一次查表主要是查出是什么异常,可我们总要知道是这个中断异常中的什么中断呀! ;没办法了,再查一次表呗! ;= isrirq /第二次中断查表,因为arm把所有的中断都归为一个irq异常,通过此处查表可知道具体中断sub sp,sp,#4 ;给pc寄存器保留 stmfd sp!,r8-r9 ;把r8-r9压入栈 ldr r9,=intoffset ;把intoffset的地址装入r9 ldr r9,r9 ;把intoffset的值装入r9 ldr r8,=handleeint0 ;这就是我们第二个中断向量表的入口的,先装入r8 ;= ;哈哈,这查表方法够好了吧,r8(入口)+index*4(别望了一条指令是4 bytes的喔), ;这不就是我们要找的那一项了吗.找到了表项,下一步做什么?肯定先装入了! ;= add r8,r8,r9,lsl #2 ldr r8,r8 ;装入中断服务程序的入口 str r8,sp,#8 ;把入口也入栈,准备用旧招 ldmfd sp!,r8-r9,pc;施招,弹出栈,哈哈,顺便把r8弹出到pc,o了,跳转成功! ;=; entry 系统上电后经过一个b resethandler就跳转到此处来。在此完成一些相关的软硬件配置工作1. 屏蔽所有中断,关看门狗。 2. 根据工作频率设置pll寄存器 3. 初始化存储控制相关寄存器 4. 初始化各模式下的栈指针 5. 设置缺省中断处理函数 6. 将数据段拷贝到ram中,将零初始化数据段清零 7. 跳转到c 语言main入口函数中 ;=resethandlerldrr0,=wtcon ;watch dog disable 关看门狗ldrr1,=0x0 strr1,r0ldrr0,=intmskldrr1,=0xffffffff ;all interrupt disable屏蔽所有中断strr1,r0ldrr0,=intsubmskldrr1,=0x3ff ;all sub interrupt disable屏蔽所有子中断strr1,r0 false /;是得有些表示了,该点点led灯了,不过被false掉了. ; rgpfdat = (rgpfdat & (0xf4) | (data & 0xf)4); ; led_displayldrr0,=gpfconldrr1,=0x5500strr1,r0ldrr0,=gpfdatldrr1,=0x10strr1,r0;to reduce pll lock time, adjust the locktime register. 为了减少pll的lock time, 调整locktime寄存器.ldrr0,=locktime /locktime为锁定计数定时器,即设置pll稳定过渡时间,一般大于150usldrr1,=0xffffffstrr1,r0;=上电复位时的时钟行为。晶振在几毫秒内开始振荡。当osc时钟稳定后,pll根据默认pll设置开始生效,但是通常这个时候是不稳定的,因此在软件重新配置pllcon寄存器之前fclk直接使用fin而不是mpll,即使用户不希望改变pllcon的默认值,用户也应该执行一边写pllcon操作。;这里介绍一下计算公式;fpllo=(m*fin)/(p*2s);m=mdiv+8,p=pdiv+2,s=sdiv;fpllo必须大于20mhz小于66mhz;fpllo*2s必须小于170mhz;如下面的pllcon设定中的m_div p_div s_div是取自option.h中m_div=0x5c=92 p_div=0x4 s_div=0x2所以fpllo=(m*fin)/(p*2s)=(92+8)*12m/(4+2)*22=50m;= pll_on_start;configure mpllldrr0,=mpllcon/m_div=0x5c=92 p_div=0x4 s_div=0x2ldrr1,=(m_mdiv12)+(m_pdiv4)+m_sdiv) ;fin=12mhz,fout=50mhzstrr1,r0 ;configure upllldrr0,=upllcon ldrr1,=(u_mdiv12)+(u_pdiv top of initialised data检查装载地址和执行地址是否相同cmpr0, r1 ; check that they are differentbeq%f2 ;/若相等则跳转到2,相同,则不拷贝该区间,初始化零数据区1 cmpr1, r3 ; copy init data;/如果r0不等于r1,r1和r3比较,copy init data,不相同,将装载区拷贝到执行区ldrccr2, r0, #4 ;- ldrcc r2, r0 + add r0, r0, #4当无符号数r1 strcc r2, r1 + add r1, r1, #4bcc%b1 ;/若相等则跳转到1,相同,则不拷贝该区间,初始化零数据区2 ldrr1, =|image$zi$limit| ; top of zero init segment,zi区在ram里面的结束地址后面的一个地址movr2, #03 cmpr3, r1 ; zero initstrccr2, r3, #4 /当zi区的起始地址未达等于结束地址时,继续清0bcc%b3 ;/当无符号数r3r1时,跳转到3处,这样做就完成了zi区的初始化清0 :lnot:thumbcode blmain ;dont use main() because .跳到main()主函数,注意大小写b. thumbcode ;for start-up code for thumb mode orrlr,pc,#1 bxlr code16 blmain ;dont use main() because . b. code32 ;function initializing stacksinitstacks;dont use dram,such as stmfd,ldmfd.;svcstack is initialized before;under toolkit ver 2.5, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1mrsr0,cpsr ;/读取cpsr的值,r0=cpsr,cpsr为当前程序状态寄存器bicr0,r0,#modemask ;/r0=r0&(modemask),modemask=0x1f,也就是低五位清0orrr1,r0,#undefmode|noint ;/r1=r0|(modemask|nonint),r1为未定义模式,也就是低八位为11x11011msrcpsr_cxsf,r1;undefmode ;/写把r1的值写到状态寄存器cpsr_cxsf(也就是cpsr),undefmodeldrsp,=undefstack ;/设置未定义模式下的堆栈指针orrr1,r0,#abortmode|nointmsrcpsr_cxsf,r1;abortmodeldrsp,=abortstackorrr1,r0,#irqmode|nointmsrcpsr_cxsf,r1;irqmodeldrsp,=irqstack orrr1,r0,#fiqmode|nointmsrcpsr_cxsf,r1;fiqmodeldrsp,=fiqstackbicr0,r0,#modemask|nointorrr1,r0,#svcmodemsrcpsr_cxsf,r1;svcmodeldrsp,=svcstack/user mode has not be initialized.注意:不要切换到user模式进行user模式的堆栈设置,因为进入user模式后就/不能再操作cpsr回到别的模式了,可能会对接下去的程序执行造成影响movpc,lr /堆栈初始化完成返回;the lr register wont be valid if the current mode is n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三角形的中位线(课件)2025-2026学年北师大版数学八年级下册
- 果树腐烂病刮治操作规范
- 脊柱体态测量分析操作手册
- 异议处理沟通解决指南
- 玉米种子纯度检验技术规程
- 职业病防护设施运行维护手册
- 电视制作试题及解析
- 防爆区域动火作业应急处置方案
- 肉牛标准化育肥饲养管理方案
- 国内导游资格证题库及答案
- 成都2025年公安辅警笔试题目及参考答案
- JJG(皖) 138-2026 电动汽车充电设施在线远程检定规程(修订)
- 2026淮北矿业集团校园招聘240人笔试参考题库附带答案详解
- 防汛队伍培训课件
- 算力设施产业图谱研究报告 -2024
- 公共洗手间卫生清洁培训
- 大连软件产业发展战略的深度剖析与对策构建
- 乐队乐手合同范本
- 专题05平面向量(讲义)数学学业水平考试合格考总复习(原卷版)
- 2025广东中山市神湾镇人民政府所属事业单位招聘事业单位人员8人人参考题库及答案详解(真题汇编)
- 重大事故隐患自查自纠制度
评论
0/150
提交评论