Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2050408
  • 博文数量: 610
  • 博客积分: 11499
  • 博客等级: 上将
  • 技术积分: 5511
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-12 19:27
文章分类

全部博文(610)

文章存档

2016年(5)

2015年(18)

2014年(12)

2013年(16)

2012年(297)

2011年(45)

2010年(37)

2009年(79)

2008年(101)

分类: LINUX

2008-03-22 13:35:29

AT91RM9200开发笔记(3):U-boot-1.3.0移植成功


文章说明:calmarrow(lqm)原创

文章引自:http://piaoxiang.cublog.cn

 
    参考我在2006年所做的工作http://blog.chinaunix.net/u/21948/showart_153570.html,很容易移植到新的板子上。因为现在主要是验证核心板性能,所以外设不多,移植工作也就不错了。资源如下:
 
    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>

    至此,基本移植成功。

发表于: 2007-12-01,修改于: 2007-12-11 14:19,已浏览860次,有评论1条 推荐 投诉





网友评论

网友: calmarrow 时间:2007-12-03 14:44:22 IP地址:122.4.33.★



   1、 在使用codesourcery的Gnu工具链编译U-boot-1.3.0时总是出现“warning: target CPU does not support interworking”,要想消除此项warning,采取的办法是:把cpu/arm920t/config.mk下PLATFORM_CPPFLAGS += -march=armv4 更改为PLATFORM_CPPFLAGS += -march=armv4t。

    2、修正了board/at91rm9200dk/flash.c下的一个小bug。

317: *addr = (FPW) 0x00500050;

318: *addr = (FPW) 0x00FF00FF;

    3、根据自己虚拟机的使用,修改Makefile,更加方便些。
阅读(2253) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~