制作从SDRAM启动的U-Boot


u-boot问:如果板子只有SDRAM怎么办?

答:那就做一个可以jtag加载到SDRAM执行的u-boot!

首先要做到事情是用u-boot来加载u-boot,在这基础上再考虑直接用仿真器加载u-boot,两者的区别在于前者会初始化处理器、内存、串口:

1)尝试加载普通的u-boot,用go运行,不可以执行,卡死在go处
注意,u-boot加载的地址是board目录config.mk文件中定义的
TEXT_BASE = 0x30700000


U-Boot 1.3.3 (Jul 21 2009 - 19:19:37)

DRAM: 32 MB
Flash: 2 MB
NAND: 64 MiB
In:    serial
Out:   serial
Err:   serial
Set the MAC successful!
SEP4020=>tftp 30700000 u-boot.bin
TFTP from server 192.168.0.1; our IP address is 192.168.0.2
Filename 'u-boot.bin'.
Load address: 0x30700000
Loading: ###########################
done
Bytes transferred = 135132 (20fdc hex)
SEP4020=>go 30700000
## Starting application at 0x30700000 ...▲

2)修改代码,C代码应该都是一样的,在哪里运行应该都没有问题,主要是启动时在nor执行的汇编和一些配置文件。
比如上面的0x30700000,编写ram启动的u-boot应该使用其他地址避免冲突,我这选用0x30100000

来看汇编(主要是start.s的内容),对于SEP4020,涉及到4个关键内容:
cpu_init_crit 初始化CPU及串口

lowlevel_init 初始化EMI(主要是SDRAM)

remap 0地址重映射

relocate 从norflash搬运u-boot

3)用u-boot来加载u-boot,以上四个方面可以全部注释掉,因为已经做过了。
加载效果如下,注意看u-boot的编译日期,新的是ram版本的u-boot:
U-Boot 1.3.3 (Jul 21 2009 - 19:19:37)

DRAM: 32 MB
Flash: 2 MB
NAND: 64 MiB
In:    serial
Out:   serial
Err:   serial
Set the MAC successful!
Hit any key to stop autoboot: 0
SEP4020=>tftp 31f00000 u-boot-r.bin
TFTP from server 192.168.0.1; our IP address is 192.168.0.2
Filename 'u-boot-r.bin'.
Load address: 0x30100000
Loading: ###########################
done
Bytes transferred = 134868 (20ed4 hex)
SEP4020=>go 30100000
## Starting application at 0x30100000 ...


U-Boot 1.3.3 (Oct 23 2009 - 10:59:31)

DRAM: 32 MB
Flash: 2 MB
NAND: 64 MiB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot: 0
TFTP from server 192.168.0.1; our IP address is 192.168.0.2
Filename 'zimage'.
Load address: 0x30008000
Loading: *

再启动时网络功能不能使用,因为重复初始化,估计出了问题。


4)下面尝试用JTAG直接加载u-boot,此时汇编中部分内容需要保留。
我首先保留了
cpu_init_crit 初始化CPU及串口
lowlevel_init 初始化EMI(主要是SDRAM)

编译好的u-boot用AXD加载,load memory到30100000出,手动修改pc指针为30100000,go!
发现有问题,调试器死掉了,停不下来。

仔细想想可能是配置SDRAM出了问题,程序本身就在SDRAM运行,此时再去配置EMI的SDRAM控制器,程序就跑飞了。

如果去掉lowlevel_init 初始化EMI(主要是SDRAM),SDRAM不配置只能使用2MB。。不过也勉强可以用(所以地址我用了0x30100000)

最终版本只保留了cpu_init_crit 初始化CPU及串口,用JTAG加载到0x30100000出,手动修改pc指针,go,成功运行。

By the way,网络也可以正常运行,因为前面没有初始化过网络了,可惜可用内存太小,无法加载linux内核。。。。再想办法吧。

U-Boot 1.3.3 (Oct 23 2009 - 10:59:31)

DRAM: 32 MB
Flash: 2 MB
NAND: 64 MiB
In:    serial
Out:   serial
Err:   serial
Set the MAC successful!
SEP4020=>tftp 30008000 zimage
TFTP from server 192.168.0.1; our IP address is 192.168.0.2
Filename 'zimage'.
Load address: 0x30008000
Loading: #################################################################
         #################################################################
         ######################################

相关内容