问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何烧写u-boot到SD卡

发布网友 发布时间:2022-05-02 10:39

我来回答

3个回答

热心网友 时间:2022-06-19 09:37

长话短说开始搞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代码如下的用宏定义的一段:

[cpp] view plaincopy
#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,代码就会到如下段:

[cpp] view plaincopy
/* Read booting information */
ldr r0, =PRO_ID_BASE
ldr r1, [r0,#OMR_OFFSET] //读OM引脚的配置状态
bic r2, r1, #0xffffffc1

#ifdef CONFIG_VOGUES
/* PS_HOLD(GPH0_0) set to output high */
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

/* NAND BOOT */
cmp r2, #0x0 @ 512B 4-cycle
moveq r3, #BOOT_NAND //根据OM引脚配置状态来给R3寄存器赋予代表系统是从何冲外部存储器启动的配置值。

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<pre name="code" class="cpp"> ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
sub sp, sp, #12
mov fp, #0 /* no previous frame, so fp=0 */

/* when we already run in ram, we don't need to relocate U-Boot.
* and actually, memory controller must be configured before U-Boot
* is running in ram.
*/
ldr r0, =0xff000fff
bic r1, pc, r0 /* r0 <- current base addr of code */
ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */
bic r2, r2, r0 /* r0 <- current base addr of code */
cmp r1, r2 /* compare r0, r1 */
beq after_copy /* r0 == r1 then skip flash copy */</pre><br>
moveq r3, #BOOT_MMCSD/* NOR BOOT */cmp r2, #0x14moveq r3, #BOOT_NOR#if 0 /* Android C110 BSP uses OneNAND booting! *//* For second device booting *//* OneNAND BOOTONG failed */cmp r2, #0x8moveq r3, #BOOT_SEC_DEV#endif/* Uart BOOTONG failed */cmp r2, #(0x1<<4)moveq
r3, #BOOT_SEC_DEVldr r0, =INF_REG_BASEstr r3, [r0, #INF_REG3_OFFSET] //将配置值存入到用户使用的寄存器中,方便以后使用的时候读取此寄存器来了解此次启动时从何种外部存储设备启动
<pre></pre>
<p></p>
<pre></pre>
<pre name="code" class="cpp"> //ldr sp, =0xd0036000 /* end of sram dedicated to u-boot */
ldr sp, =0xd0035400 //BL1段的函数进行操作的堆栈位置,这里我修改了堆栈到了0xd0035400是由于图2中所示BL0代码进行了它自己代码堆栈的初始化,而RW/ZI region Heap的最低部就位于0xd0035400,为了不修改BL0堆栈和BL0代码已经写好的一些函数功能(会在下面用到),我将堆栈修改到了0xd0035400
sub sp, sp, #12 /* set stack */
mov fp, #0

bl lowlevel_init /* go setup pll,mux,memory */ //这里会进行始终,内存,串口初始化</pre>
<p>之后运行到</p>
<p></p>
<pre name="code" class="cpp"> ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */ //由于上面一步已经初始化了DRAM,所以在这里将以后的堆栈设置到了DRAM中的位置(以后BL2代码中函数都是基于此堆栈)
sub sp, sp, #12
mov fp, #0 /* no previous frame, so fp=0 */

/* when we already run in ram, we don't need to relocate U-Boot.
* and actually, memory controller must be configured before U-Boot
* is running in ram.
*/
ldr r0, =0xff000fff
bic r1, pc, r0 /* r0 <- current base addr of code */
ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */ //加载程序要运行的编译地址,同现在程序运行的地址比较
bic r2, r2, r0 /* r0 <- current base addr of code */
cmp r1, r2 /* compare r0, r1 */
beq after_copy /* r0 == r1 then skip flash copy */ //如果两地址相等,代码程序已经再DRAM中运行不必再拷贝,不相等代表程序没有在编译地址运行,还要拷贝代码到编译地址去,最后跳到对应编译地址内运行代码。</pre><pre name="code" class="cpp"> 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 //代码判断要拷贝后,读取之前存入到用户使用寄存器中的值来判断此次启动从何种外部存储设备启动,这里为sd卡启动
~~~~~省略若干代码~~~~~~~~
mmcsd_boot:
#if DELETE
ldr sp, _TEXT_PHY_BASE
sub sp, sp, #12
mov fp, #0
#endif
bl movi_bl2_copy //最后BL1代码来到此处从sd卡拷贝剩余的代码
b after_copy</pre><br>
<pre></pre>
<pre name="code" class="cpp"></pre>

热心网友 时间:2022-06-19 09:37

1. 安装 SD 卡格式化工具 3. 把 SD卡通过读卡器接入 PC 4. 运行 HPUSBFW 工具,会扫描到您的 SD卡 注意:请确认 HPUSBFW...

热心网友 时间:2022-06-19 09:38

1. 安装 SD 卡格式化工具
3. 把 SD卡通过读卡器接入 PC
4. 运行 HPUSBFW 工具,会扫描到您的 SD卡
注意:请确认 HPUSBFW 工具扫描到的 SD 卡 就是您的 SDHC 卡,以防出现误操作。

5. 选择“FAT32”系统格式
6. 点击“Start”
7. 等待格式化完成,点击“OK”
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎么网页突然自动关闭 网页为什么会突然自动关闭 网页自动关闭什么原因 怎么在微信里面自己组建群聊 门开在东南角,北面中间有窗,办公桌如何摆放 请推荐一款app导航系统,地图信息准确,界面友好,主要用于在境外... 急求一款app导航系统,地图信息准确,界面别太多杂乱的东西,主要用在境外... 欠了闪银3600,逾期125天,今天算了下,差不多要还6000,不还会怎么样?_百 ... 怎么进出口货物老被查验,难道被盯上了?海关是如何查验的,海关查验... 来料加工海关会查什么 外贸知识:海关查验详解 精英G41T - R3的声卡和网卡驱动找不到 RT..谁有麻烦传下.. 吉他初学者应该注意哪些问题。 联想电脑K3R3 sim解卡:0 6年补办过的移动的动感地带卡,解卡时点连接之后只出现&quot;逻辑电平:正向&quot;,扫描按钮灰色点不了 破解SIM卡 M17X R3的读卡器问题,是不是我脸比较丑 L1读卡器 就是网上说的比R3好的那个读卡器 有没有谁用过?效果怎么样? r3读卡器读过之后手机无信号了怎么办啊? R3读卡器是干什么的,怎么用求指教??? 怎么在啤酒瓶上打洞,还能保证瓶子不碎? 请问如何能把塑料瓶汽水瓶的瓶盖戳破一个洞? KENDA是什么牌子的轮胎 serve. 意思 词性 过去式 分词 serve可数么? serve 名词形式 service “服务”的名词,动词,动名词分别是什么? 英语题,serve能做名词吗 powerpoint2010 右侧有一纵栏可下载插入的幻灯片、图片等, 如何调出? 求助啊,本来我的PPT2010的视图旁边是格式的,现在怎么变成了加载项,求大家帮帮忙啊 usb转串口和网口转串口相比,哪个更稳定些? 初学者关于吉他的14个问题 新手学吉他需要注意些什么 问几个关于吉他入门的问题 10年后的移动卡如何解? 关于初学者学吉他的几个问题 笔记本配置,求大神介绍下,预算实在是低,看看能不能满足需求 关于吉他的初学者的几个问题 准备给自己的电脑换一个华硕主板? 为什么Windows至今无法识别多于一个的U盘分区 吉他初学者的一些问题,请求学过或者吉教或者有经验的人帮助。 oppo那些手机支持otg功能? 关于初学者自学吉他的一些问题 关于新手学吉他的一些问题! 吉他初学者的一些问题,求指教~ 吉他的初学者问题 吉他初学者的问题 关于吉他初学者的几个问题? 吉他初学者的一些问题 吉他初学者的一些疑问。 吉他初学者的一些疑问