最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

终于实现了从外部Nor Flash启动Uboot了

工作和技术 crifan 2348浏览 0评论

终于实现了从外部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了

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.155 seconds, using 22.11MB memory