参考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) |