Chinaunix首页 | 论坛 | 博客
  • 博客访问: 196098
  • 博文数量: 30
  • 博客积分: 1571
  • 博客等级: 上尉
  • 技术积分: 363
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-28 11:42
文章分类

全部博文(30)

文章存档

2012年(6)

2011年(11)

2010年(13)

我的朋友

分类: LINUX

2010-03-23 15:21:41

参考smdk6400进行的移植。
u-boot-2009.11直接就支持 6410的nand flash启动。nand、DM9000A都是直接使用里面的驱动就可以了。感觉还是挺顺的。

时间比较长了,感觉当时遇到的问题主要就是gcc优化的问题和栈的问题。
u-boot-2009.11 6410主要有两部分:u-boot和nand启动的代码。编译完成后的u-boot-nand.bin好像就是 nand_spl的u-boot-spl-16k.bin 和 u-boot的u-boot.bin直接cat就OK了。

nand启动的代码在nand_spl文件夹里面。其实主要就是 start.s、lowlevel.s等几个初始化文件、nand的驱动 s3c64xx.c、nand_ecc.c和 nand启动的nand_boot.c。初始化文件和nand的驱动都是直接链接到u-boot中的相应文件。
出的几个问题都和这个有关系。
1、start.s 里面设置stack的代码如下:
stack_setup:
#ifdef CONFIG_MEMORY_UPPER_CODE
    ldr    sp, =(CONFIG_SYS_UBOOT_BASE + CONFIG_SYS_UBOOT_SIZE - 0xc)
#else
    ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */     
    sub    r0, r0, #CONFIG_SYS_MALLOC_LEN    /* malloc area                      */
    sub    r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo                        */
    sub    sp, r0, #12        /* leave 3 words for abort-stack    */

#endif
我没有定义CONFIG_MEMORY_UPPER_CODE,结果压根跑不了!
仔细看了一下,问题是出在:
    ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */ 
在u-boot里面,_TEXT_BASE = $(RAM_TEXT),也就是0x57e0000。
但是在nand_spl里面TEXT_BASE=0!
最后我改成:
    ldr    r0, =(CONFIG_SYS_UBOOT_BASE)

2、后来串口有输出了,但运行到nand初始化或者初始化环境变量的时候整个系统就挂了。
郁闷了好长时间。
最后用j-link连上以后发现,有的时候既然运行到一个全局变量的地址上去了!
开始怀疑编译器的问题。发现 u-boot 编译的时候使用了 -Os 的优化。然后就将此优化关掉(在根目录的config.mk中加的)。结果还是运行不了!
后来才发现,没有-Os的优化,u-boot-spl-16k.bin超过4K的了。没办法最后在 nand-spl的makefile又加上了 -Os的选项。
最终能跑了!我可不想去追究为啥了。
阅读(2934) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~