从s5pv210_irom_applicationnote_preliminary_20091126.pdf知道,s5pv210启动分BL0、BL1、BL2阶段。BL0是s5pv210内部IROM固化的代码,这段代码根据OM引脚配置状态来选择从哪个外部存储设备加载BL1段代码(实际上BL1代码就是我们编写的UBOOT的前8K代码,这段代码要包含完整的将后半部UBOOT代码复制和清bss段的功能,当然我们要从SD卡启动烧写在上面的UBOOT,OM引脚就必须配置为从SD卡启动配置)。
图1
从上图可知,从sd启动的时候BL0加载的代码是从第512个字节处开始加载代码,为什么要这样做呢?由于以后功能扩展的需要三星的软件工程师写的固化到IROM中的BL0代码是从SD卡的512字节处加载BL1的,他就是这样写的,我们对应UBOOT放置在SD卡中的位置就要往后移动512字节,后面有介绍怎么指定把uboot写到sd卡指定的位置的命令。
还有一定要注意如下所示的地方:
图2
在BL1之前要加16个字节的头部信息。也就是在真正的UBOOT第一条指令之前要加16个字节的头部信息,于是就有我们所看到的uboot代码如下的用宏定义的一段:
-
#ifdefined(CONFIG_EVT1)&&!defined(CONFIG_FUSED)
-
.word0x2000
-
.word0x0
-
.word0x0
-
.word0x0
-
#endif
-
-
.globl_start
-
_start:breset
-
ldrpc,_undefined_instruction
-
ldrpc,_software_interrupt
-
ldrpc,_prefetch_abort
其中的.word
0x2000 代表BL1size(8K长度),.word 0x0 为保留字节.word 0x0为checksum(后续会通过一个mkbl1工具来计算bl1的checksum并填写这个位置),最后一个.word 0x0也为保留字节。
再来看看uboot的下面的部分,如果bl0正常读取了bl1,代码就会到如下段:
-
-
ldrr0,=PRO_ID_BASE
-
ldrr1,[r0,#OMR_OFFSET]
-
bicr2,r1,#0xffffffc1
-
-
#ifdefCONFIG_VOGUES
-
-
ldrr0,=ELFIN_GPIO_BASE
-
ldrr1,=0x00000001
-
strr1,[r0,#GPH0CON_OFFSET]
-
-
ldrr1,=0x5500
-
strr1,[r0,#GPH0PUD_OFFSET]
-
-
ldrr1,=0x01
-
strr1,[r0,#GPH0DAT_OFFSET]
-
#endif
-
-
-
cmpr2,#0x0@512B4-cycle
-
moveqr3,#BOOT_NAND
-
-
cmpr2,#0x2@2KB5-cycle
-
moveqr3,#BOOT_NAND
-
-
cmpr2,#0x4@4KB5-cycle8-bitECC
-
moveqr3,#BOOT_NAND
-
-
cmpr2,#0x6@4KB5-cycle16-bitECC
-
moveqr3,#BOOT_NAND
-
-
cmpr2,#0x8@OneNANDMux
-
moveqr3,#BOOT_ONENAND
-
-
-
cmpr2,#0xc<prename="code"class="cpp">ldrsp,_TEXT_PHY_BASE
-
subsp,sp,#12
-
movfp,#0
-
-
-
-
-
-
ldrr0,=0xff000fff
-
bicr1,pc,r0
-
ldrr2,_TEXT_BASE
-
bicr2,r2,r0
-
cmpr1,r2
-
beqafter_copy</pre><br>
-
moveqr3,#BOOT_MMCSDcmpr2,#0x14moveqr3,#BOOT_NOR#if0cmpr2,#0x8moveqr3,#BOOT_SEC_DEV#endifcmpr2,#(0x1<<4)moveq
-
r3,#BOOT_SEC_DEVldrr0,=INF_REG_BASEstrr3,[r0,#INF_REG3_OFFSET]
-
<pre></pre>
-
<p></p>
-
<pre></pre>
-
<prename="code"class="cpp">
-
ldrsp,=0xd0035400
-
subsp,sp,#12
-
movfp,#0
-
-
bllowlevel_init
-
<p>之后运行到</p>
-
<p></p>
-
<prename="code"class="cpp">ldrsp,_TEXT_PHY_BASE
-
subsp,sp,#12
-
movfp,#0
-
-
-
-
-
-
ldrr0,=0xff000fff
-
bicr1,pc,r0
-
ldrr2,_TEXT_BASE
-
bicr2,r2,r0
-
cmpr1,r2
-
beqafter_copy
-
ldrr1,[r0,#INF_REG3_OFFSET]
-
cmpr1,#BOOT_NAND
-
beqnand_boot
-
cmpr1,#BOOT_ONENAND
-
beqonenand_boot
-
cmpr1,#BOOT_MMCSD
-
beqmmcsd_boot
-
cmpr1,#BOOT_NOR
-
beqnor_boot
-
cmpr1,#BOOT_SEC_DEV
-
beqmmcsd_boot
-
~~~~~省略若干代码~~~~~~~~
-
mmcsd_boot:
-
#ifDELETE
-
ldrsp,_TEXT_PHY_BASE
-
subsp,sp,#12
-
movfp,#0
-
#endif
-
blmovi_bl2_copy
-
bafter_copy</pre><br>
-
<pre></pre>
-
<prename="code"class="cpp"></pre>
分享到:
相关推荐
自己归纳总结的linux下将uboot.bin文件烧写到SD卡的方法与原理,其中包含了对dd命令的分析,和tiny210对SD卡启动的要求,针对SD卡进行分区管理的原理。本资料应该用在对这方面不了解 的朋友肯定有十分大的用处,希望...
如何往开发板上烧写uboot 好 介绍SD卡和JTAG两种方法
H-Jtag烧写UBOOT 来自顶嵌嵌入式技术:www.top-e.org
jlink烧写uboot配置文件,这样就不用手工一个一个输入了
本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误, 引导失败等情况时如何重新烧写uboot/kernel.
ARM学习之Jlink烧写Uboot--教怎样配置JLINK用来烧写UBOOT
TQ2440烧写uboot全过程 TQ2440烧写uboot全过程
利用jlink command 烧写uboot到mini2440 nand flash方法 mht格式
明白uboot怎么到sd卡的原理概述;安装到ctags;.S3c2416内嵌IROM(BL0)读取sd卡的后16扇区(8k)的代码到IRAM(BL1),BL1读取256k(512扇区)的uboot到SDRAM中,从而启动u-boot-movi.bin引导程序;配置编译uboot1.3.4;...
海思自带烧写uboot工具
使用JLink烧写uboot.bin到Mini2440的NandFlash
qt210开发板android4.0uboot_1.3.4(qt210_ics_uboot.bz2)编译通过
JLink烧写Uboot.最简单的命令行模式烧写。
uboot烧写文件,讯为4412烧写u-boot-itop-4412.bin烧写错了怎么办 Failed to read /sdupdate/u-boot-iTOP-4412.bin
TF卡烧写UBOOTTF卡烧写
自己找了好久才搜集到的方法和资源,上传方便大众吧,多多交流,共同进步
u-boot qt210开发板
针对s3c2416开发板,从SD卡启动uboot,不需要修改,直接编译bin文件用IROM_Fusing_Tool工具烧录到SD卡中,然后跳线从SD卡即可启动UBOOT
zynq修改uboot环境变量保存到sd卡。ebaz4205上,启动方式为sd,进入uboot后,修改环境变量可以将环境变量保存到sd卡中。