uboot被sd烧写到什么地方
答案:2 悬赏:0 手机版
解决时间 2021-01-31 00:29
- 提问者网友:暮烟疏雨之际
- 2021-01-30 18:37
uboot被sd烧写到什么地方
最佳答案
- 五星知识达人网友:十鸦
- 2021-01-30 19:14
长话短说开始搞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
ldr r0, =PRO_ID_BASE
ldr r1, [r0,#OMR_OFFSET] //读OM引脚的配置状态
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 //根据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
cmp r2, #0xc
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] //将配置值存入到用户使用的寄存器中,方便以后使用的时候读取此寄存器来了解此次启动时从何种外部存储设备启动
//ldr sp, =0xd0036000
ldr sp, =0xd0035400 //BL1段的函数进行操作的堆栈位置,这里我修改了堆栈到了0xd0035400是由于图2中所示BL0代码进行了它自己代码堆栈的初始化,而RW/ZI region Heap的最低部就位于0xd0035400,为了不修改BL0堆栈和BL0代码已经写好的一些函数功能(会在下面用到),我将堆栈修改到了0xd0035400
sub sp, sp, #12
mov fp, #0
bl lowlevel_init //这里会进行始终,内存,串口初始化
之后运行到
ldr sp, _TEXT_PHY_BASE //由于上面一步已经初始化了DRAM,所以在这里将以后的堆栈设置到了DRAM中的位置(以后BL2代码中函数都是基于此堆栈)
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 //如果两地址相等,代码程序已经再DRAM中运行不必再拷贝,不相等代表程序没有在编译地址运行,还要拷贝代码到编译地址去,最后跳到对应编译地址内运行代码。
ldr r0, =INF_REG_BASE
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 //代码判断要拷贝后,读取之前存入到用户使用寄存器中的值来判断此次启动从何种外部存储设备启动,这里为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 name="code" class="cpp"></pre>
从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
ldr r0, =PRO_ID_BASE
ldr r1, [r0,#OMR_OFFSET] //读OM引脚的配置状态
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 //根据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
cmp r2, #0xc
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] //将配置值存入到用户使用的寄存器中,方便以后使用的时候读取此寄存器来了解此次启动时从何种外部存储设备启动
//ldr sp, =0xd0036000
ldr sp, =0xd0035400 //BL1段的函数进行操作的堆栈位置,这里我修改了堆栈到了0xd0035400是由于图2中所示BL0代码进行了它自己代码堆栈的初始化,而RW/ZI region Heap的最低部就位于0xd0035400,为了不修改BL0堆栈和BL0代码已经写好的一些函数功能(会在下面用到),我将堆栈修改到了0xd0035400
sub sp, sp, #12
mov fp, #0
bl lowlevel_init //这里会进行始终,内存,串口初始化
之后运行到
ldr sp, _TEXT_PHY_BASE //由于上面一步已经初始化了DRAM,所以在这里将以后的堆栈设置到了DRAM中的位置(以后BL2代码中函数都是基于此堆栈)
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 //如果两地址相等,代码程序已经再DRAM中运行不必再拷贝,不相等代表程序没有在编译地址运行,还要拷贝代码到编译地址去,最后跳到对应编译地址内运行代码。
ldr r0, =INF_REG_BASE
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 //代码判断要拷贝后,读取之前存入到用户使用寄存器中的值来判断此次启动从何种外部存储设备启动,这里为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 name="code" class="cpp"></pre>
全部回答
- 1楼网友:时间的尘埃
- 2021-01-30 19:38
长话短说开始搞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
ldr r0, =pro_id_base
ldr r1, [r0,#omr_offset] //读om引脚的配置状态
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 //根据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
cmp r2, #0xc
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] //将配置值存入到用户使用的寄存器中,方便以后使用的时候读取此寄存器来了解此次启动时从何种外部存储设备启动
//ldr sp, =0xd0036000
ldr sp, =0xd0035400 //bl1段的函数进行操作的堆栈位置,这里我修改了堆栈到了0xd0035400是由于图2中所示bl0代码进行了它自己代码堆栈的初始化,而rw/zi region heap的最低部就位于0xd0035400,为了不修改bl0堆栈和bl0代码已经写好的一些函数功能(会在下面用到),我将堆栈修改到了0xd0035400
sub sp, sp, #12
mov fp, #0
bl lowlevel_init //这里会进行始终,内存,串口初始化
之后运行到
ldr sp, _text_phy_base //由于上面一步已经初始化了dram,所以在这里将以后的堆栈设置到了dram中的位置(以后bl2代码中函数都是基于此堆栈)
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 //如果两地址相等,代码程序已经再dram中运行不必再拷贝,不相等代表程序没有在编译地址运行,还要拷贝代码到编译地址去,最后跳到对应编译地址内运行代码。
ldr r0, =inf_reg_base
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 //代码判断要拷贝后,读取之前存入到用户使用寄存器中的值来判断此次启动从何种外部存储设备启动,这里为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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯