终于实现了从外部Nor Flash启动Uboot了
本身对于很多平台,好像uboot里面的代码,在start.S中
已经包含了这部分逻辑,通过判断当前运行代码地址是否和配置的SDRAM的地址一样,
而决定是去先reload,即从Nor Flash上拷贝代码到SDRAM,然后再继续运行,还是发现已经在SDRAM中了,
所以就直接继续运行。
但是,我们的板子,由于启动顺序和一般不一样,而地址空间布局也不同,
所以,要实现uboot从Nor Flash启动,就稍微要麻烦一些了。
原先的启动顺序是,
通过配置外面的跳线,选择从Interl 128KB的ROM启动,
然后里面固化的启动代码,根据板子上的跳线配置的,支持多种不同启动:
XPC[3:1] Boot Device
0 000 SPI master ST M25Pxx serial Nor Flash
1 001 reserved
2 010 SPI slave
3 011 NandFlash (SB/BB – autodetect)
4 100 NandFlash (SB/BB – autodetect)
5 101 UART / Command Line Interface without diagnostics
6 110 UART / Command Line Interface without diagnostics
7 111 UART / Command Line Interface with diagnostics
一般常见的是从Nand Flash启动。
此时在ROM中的启动代码,会去Nand Flash里面读取你之前烧写进去的uboot到板子内嵌的
Embedded 320KB的1T-RAM,然后跳转到uboot要执行的函数继续执行uboot。
而想要实现从Nor Flash启动uboot,那么就要先把uboot烧写到Nor Flash。
这点,前面帖子已经介绍了:
实现将uboot烧写到外部Nor Flash
http://hi.baidu.com/serial_story/blog/item/100509d11d316e319a50276f.html
此处,接着之前继续折腾。
最后是实现了,具体要做的事情大概有:
1.在start.S中,把通用的那套reload uboot的代码拷贝过来。
2.把uboot要拷贝到得目的地址_TEXT_BASE,改成我们板子上的地址布局。
3.在拷贝完uboot代码之后,打算要去内部的320KB的SRAM中运行uboot。所以要根据datasheet中的介绍,
先去配置对应的寄存器的位,做一下remap,将之前映射到Nor Flash的0地址,映射成320KB的SRAM的首地址。
而下面代码中的0x81000000是Embedded 320KB的1T-RAM的别名,也就是,无论你怎么去map,怎么设置,
这个地址都代表的是Embedded 320KB的1T-RAM。
另外的,0x10000000是我们的Nor Flash的地址别名。
贴出start.S中相关的代码如下:
。。。。
#define TEXT_BASE 0x81000000
#define NOR_BASE 0x10000000
#define CCU_MEMMAP 0xC8100008
RAM_END:
.word 0x50000
_TEXT_BASE:
.word TEXT_BASE
.globl _armboot_start
_armboot_start:
.word _start
.globl _NOR_BASE
_NOR_BASE:
.word NOR_BASE
.globl _ccu_map
_ccu_map:
.word CCU_MEMMAP
。。。。。。
。。。。。。
/*
* we do sys-critical inits only at reboot,
* not when booting from ram!
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* read U-Boot from Nor to 320K SRAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don’t reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _uboot_need_copy_end
sub r2, r3, r2 /* r2 <- size of uboot */
add r2, r0, r2 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
/* remap SRAM to 0x00 */
ldr r1, _ccu_map /* 将ccu map的寄存器的地址存储到r1中 */
ldr r0, [r1,#0] /* 读取ccu map的寄存器的值 */
orr r0, r0, #0x01 /* 根据datasheet中描述,将bit0置1,实现remap */
str r0, [r1,#0] /* 存储r0的值到ccu map中 */
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
。。。。
。。。
转载请注明:在路上 » 终于实现了从外部Nor Flash启动Uboot了