世界早已进入cortex-a8了,我也得跟进一下所以买了QT210的开发板。
长话短说开始搞SD卡烧写UBOOT,从SD启动UBOOT。
从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代码如下的用宏定义的一段:
-
#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
-
.word 0x2000
-
.word 0x0
-
.word 0x0
-
.word 0x0
-
#endif
-
-
.globl _start
-
_start: b reset
-
ldr pc, _undefined_instruction
-
ldr pc, _software_interrupt
-
ldr pc, _prefetch_abort
其中的 .word 0x2000 代表BL1size(8K长度),.word 0x0 为保留字节 .word 0x0为checksum(后续会通过一个mkbl1工具来计算bl1的checksum并填写这个位置),最后一个.word 0x0也为保留字节。
再来看看uboot的下面的部分,如果bl0正常读取了bl1,代码就会到如下段:
-
-
ldr r0, =PRO_ID_BASE
-
ldr r1, [r0,#OMR_OFFSET]
-
bic r2, r1, #0xffffffc1
-
-
#ifdef CONFIG_VOGUES
-
-
ldr r0, =ELFIN_GPIO_BASE
-
ldr r1, =0x00000001
-
str r1, [r0, #GPH0CON_OFFSET]
-
-
ldr r1, =0x5500
-
str r1, [r0, #GPH0PUD_OFFSET]
-
-
ldr r1, =0x01
-
str r1, [r0, #GPH0DAT_OFFSET]
-
#endif
-
-
-
cmp r2, #0x0 @ 512B 4-cycle
-
moveq r3, #BOOT_NAND
-
-
cmp r2, #0x2 @ 2KB 5-cycle
-
moveq r3, #BOOT_NAND
-
-
cmp r2, #0x4 @ 4KB 5-cycle 8-bit ECC
-
moveq r3, #BOOT_NAND
-
-
cmp r2, #0x6 @ 4KB 5-cycle 16-bit ECC
-
moveq r3, #BOOT_NAND
-
-
cmp r2, #0x8 @ OneNAND Mux
-
moveq r3, #BOOT_ONENAND
-
-
-
cmp r2, #0xc
"code"
class="cpp"> ldr sp, _TEXT_PHY_BASE
-
sub sp, sp, #12
-
mov fp, #0
-
-
-
-
-
-
ldr r0, =0xff000fff
-
bic r1, pc, r0
-
ldr r2, _TEXT_BASE
-
bic r2, r2, r0
-
cmp r1, r2
-
beq after_copy
-
moveq r3, #BOOT_MMCSDcmp r2, #0x14moveq r3, #BOOT_NOR#if 0 cmp r2, #0x8moveq r3, #BOOT_SEC_DEV#endifcmp r2, #(0x1<<4)moveq
-
r3, #BOOT_SEC_DEVldr r0, =INF_REG_BASEstr r3, [r0, #INF_REG3_OFFSET]
-
-
-
-
"code"
class="cpp">
-
ldr sp, =0xd0035400
-
sub sp, sp, #12
-
mov fp, #0
-
-
bl lowlevel_init
-
之后运行到
-
-
"code"
class="cpp"> ldr sp, _TEXT_PHY_BASE
-
sub sp, sp, #12
-
mov fp, #0
-
-
-
-
-
-
ldr r0, =0xff000fff
-
bic r1, pc, r0
-
ldr r2, _TEXT_BASE
-
bic r2, r2, r0
-
cmp r1, r2
-
beq after_copy
-
ldr r1, [r0, #INF_REG3_OFFSET]
-
cmp r1, #BOOT_NAND
-
beq nand_boot
-
cmp r1, #BOOT_ONENAND
-
beq onenand_boot
-
cmp r1, #BOOT_MMCSD
-
beq mmcsd_boot
-
cmp r1, #BOOT_NOR
-
beq nor_boot
-
cmp r1, #BOOT_SEC_DEV
-
beq mmcsd_boot
-
~~~~~省略若干代码~~~~~~~~
-
mmcsd_boot:
-
#if DELETE
-
ldr sp, _TEXT_PHY_BASE
-
sub sp, sp, #12
-
mov fp, #0
-
#endif
-
bl movi_bl2_copy
-
b after_copy
-
-
"code"
class="cpp">
阅读(2375) | 评论(0) | 转发(0) |