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

加入VIP,省得不是一点点
 

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

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

下载须知

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

版权提示 | 免责声明

本文(AM335x uboot spl分析.doc)为本站会员(11****ws)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

AM335x uboot spl分析.doc

1、AM335x uboot spl 分析芯片到 uboot 启动流程ROM SPL uboot.img简介在 335x 中 ROM code 是第一级的 bootlader。mpu 上电后将会自动执行这里的代码,完成部分初始化和引导第二级的 bootlader,第二级的 bootlader 引导第三级bootader,在 ti 官方上对于第二级和第三级的 bootlader 由 uboot 提供。SPLTo unify all existing implementations for a secondary program loader (SPL) and to allow simply add

2、ing of new implementations this generic SPL framework has been created. With this framework almost all source files for a board can be reused. No code duplication or symlinking is necessary anymore.1 Basic ARM initialization2 UART console initialization3 Clocks and DPLL locking (minimal) 4 SDRAM ini

3、tialization5 Mux (minimal) 6 BootDevice initialization(based on where we are booting from.MMC1/MMC2/Nand/Onenand) 7 Bootloading real u-boot from the BootDevice and passing control to it. uboot spl 源代 码分析一、makefile 分析打开 spl 文件夹只有一个 makefile 可见 spl 都是复用 uboot 原先的代码。主要涉及的代码文件为 u-boot-2011.09-psp04.06.0

4、0.03/arch/arm/cpu/armv7u-boot-2011.09-psp04.06.00.03/arch/arm/libu-boot-2011.09-psp04.06.00.03/drivers LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-spl.lds这个为链接脚本二、u-boot-spl.ldsSram 0x402F0400 Sdram 0x80000000.bss.TEXT (arch/arm/cpu/armv7/start.o).rodata.data_start 为程序开始_image_copy_end_end三、代码解析_

5、start 为程序开始 (arch/arm/cpu/armv7/start.S).globl _start 这是在定 义 u-boot 的启动定 义入口点,汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用 ENTRY 标志指明其它入口点。.global 是 GNU ARM 汇编的一个伪操作,声明一个符号可被其他文档引用,相当于声明了一个全局变量,.globl 和.global 相同。该部分为处理器的异常处理向量表。地址范围为 0x0000 0000 0x0000 0020,刚好 8 条指令。为什么是 8 条指令呢? 这 里来算一算。首先,一条 arm 指令为 32bit(位)

6、,0x0000 0020 换算成十 进制为 25=32B(字节 ),而 32(B) = 4 * 8(B) = 4 * 8 * 8( bit),所以 刚好 8 条指令(一个字节 Byte 包含 8 个位 bit)。下面是在汇编程序种经常会遇到的异常向量表。Arm 处理器一般包括复位、未定义指令、SWI、预取终止、数据终止、IRQ、FIQ 等异常,其中 U-Boot 中关于异常向量的定义如下:_start: b reset _start 标号表明 oot 程序从这里开始执行。b 是不带返回的跳转(bl 是带返回的跳转),意思是无条件直接跳转到 reset 标号出执行程序。b 是最简单的分支,一旦遇

7、到一个 b 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。注意存储在分支指令中的实际的值是相对当前的 R15 的值的一个偏移量;而不是一个绝对地址。它的值由汇编器来计算,它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位。ldr pc, _undefined_instr tion /未定义指令ldr pc, _software_interrupt /软中断 SWIldr pc, _prefetch_abort /预取终止ldr pc, _data_abort /数访问终止ldr pc, _not_used ldr pc, _irq /中断请求 I

8、RQldr pc, _fiq /快速中断 FIQ#ifdef CONFIG_SPL_BUILD /该阶段为 spl 执行下面代码_undefined_instruction: .word _undefined_instruction_software_interrupt: .word _software_interrupt_prefetch_abort: .word _prefetch_abort_data_abort: .word _data_abort_not_used: .word _not_used_irq: .word _irq_fiq: .word _fiq_pad: .word

9、0x12345678 /* now 16*4=64 */#else_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq_pad: .word 0x12345678 /* now 16*4=64 */#endif/* C

10、ONFIG_SPL_BUILD */.word 为 ARM 汇编特有的伪操作符,语法如下:.word , 作用:插入一个 32-bit 的数据队列。(与 armasm 中的 DCD 功能相同).balignl 16,0xdeadbeef.align 伪操作用于表示对齐方式:通过添加填充字节使当前位置满足一定的对齐方式。接下来是对各个段代码的定义略Rest: (arch/arm/cpu/armv7/start.S)bl save_boot_paramssave_boot_params: (arch/arm/cpu/armv7/ti81xx/lowlevel_init.S)#ifdef CONFI

11、G_SPL_BUILDldr r4, =ti81xx_boot_device /ti81xx_boot_device = BOOT_DEVICE_NAND/启动方式ldr r5, r0, #BOOT_DEVICE_OFFSETand r5, r5, #BOOT_DEVICE_MASKstr r5, r4#endifbx lr回到 reset:(arch/arm/cpu/armv7/start.S)/设置 cpu 的工作模式 设置 CPU 的状态类型为 SVC 特权模式mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr,r0cpu_ini

12、t_crit: (arch/arm/cpu/armv7/start.S)mov r0, #0 set up for MCRmcr p15, 0, r0, c8, c7, 0 invalidate TLBsmcr p15, 0, r0, c7, c5, 0 invalidate icachemcr p15, 0, r0, c7, c5, 6 invalidate BP arraymcr p15, 0, r0, c7, c10, 4 DSBmcr p15, 0, r0, c7, c5, 4 ISB/关闭 mmu 缓存mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x0

13、0002000 clear bits 13 (-V-)bic r0, r0, #0x00000007 clear bits 2:0 (-CAM)orr r0, r0, #0x00000002 set bit 1 (-A-) Alignorr r0, r0, #0x00000800 set bit 11 (Z-) BTB#ifdef CONFIG_SYS_ICACHE_OFFbic r0, r0, #0x00001000 clear bit 12 (I) I-cache#elseorr r0, r0, #0x00001000 set bit 12 (I) I-cache#endifmcr p15

14、, 0, r0, c1, c0, 0/调用初始化 函数mov ip, lr persevere link reg across callbl lowlevel_init go setup pll,mux,memorylowlevel_init:(arch/arm/cpu/armv7/ti81xx/lowlevel.S)/* The link register is saved in ip by start.S */mov r6, ip/* check if we are already running from RAM */ldr r2, _lowlevel_init_TEXT_BASE:.w

15、ord CONFIG_SYS_TEXT_BASE /* Load address (RAM) */#define CONFIG_SYS_TEXT_BASE 0x80800000SDRAM 的前 8MB 作为 spl 的 bss 段然后前 64bytes 做为 u-boot.img 的头ldr r3, _TEXT_BASEsub r4, r2, r3sub r0, pc, r4/设置堆栈指针/* require dummy instr or subtract pc by 4 instead im doing stack init */ldr sp, SRAM_STACKmark1:ldr r5,

16、 _mark1sub r5, r5, r2 /* bytes between mark1 and lowlevel_init */sub r0, r0, r5 /* r0 0 then we are in ocmc or DDR */cmp r0, #0x80000000bne s_init_startmov r10, #0x01b s_init_starts_init_start:(arch/arm/cpu/armv7/ti81xx/lowlevel.S)mov r0, r10 /* passing in_ddr in r0 */bl s_init初始化 pll mux memery /*

17、back to arch calling code */mov pc, r6call_board_init_f:(arch/arm/cpu/armv7/start.s)/设置堆栈指针,并调用 board_init_f ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ldr r0,=0x00000000bl board_init_fvoid board_init_f(ulong dummy)u-boot-2011.09-psp04.06.00.03/arch/arm

18、/cpu/armv7/omap-common/spl.c调用 relocate_code(CONFIG_SPL_STACK, 这里使用了 CONFIG_SPL_STACK#define CONFIG_SPL_STACK LOW_LEVEL_SRAM_STACK#define LOW_LEVEL_SRAM_STACK (SRAM0_START + SRAM0_SIZE 4)gdata 为.bss 前一段的空间 描述镜像头#define CONFIG_SPL_TEXT_BASE 0x402F0400relocate_code: (arch/arm/cpu/armv7/start.s)重载定位代码j

19、ump_2_ram: (arch/arm/cpu/armv7/start.s)跳转到 spl 的第二阶段board_init_r:(u-boot-2011.09-psp04.06.00.03/arch/arm/cpu/armv7/omap-common/spl.c)初始化时钟: timer_init()i2c 初始化: i2c_init();获取启动方式 omap_boot_device();判断启动方式从不同的地方装载镜像从 mmc 中装载镜像 spl_mmc_load_image();从 nand 中装载镜像 spl_nand_load_image();从 uart 中装载镜像 spl_ymodem_load_image();判断镜像类型跳转到镜像中执行镜像 jump_to_image_no_args();装载镜像 将会从配置的存储介质中读取数据 及 uboot 镜像然后跳转到 uboot 中执行 uboot注:文章版权属于成都莱得科技有限公司所有,转载请注明出处。

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。