一,启动过程简介
代码位置:uboot中的start.s
Tips:这些代码并不是连续的,是将相关代码进行截取
- 读取0xE000_0004(PRO_ID_BASE+OMR_OFFSET)来判断启动方式的代码,将0xE000_0004的bit1-bit5取出存放到r2中
ldr r0, =PRO_ID_BASE
ldr r1, [r0,#OMR_OFFSET]
bic r2, r1, #0xffffffc1
- 将r2与预定义值进行比较,判断启动方式,将相应的启动方式存储在r3中
/* NAND BOOT */
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
/* SD/MMC BOOT */
cmp r2, #0xc
moveq r3, #BOOT_MMCSD
/* NOR BOOT */
cmp r2, #0x14
moveq r3, #BOOT_NOR
- 然后将得到的结果存放到INF_REG3中(0xE010F000+0x0c)
ldr r0, =INF_REG_BASE
str r3, [r0, #INF_REG3_OFFSET]
- 最后根据INF_REG3的值进行判断,选择相应的启动代码
ldr r0, =INF_REG_BASE
ldr r1, [r0, #INF_REG3_OFFSET]
cmp r1, #BOOT_NAND /* 0x0 => boot device is nand */
beq nand_boot
cmp r1, #BOOT_ONENAND /* 0x1 => boot device is 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
二,测试过程
- 读取0xE000_0004地址值
- 使用不同启动方式进行启动
- 开发板:Study210
三,测试结果
- USB直接启动时,读取到的结果是0x2d(bit0~bit5:101101),对照下表可知启动方式为Firstboot(Uart->Usb),Nand4Kb,5cycle,X-TAL,即首先从USB启动,启动失败,从Nand4Kb,5cycle启动
2. SD卡直接启动时,读取到的结果是0x0d(bit0~bit5:001101),对照下表可知启动方式为SD/MMC,即SD/MMC启动,bit1-bit5为0xc,与u-boot中的SD/MMC BOOT对应
/* SD/MMC BOOT */
cmp r2, #0xc
moveq r3, #BOOT_MMCSD
3. 设置为SD卡启动,但不放置SD卡,3秒钟后,DNW软件显示USB连接OK,使用DNW下载程序启动,读取到的结果是0x0d(bit0~bit5:001101),与上图相同,结合下图,SD启动失败后会从UART->USB启动
四,总结
- 0xE0000_004的bit0-bit5与OMPIN bit0-bit5一 一对应
- 验证S5PV210_iROM_ApplicationNote启动顺序