uboot被sd烧写到什么地方

作者&投稿:晋影 (若有异议请与网页底部的电邮联系)
如何烧写u-boot到SD卡~

长话短说开始搞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 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 */
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] //将配置值存入到用户使用的寄存器中,方便以后使用的时候读取此寄存器来了解此次启动时从何种外部存储设备启动




//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 */ //这里会进行始终,内存,串口初始化

之后运行到



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中运行不必再拷贝,不相等代表程序没有在编译地址运行,还要拷贝代码到编译地址去,最后跳到对应编译地址内运行代码。 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

大小估计是指定错了吧?原则上要大于kernel的size

长话短说开始搞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
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 */

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] //将配置值存入到用户使用的寄存器中,方便以后使用的时候读取此寄存器来了解此次启动时从何种外部存储设备启动

//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 */ //这里会进行始终,内存,串口初始化
之后运行到

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中运行不必再拷贝,不相等代表程序没有在编译地址运行,还要拷贝代码到编译地址去,最后跳到对应编译地址内运行代码。
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 name="code" class="cpp"></pre>

朝辞白帝彩云间,千里江陵一日还。


ARM的板子为什么我们要用Jtag先烧写U-boot到NorFlash?
uboot是引导程序,这个程序如果没有的话,更别提基于bootloader的内核,文件系统等等了.一个裸板,想烧写uboot,只能通过一些工具了,比如通过SD卡启动,想办法在flash里面烧写uboot,或者通过一些工具把uboot烧写到flash里面.而这个工具,就包括了open jtag....

linux嵌入式开发中USB Boot启动模式为什么能烧写ARM的uboot
因为其实在 uboot 之前还有一个更小的启动程序,这个程序就是拿来刷 uboot 的。这个小段代码有些是在 CPU 里面固化。有些是板子自己有一套功能电路直接提供而不是通过 CPU 运行。我要是没记错的话。

求助 关于uboot.BIN 烧写uImage到开发板的内存中
直接文件系统列举吧烧写uboot、内核及文件系统 :1、uboot烧写 载Uboot两步骤第步uboot载系统扩展RAM并运行第二步通内存运行uboot整uboot载内存再烧写nandflash 第步 载uboot扩展RAM 首先使用短路块选择系统内部启复位或者电串口软件(115200 8 n 1)看打印信息LPC31xx READY FOR PLAIN IMAGE>使用...

烧写WiFi bootlooder什么意思
烧写WiFi bootlooder意思如下:1、烧wifi的意思是手机的wifi芯片坏了。手机的wifi芯片会坏是因为CPU过热,导致cpu针脚虚焊接触不良。建议不要边充边玩手机,不然可能会使手机负荷过大,从而导致CPU过热,芯片被烧坏。2、手机芯片:是IC的一个分类,是一种硅板上集合多种电子元器件实现某种特定功能的电路...

bootargs为什么烧写过不了
1、bootargs的设置不正确:需要检查你的bootargs命令行的串口设置是否正确、uboot传递的机器ID是否正确。2、bootargs与硬件配置或uboot版本不匹配:bootargs和bootcmd设置和实际板卡外围芯片型号和硬件电路原理图不匹配,会导致Kernel启动失败。3、文件系统问题:在烧写文件系统时遇到问题,需要重新烧写uboot,...

hi3520d烧写完UBOOT之后如何启动
1.JLINK只是往Nor Flash上烧写了UBOOT,所以你可以从Nor Flash启动。如果想从Nand Flash启动,那么依葫芦画瓢,你也必须把UBOOT烧写到Nand Flash上。但是注意,不能用JLINK烧写Nand Flash,只能用Nor Flash上的Uboot来间接烧写,大家也是这么做的。2.dnw在Windows下确实很难安装驱动,最简单的办法就是...

我自己写了基于s3c6410的uboot烧写到nandflash中,启动但是没有反应...
bl nand_read 是否正确读到uboot了,一般nand不能直接读,nand控制器是否已经初始化?

网络播放器刷机时显示0X16烧写BOOTO失败是什么什么情况
bootloader,翻译成启动引导程序,可以理解为手机的BIOS(Basic Input Output System,翻译为:基本输入输出系统)。当手机启动的时候,最先启动的是bootloader,然后完成对手机硬件的初始化,再引导手机进入系统。具体的技术细节可以不用追究。你描述的这种情况,多半是手机的硬件损坏了,不是通过刷机能解决的...

linux tf卡 一键烧写需要什么格式
??? d:sd type类型为auto(win7还需要点击format格式化SD卡)??? e:os type选择linux|android ??? f:点击select boot,选择合适的mmc.bin(SD卡启动文件),根据内存选 ??? g:program——确定——quite (A和B 步骤同一键烧写Linux)C:从UBOOT进入从USB下载模式 a:连接好硬件(包括插入...

怎么利用mfgtool烧写u-boot
你好,i.mx28和别的系列产品相比比较特殊,i.mx28的Nand flash 模式它有自己的bootloader为bootlet,并且它是将u-boot和uImage集成在在linux.sb文件中,所以你在烧写到Nand flash时候不需要烧写u-boot,只要烧写linux.sb和文件系统就好。正如ucl.xml中一样。

成都市19431188903: uboot被sd烧写到什么地方 -
不仁达力: 长话短说开始搞SD卡烧写UBOOT,从SD启动UBOOT.从s5pv210_irom_applicationnote_preliminary_20091126.pdf知道,s5pv210启动分BL0、BL1、BL2阶段.BL0是s5pv210内部IROM固化的代码,这段代码根据OM引脚配置状态来选择从...

成都市19431188903: 您好,uboot里面支持的芯片是不是就不需要对uboot进行修改而只要把编译好的uboot烧入到nand去? -
不仁达力: 即使使用uboot支持的芯片,在自己的板子上也是需要做移植的,板子的硬件环境不一样,比如LED灯接的IO引脚不同,芯片的外部晶振频谱不同,ram芯片,网卡芯片,nand芯片;很少有能不做移植,直接烧到nand flash直接就能跑成功的

成都市19431188903: 对于uboot,norflash启动就是被烧写在norflash中吗,nandflsh启动就被烧写在nandflash中吗 -
不仁达力: 根据你的设计决定烧在哪儿.当然有可能CPU支持启动次序的,像PC一样.norflash启动就是从NOR FLASH启动,同样,NANDflash启动,就是从NAND FLASH启动.烧写不是要jlink提示你烧到哪儿,而是你要告诉它烧到哪儿.

成都市19431188903: 如何烧写u - boot到SD卡 -
不仁达力: 长话短说开始搞SD卡烧写UBOOT,从SD启动UBOOT. 从s5pv210_irom_applicationnote_preliminary_20091126.pdf知道,s5pv210启动分BL0、BL1、BL2阶段.BL0是s5pv210内部IROM固化的代码,这段代码根据OM引脚配置状态来选择从...

成都市19431188903: 请问uboot是烧到norflash还是nand flash里?
不仁达力: 都可以.可以看一下开发板说明书,或者附带的Uboot源代码来确定.BOOT_CMD、BOOT_NAND(大概是这个宏吧,几年不玩ARM忘记了)等宏的内容可作为参考..

成都市19431188903: 为什么烧写uboot到nand时,最后一步不成功?
不仁达力: 以EasyARM-i.MX28x来讲,使用sb_loader.exe【\3.Linux\2.工具软件\1.Windows工具软件\MfgTool\Utils】将下面的erase_nand.sb下到DDR运行,一路按“n”,直到提示NAND测试时,按“y”进去,开始擦除整块Nand,擦除后,即可按照正常步骤继续烧写uboot到Nand.

成都市19431188903: 如何通过uboot烧写rootfs.img 到nand -
不仁达力: 利用NOR Flash.这种方法是利用JLink能够烧写程序到NOR Flash来完成的,首先利用J-FLASH ARM将u-boot.bin烧写进NOR Flash(记得烧写到NOR Flash的0x0起始地址处),然后设置开发板从NOR Flash启动,这时候系统进入U-boot命令行...

成都市19431188903: 如何把uboot烧写到nandflash -
不仁达力: 很多同学使用笔记本作为自己的ARM开发和学习的平台,绝大多数笔记本都没有并口,也就是无法使用JTag调试和烧写程序到Nand Flash中,幸好我们还有JLINK,用JLINK烧写U-boot到Nor Flash中很简单,大部分NOR Flash都已经被JLink的软件SEGGER所支持

成都市19431188903: 学习uboot遇到的几个问题,想请教一下大家
不仁达力: 回复 u-boot有2种方式加载1. u-boot存放在NOR flash中,这种是可以片上执行的,例如powerpc,启动时CPU直接跳转到0x00000100或者0xFFFFF100或其他地址开始运行u-boot,此时u-boot会初始化CPU、SDRAM/DDR等,最后加载内核和根...

成都市19431188903: 请问如何将u - boot - nand.bin烧写入OK6410开发板中(最好不需要SD卡或jLink)? -
不仁达力: 我们烧写ARM开发板 一般通过硬件协议的方式烧写:比如jLINK 还有就是通过uboot模式下的tftp命令下载,或者串口下载,usb下载 SD卡烧写的原理是制作uboot的SD卡启动盘,JLINK是通过硬件协议的 你现在不想通过这两种方式下载,只能看板子是否固化了启动程序,用于引导下载uboot,或者现在板子里就已经有用于下载的uboot模式,在这种情况下,你可以通过uboot命令下载u-boot等内核,否则没有其他方式了.我是这么认为的,不知道有没有说错,期望能给你一点帮助...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网