博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

CalmArrow

【打好基础】全力以赴,顺其自然【每天进步一点点】
  piaoxiang.cublog.cn

关于作者
姓名:CalmArrow(lqm)
职业:硕士在读
位置:山东济南
研究:嵌入式系统设计
联系:calmarrow@gmail.com

信仰:
    1、永远保持积极向上(积极的心态,积极的思考,积极的行动),享受生活给予的一切!
    2、做正确的事,正确的做事;用心去做,做到最好!
    3、如果你觉得不幸福,那么请你把幸福的门槛降低一些,不要把幸福拒之门外。。。

目标:
    软硬结合,打好基础,提高学习能力,完善知识体系,建立核心优势。

方法:
    理论与实践相结合
    深度与广度相结合
    理解与记忆相结合

说明:
    本Blog仅供学习之用,转载文章如涉及版权,请通知。原创作品如转载,请注明出处。
|| << >> ||
我的分类


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 <your board>
    ·修改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,已浏览2005次,有评论3条 推荐 投诉


网友评论
网友: 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,更加方便些。

网友: piaoxiang 时间:2008-03-27 17:45:38 IP地址:122.4.33.★
28f128j3a出现第0扇区erase之后,当cp仍然会出现未擦除的信息。以前没有遇到过这种情况。解决方法:tftp 10000000 u-boot.bin;然后protect off 1:0;erase 1:0。这样再烧写就解决了。应该还是驱动的问题。等后面查看代码的时候再研究。

网友: 本站网友 时间:2008-04-20 12:43:59 IP地址:58.213.113.★
*** Warning - bad CRC, using default environment
这是第一次初始化环境变量引起的,正常的,你设置过环境变量并保存后,CRC就正确了,以后就不会出现这个警告了。个人认为。

Blog作者的回复:
如果你采用boot.bin+u-boot.bin.gz来引导,你才能明白这个现象到底是怎么回事。你说的保存环境变量,消除warning这个是没有必要写技术总结的。


 发表评论