MCU : ATMEL AT91RM9200 QU
SDRAM : HY57V281620HCT-H 2片(4banks*2M*16bits=16MB,2片组成32M内存空间)
Nor Flash: JS28F128,类似于28F128J3A,不过速度快点。位宽是16bits,容量为16M。
PHY : DM9161E
对U-boot-1.3.0的主要修改:
·修改Makefile的toolchains
·增加了Makefile自动化编译选项: make
·修改nor flash驱动
·修正了lowlevel_init的一个bug,使Uboot启动sdram和flash无关。
这样,固化到flash的0x10000000处,上电后直接启动,boot.bin也就用不到了,Uboot实现非压缩直接启动,速度比以前快的多了。
|
文件: |
u-boot-1.3.0-for-at91rm9200-first.gz |
大小: |
7KB |
下载: |
下载 | |
具体修改见patch。
重点看一处地方,就是关于cpu_init_crit中lowlevel_init的问题。如果是片内启动,首先上载loader.bin,
loader.bin被放到sram里面然后执行,这样lowlevel_init已经处理过一次了。所以在把uboot下载到sdram之后,如果再次
执行则会出现问题。而片外启动的时候,uboot开始在flash中,则必须执行lowlevel_init,设置好sdram工作环境,才能搬移代码到
sdram当中。所以必须要实现sdram和flash无关性。下面通过比较来提出解决方案。
(1)U-boot-1.3.0的实现办法
#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF)
#else bl lowlevel_init #endif
|
可见,它直接把lowlevel_init给屏蔽了。那么你的u-boot.bin就必须在sdram中才可以运行。有两种运行方案:
(I)片内启动,loader.bin+u-boot.bin。这样可以正常启动。
(II)利用片内启动,把boot.bin和u-boot.bin.gz固化在相应位置,即实现压缩方式的uboot启动。
因为boot在初始化完成后,会把uboot.bin解压到sdram中。所以上述两种方式下,本质上uboot的生命周期都在sdram当中。
但是考虑,如果采用非压缩方式,直接把u-boot.bin放在0x10000000处,那么启动显然死掉。
上述都经过实验验证。
(2)我的解决方案
其实很简单,根据上面relocate的代码,首先进行一个判断就可以了。
#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF) adr r0, _start ldr r1, _TEXT_BASE cmp r0, r1 beq 1f #endif bl lowlevel_init 1: mov lr, ip mov pc, lr
|
这样,首先分析,如果在sdram中,那么_start和_TEXT_BASE会相同,这样就不进行lowlevel_init;反之,则进行lowlevel_init。
Loader 1.0 (Nov 29 2007 - 13:41:59)
XMODEM: Download U-BOOT
CCCCCCCC 正在开始 xmodem 传输。 按 Ctrl+C 取消。 正在传输 u-boot.bin... 100% 81 KB 6 KB/s 00:00:12 0 错误
U-Boot downloaded successfully
U-Boot 1.3.0 (Dec 1 2007 - 05:10:12)
U-Boot code: 21F00000 -> 21F14754 BSS: -> 21F31804 RAM Configuration: Bank #0: 20000000 32 MB Flash: 16 MB In: serial Out: serial Err: serial U-Boot> tftpboot 20000000 u-boot.bin TFTP from server 192.168.1.216; our IP address is 192.168.1.100 Filename 'u-boot.bin'. Load address: 0x20000000 Loading: ################# done Bytes transferred = 83796 (14754 hex) U-Boot> protect off 1:0 Un-Protect Flash Sectors 0-0 in Bank # 1 U-Boot> erase 1:0 Erase Flash Sectors 0-0 in Bank # 1 Erasing sector 0 ... done U-Boot> cp.b 20000000 10000000 14754 Copy to Flash.../done U-Boot>
从片外启动 U-Boot 1.3.0 (Dec 1 2007 - 05:10:12)
U-Boot code: 21F00000 -> 21F14754 BSS: -> 21F31804 RAM Configuration: Bank #0: 20000000 32 MB Flash: 16 MB In: serial Out: serial Err: serial U-Boot>
|
经过测试,成功。
但是在使用boot.bin+uboot.bin的片外压缩方式启动时,出现了问题:
*** Warning - bad CRC, using default environment
这在去年遇到过。不过当时不明白原因,只是把那段代码屏蔽掉了。现在明白原因了,其实这是片外启动的remap机制造成的,比较复杂,想就此点展开把
AT91RM9200的remap机制探讨一下,完成一篇经验交流类论文。现在已经完成测试程序,和对uboot的修正。
|
文件: |
u-boot-1.3.0-for-at91rm9200-second.gz |
大小: |
7KB |
下载: |
下载 | |
片外压缩方式启动的patch如下(同样适应片外无压缩启动方式,这是压缩方式无关的代码)。启动信息如下:
Loader 1.0 (Nov 29 2007 - 13:41:59)
XMODEM: Download U-BOOT
CCCCCC 正在开始 xmodem 传输。 按 Ctrl+C 取消。 正在传输 u-boot.bin... 100% 81 KB 6 KB/s 00:00:12 0 错误
U-Boot downloaded successfully
U-Boot 1.3.0 (Dec 1 2007 - 05:10:12)
U-Boot code: 21F00000 -> 21F14754 BSS: -> 21F31804 RAM Configuration: Bank #0: 20000000 32 MB Flash: 16 MB In: serial Out: serial Err: serial U-Boot> tftpboot 20000000 boot.bin TFTP from server 192.168.1.216; our IP address is 192.168.1.100 Filename 'boot.bin'. Load address: 0x20000000 Loading: ### done Bytes transferred = 10504 (2908 hex) U-Boot> protect off 1:0 Un-Protect Flash Sectors 0-0 in Bank # 1 U-Boot> erase 1:0 Erase Flash Sectors 0-0 in Bank # 1 Erasing sector 0 ... done U-Boot> cp.b 20000000 10000000 2908 Copy to Flash.../done U-Boot> tftpboot 20000000 u-boot.bin.gz TFTP from server 192.168.1.216; our IP address is 192.168.1.100 Filename 'u-boot.bin.gz'. Load address: 0x20000000 Loading: ########## done Bytes transferred = 46998 (b796 hex) U-Boot> cp.b 20000000 10010000 b796 Copy to Flash...\done U-Boot> BOOT 1.0 (Nov 28 2007 - 11:51:13)
Uncompressing image...
U-Boot 1.3.0 (Dec 1 2007 - 05:10:12)
U-Boot code: 21F00000 -> 21F14754 BSS: -> 21F31804 RAM Configuration: Bank #0: 20000000 32 MB Flash: 16 MB In: serial Out: serial Err: serial U-Boot>
|
至此,基本移植成功。