从周一到现在一直在弄uboot,中间出了各种各样的问题,在这里总结一下:
第一阶段:首先是uboot移植nand功能的时候,因为nand基址设置的问题,导致uboot从nand复制自身到sdram时不能运行,主要是编译的基址,和加载到sdram中的地址不对齐的问题,最后改正后能够启动并打印启动信息了。
第二阶段:nand能够启动了,但是没有nand读写的命令,最后在打开nand命令宏定义,能够实现nand的读写操作了,但是在写环境变量的时候不能正确的写入,提示是写入到flash中了,最后经过查各种资料,发现smdk2410.h头文件中定义了环境变量保存在flash中,通过查找环境变量相关的实现代码,发现只要定义使用nand保存环境变量的宏定义就可以了,最后打开后,又出问题了,烧进去命令没有了,通过在find命令函数中设置输出信息,发现命令没有了,想到可能是sdram地址空间分配的问题,最后在晚上的时候风琦说换个编译器试试,最后使用4.3.2编译居然成功了,可能是不同编译器对链接地址的解析不同导致的。
第三阶段:移植网卡驱动的时候也走了一些弯路,最后没办法从uboot2010.06.tar.bz2中拷贝的网卡驱动的代码,修改了函数接口以使符合uboot1.3.2的定义,然后修改了初始化代码,使其调用网卡的初始化函数,但是通过和博创给的uboot启动信息对比,发现MAC地址没有输出,看到驱动中有读取MAC的代码,但是读取失败,最后发现smdk2410并没有使用网卡的EEPROM,不能读取网卡MAC,最后只能手动设置MAC地址,然后写入到网卡MAC寄存器中,最后移植成功。
第四阶段:uboot能够正常使用了,但是测试加载内核的时候,发现不能挂在文件系统,想可能是不能传递参数,研究代码发现必须打开cmdline宏定义,才能去查找bootargs环境变量,但是打开后发现,命令列表又没了,地址空间又冲突了,想想是不是编译器版本又不对了,换了编译器版本编译使发现不能编译成功,以为是uboot会记录编译器信息,由于不知道怎么删除(现在发现只要使用make distclean就OK了),所以最后重新从0开始移植,
今天从网上看了一篇文章,找到了传递参数的方法,uboot和内核通过tag结构体传递参数,启动内核的时候uboot要把tag结构体首地址传给内核,同时宏定义必须打开mem相关的宏,tag结构体的地址也不能随便定义,最后使用的是0x3000000,至今没有搞明白为什么。
总结:
经过五天的奋战,uboot终于能够顺利的跑起来了,并且比博创给的uboot要小,中间太多的辛酸,想过放弃,但最后因为对于技术的热爱,还是没有放弃,本来明天考四级,想学英语呢,可是因为没有移植成功,睡觉的时候也移植在debug,还好,功夫没有白费。下一阶段移植内核。争取在一个月的时候把亚嵌的结业项目数码相框做出来。