本身对于很多平台,好像uboot里面的代码,在start.S中已经包含了这部分逻辑,通过判断当前运行代码地址是否和配置的SDRAM的地址一样,而决定是去先reload,即从Nor Flash上拷贝代码到SDRAM,然后再继续运行,还是发现已经在SDRAM中了,所以就直接继续运行。
但是,我们的板子(AMS3527),由于启动顺序和一般不一样,而地址空间布局也不同,所以,要实现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://www.rosoo.net/a/201005/9472.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
-
- 。。。。。。
- 。。。。。。
-
-
-
-
-
-
- #ifndef CONFIG_SKIP_LOWLEVEL_INIT
- bl cpu_init_crit
- #endif
-
- #ifndef CONFIG_SKIP_RELOCATE_UBOOT
- relocate:
- adr r0, _start
- ldr r1, _TEXT_BASE
- cmp r0, r1
- beq stack_setup
-
- ldr r2, _armboot_start
- ldr r3, _uboot_need_copy_end
- sub r2, r3, r2
- add r2, r0, r2
-
- copy_loop:
- ldmia r0!, {r3-r10}
- stmia r1!, {r3-r10}
- cmp r0, r2
- ble copy_loop
-
- ldr r1, _ccu_map
- ldr r0, [r1,#0]
- orr r0, r0, #0x01
- str r0, [r1,#0]
- #endif /* CONFIG_SKIP_RELOCATE_UBOOT */
-
- 。。。
(serial_story) |