ImageVerifierCode 换一换
格式:DOCX , 页数:40 ,大小:207.56KB ,
资源ID:22047747      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22047747.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Uboot启动流程Word文件下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Uboot启动流程Word文件下载.docx

1、 ldr pc, _data_abort /* 数据操作专门向量 */ ldr pc, _not_used /* 未使用 */ ldr pc, _irq /* irq中断向量 */ ldr pc, _fiq /* fiq中断向量 */* 中断向量表入口地址 */_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_us

2、ed: .word not_used_irq: .word irq_fiq: .word fiq .balignl 16,0xdeadbeef 以上代码设置了ARM专门向量表,各个专门向量介绍如下:表 2.1 ARM专门向量表地址专门进入模式描述0x00000000复位治理模式复位电平有效时,产生复位专门,程序跳转到复位处理程序处执行0x00000004未定义指令未定义模式遇到不能处理的指令时,产生未定义指令专门0x00000008软件中断执行SWI指令产生,用于用户模式下的程序调用特权操作指令0x0000000c预存指令中止模式处理器预取指令的地址不存在,或该地址不承诺当前指令访咨询,产生指

3、令预取中止专门0x00000010数据操作处理器数据访咨询指令的地址不存在,或该地址不承诺当前指令访咨询时,产生数据中止专门0x00000014未使用0x00000018IRQ外部中断要求有效,且CPSR中的I位为0时,产生IRQ专门0x0000001cFIQ快速中断要求引脚有效,且CPSR中的F位为0时,产生FIQ专门 在cpu/arm920t/start.S中还有这些专门对应的专门处理程序。当一个专门产生时,CPU依照专门号在专门向量表中找到对应的专门向量,然后执行专门向量处的跳转指令,CPU就跳转到对应的专门处理程序执行。 其中复位专门向量的指令“b start_code”决定了U-Bo

4、ot启动后将自动跳转到标号“start_code”处执行。(2)CPU进入SVC模式start_code: /* * set the cpu to SVC32 mode */ mrs r0, cpsr bic r0, r0, #0x1f /*工作模式位清零 */ orr r0, r0, #0xd3 /*工作模式位设置为“10011”(治理模式),并将中断禁止位和快中断禁止位置1 */ msr cpsr, r0 以上代码将CPU的工作模式位设置为治理模式,并将中断禁止位和快中断禁止位置一,从而屏蔽了IRQ和FIQ中断。(3)设置操纵寄存器地址# if defined(CONFIG_S3C2400

5、)# define pWTCON 0x15300000 # define INTMSK 0x14400008 # define CLKDIVN 0x14800014 #else /* s3c2410与s3c2440下面4个寄存器地址相同 */# define pWTCON 0x53000000 /* WATCHDOG操纵寄存器地址 */# define INTMSK 0x4A000008 /* INTMSK寄存器地址 */# define INTSUBMSK 0x4A00001C /* INTSUBMSK寄存器地址 */# define CLKDIVN 0x4C000014 /* CLKDIV

6、N寄存器地址 */# endif 对与s3c2440开发板,以上代码完成了WATCHDOG,INTMSK,INTSUBMSK,CLKDIVN四个寄存器的地址的设置。各个寄存器地址参见参考文献4 。(4)关闭看门狗 ldr r0, =pWTCON mov r1, #0x0 str r1, r0 /* 看门狗操纵器的最低位为0时,看门狗不输出复位信号 */ 以上代码向看门狗操纵寄存器写入0,关闭看门狗。否则在U-Boot启动过程中,CPU将不断重启。(5)屏蔽中断 * mask all IRQs by setting all bits in the INTMR - default mov r1,

7、#0xffffffff /* 某位被置1则对应的中断被屏蔽 */ ldr r0, =INTMSK str r1, r0 INTMSK是主中断屏蔽寄存器,每一位对应SRCPND(中断源引脚寄存器)中的一位,讲明SRCPND相应位代表的中断要求是否被CPU所处理。 依照参考文献4,INTMSK寄存器是一个32位的寄存器,每位对应一个中断,向其中写入0xffffffff就将INTMSK寄存器全部位置一,从而屏蔽对应的中断。# if defined(CONFIG_S3C2440) ldr r1, =0x7fff ldr r0, =INTSUBMSK str r1, r0 INTSUBMSK每一位对应S

8、UBSRCPND中的一位,讲明SUBSRCPND相应位代表的中断要求是否被CPU所处理。 依照参考文献4,INTSUBMSK寄存器是一个32位的寄存器,然而只使用了低15位。向其中写入0x7fff确实是将INTSUBMSK寄存器全部有效位(低15位)置一,从而屏蔽对应的中断。(6)设置MPLLCON,UPLLCON, CLKDIVN # if defined(CONFIG_S3C2440) #define MPLLCON 0x4C000004 #define UPLLCON 0x4C000008 ldr r0, =CLKDIVN mov r1, #5 ldr r0, =MPLLCON ldr

9、r1, =0x7F021 ldr r0, =UPLLCON ldr r1, =0x38022 # else /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! ldr r0, =CLKDIVN mov r1, #3#endif CPU上电几毫秒后,晶振输出稳固,FCLK=Fin(晶振频率),CPU开始执行指令。但实际上,FCLK能够高于Fin,为了提高系统时钟,需要用软件来启用PLL。这就需要设置CLKDIVN,MPLLCON,UPLLCON这3个寄存器。 CLKDIVN寄存器用于设置FCLK,HCLK,PCLK三者间的比例,能够

10、依照表2.2来设置。表 2.2 S3C2440 的CLKDIVN寄存器格式CLKDIVN位讲明初始值HDIVN2:100 : HCLK = FCLK/1.01 : HCLK = FCLK/2.10 : HCLK = FCLK/4 (当 CAMDIVN9 = 0 时)HCLK= FCLK/8 (当 CAMDIVN9 = 1 时)11 : HCLK = FCLK/3 (当 CAMDIVN8 = 0 时)HCLK = FCLK/6 (当 CAMDIVN8 = 1时)00PDIVN00: PCLK = HCLK/1 1: PCLK = HCLK/2 设置CLKDIVN为5,就将HDIVN设置为二进制的

11、10,由于CAMDIVN9没有被改变过,取默认值0,因此HCLK = FCLK/4。PDIVN被设置为1,因此PCLK= HCLK/2。因此分频比FCLK:4:8 。 MPLLCON寄存器用于设置FCLK与Fin的倍数。MPLLCON的位19:12称为MDIV,位9:4称为PDIV,位1:0称为SDIV。 关于S3C2440,FCLK与Fin的关系如下面公式: MPLL(FCLK) = (2mFin)/(p) 其中: m=MDIC+8,p=PDIV+2,s=SDIV MPLLCON与UPLLCON的值能够依照参考文献4中“PLL VALUE SELECTION TABLE”设置。该表部分摘录如

12、下:表 2.3 举荐PLL值输入频率输出频率MDIVPDIVSDIV12.0000MHz48.00 MHz56(0x38)2405.00 MHz127(0x7f)1 当mini2440系统主频设置为405MHZ,USB时钟频率设置为48MHZ时,系统能够稳固运行,因此设置MPLLCON与UPLLCON为: MPLLCON=(0x7f12) | (0x024) | (0x01) = 0x7f021 UPLLCON=(0x384) | (0x02) = 0x38022(7)关闭MMU,cache 接着往下看:#ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init

13、_crit cpu_init_crit这段代码在U-Boot正常启动时才需要执行,若将U-Boot从RAM中启动则应该注释掉这段代码。 下面分析一下cpu_init_crit到底做了什么:320 #ifndef CONFIG_SKIP_LOWLEVEL_INIT321 cpu_init_crit:322 /*323 * 使数据cache与指令cache无效 */324 */ 325 mov r0, #0326 mcr p15, 0, r0, c7, c7, 0 /* 向c7写入0将使ICache与DCache无效*/327 mcr p15, 0, r0, c8, c7, 0 /* 向c8写入0

14、将使TLB失效 */328 329 /*330 * disable MMU stuff and caches331 */332 mrc p15, 0, r0, c1, c0, 0 /* 读出操纵寄存器到r0中 */333 bic r0, r0, #0x00002300 clear bits 13, 9:8 (-V- -RS)334 bic r0, r0, #0x00000087 clear bits 7, 2:0 (B- -CAM)335 orr r0, r0, #0x00000002 set bit 2 (A) Align336 orr r0, r0, #0x00001000 set bit

15、 12 (I) I-Cache337 mcr p15, 0, r0, c1, c0, 0 /* 储存r0到操纵寄存器 */338 339 /*340 * before relocating, we have to setup RAM timing341 * because memory timing is board-dependend, you will342 * find a lowlevel_init.S in your board directory.343 */344 mov ip, lr345 346 bl lowlevel_init347 348 mov lr, ip349 mo

16、v pc, lr350 #endif /* CONFIG_SKIP_LOWLEVEL_INIT */ 代码中的c0,c1,c7,c8差不多上ARM920T的协处理器CP15的寄存器。其中c7是cache操纵寄存器,c8是TLB操纵寄存器。325327行代码将0写入c7、c8,使Cache,TLB内容无效。 第332337行代码关闭了MMU。这是通过修改CP15的c1寄存器来实现的,先看CP15的c1寄存器的格式(仅列出代码中用到的位):表 2.3 CP15的c1寄存器格式(部分)1514131211109876543.VIRSBCAM 各个位的意义如下:V : 表示专门向量表所在的位置,0:专

17、门向量在0x00000000;1:专门向量在 0xFFFF0000I : 0 :关闭ICaches;1 :开启ICachesR、S : 用来与页表中的描述符一起确定内存的访咨询权限B :CPU为小字节序; CPU为大字节序C : 0:关闭DCaches;开启DCachesA :数据访咨询时不进行地址对齐检查;数据访咨询时进行地址对齐检查M :关闭MMU;开启MMU 332337行代码将c1的 M位置零,关闭了MMU。(8)初始化RAM操纵寄存器 其中的lowlevel_init就完成了内存初始化的工作,由于内存初始化是依靠于开发板的,因此lowlevel_init的代码一样放在board下面相

18、应的名目中。关于mini2440,lowlevel_init在board/samsung/mini2440/lowlevel_init.S中定义如下:45 #define BWSCON 0x48000000 /* 13个储备操纵器的开始地址 */129 _TEXT_BASE:130 .word TEXT_BASE131 132 .globl lowlevel_init133 lowlevel_init:134 /* memory control configuration */135 /* make r0 relative the current location so that it */1

19、36 /* reads SMRDATA out of FLASH rather than memory !137 ldr r0, =SMRDATA138 ldr r1, _TEXT_BASE139 sub r0, r0, r1 /* SMRDATA减 _TEXT_BASE确实是13个寄存器的偏移地址 */140 ldr r1, =BWSCON /* Bus Width Status Controller */141 add r2, r0, #13*4142 0:143 ldr r3, r0, #4 /*将13个寄存器的值逐一赋值给对应的寄存器*/144 str r3, r1, #4145 cm

20、p r2, r0146 bne 0b147 148 /* everything is fine now */149 mov pc, lr150 151 .ltorg152 /* the literal pools origin */153 154 SMRDATA: /* 下面是13个寄存器的值 */155 .word 156 .word lowlevel_init初始化了13个寄存器来实现RAM时钟的初始化。lowlevel_init函数关于U-Boot从NAND Flash或NOR Flash启动的情形差不多上有效的。 U-Boot.lds链接脚本有如下代码: board/samsung/m

21、ini2440/lowlevel_init.o将被链接到cpu/arm920t/start.o后面,因此board/samsung/mini2440/lowlevel_init.o也在U-Boot的前4KB的代码中。 U-Boot在NAND Flash启动时,lowlevel_init.o将自动被读取到CPU内部4KB的内部RAM中。因此第137146行的代码将从CPU内部RAM中复制寄存器的值到相应的寄存器中。 关于U-Boot在NOR Flash启动的情形,由于U-Boot连接时确定的地址是U-Boot在内存中的地址,而现在U-Boot还在NOR Flash中,因此还需要在NOR Flas

22、h中读取数据到RAM中。 由于NOR Flash的开始地址是0,而U-Boot的加载到内存的起始地址是TEXT_BASE,SMRDATA标号在Flash的地址确实是SMRDATATEXT_BASE。 综上所述,lowlevel_init的作用确实是将SMRDATA开始的13个值复制给开始地址BWSCON的13个寄存器,从而完成了储备操纵器的设置。(9)复制U-Boot第二时期代码到RAM cpu/arm920t/start.S原先的代码是只支持从NOR Flash启动的,通过修改现在U-Boot在NOR Flash和NAND Flash上都能启动了,实现的思路是如此的: bl bBootFrm

23、NORFlash /* 判定U-Boot是在NAND Flash依旧NOR Flash启动 */ cmp r0, #0 /* r0存放bBootFrmNORFlash函数返回值,若返回0表示NAND Flash启动,否则表示在NOR Flash启动 */ beq nand_boot /* 跳转到NAND Flash启动代码 */* NOR Flash启动的代码 */ b stack_setup /* 跃过NAND Flash启动的代码 */nand_boot:/* NAND Flash启动的代码 */stack_setup: /* 其他代码 */ 其中bBootFrmNORFlash函数作用是

24、判定U-Boot是在NAND Flash启动依旧NOR Flash启动,若在NOR Flash启动则返回1,否则返回0。依照ATPCS规则,函数返回值会被存放在r0寄存器中,因此调用bBootFrmNORFlash函数后依照r0的值就能够判定U-Boot在NAND Flash启动依旧NOR Flash启动。bBootFrmNORFlash函数在board/samsung/mini2440/nand_read.c中定义如下:int bBootFrmNORFlash(void) volatile unsigned int *pdw = (volatile unsigned int *)0; uns

25、igned int dwVal; dwVal = *pdw; /* 先记录下原先的数据 */ *pdw = 0x12345678; if (*pdw != 0x12345678) /* 写入失败,讲明是在NOR Flash启动 */ return 1; else /* 写入成功,讲明是在NAND Flash启动 */ *pdw = dwVal; /* 复原原先的数据 */ return 0; 关于从NAND Flash启动的情形,其开始4KB的代码会被自动复制到CPU内部4K内存中,因此能够通过直截了当赋值的方法来修改。 关于从NOR Flash启动的情形,NOR Flash的开始地址即为0,

26、必须通过一定的命令序列才能向NOR Flash中写数据,因此能够依照这点差不来辨论是从NAND Flash依旧NOR Flash启动:向地址0写入一个数据,然后读出来,假如发觉写入失败的确实是NOR Flash,否则确实是NAND Flash。 下面来分析NOR Flash启动部分代码:208 adr r0, _start /* r0 - current position of code */209 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */* 判定U-Boot是否是下载到RAM中运行,若是,则不用 再复制到RAM中了,这种情形通常在调试U-Boot时才发生 */210 cmp r0, r1 /*_start等于_TEXT_BASE讲明是下载到RAM中运行 */211 beq stack_setup212 /* 以下直到nand_boot标号前差不多上NOR Flash启动的代码 */213 ldr r2, _armboot_start214 ldr r3, _bss_start215 sub r2, r3, r2

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1