Linux环境: Ubuntu 11.10
交叉编译工具:arm-linux-gcc4.3.2
目标板:mini2440 Flash 256M
u-boot源代码:由友善之臂提供,基于1.1.6版本修改后的FriendlyARM修改过的U-Boot.1.1.6
下载在Linux公社的1号FTP服务器里,下载地址:
FTP地址:ftp://www.linuxidc.com
用户名:www.linuxidc.com
密码:www.muu.cc
在 2011年LinuxIDC.com12月Android_sdk_linux_x86.tar.gz 下载
下载方法见 http://www.linuxidc.net/thread-1187-1-1.html
下面马上进入我们的编译之旅!
1、解压缩源码包
tar zxvf u-boot-1.1.6-FA24x0.tar.gz
2、make clean
这时候将会出现第一个问题:
/bin/sh: lex: command not found
解决方法可以参见:Linux命令make报错总结 见 http://www.linuxidc.com/Linux/2011-12/50152.htm
3、make open24x0_config
配置板子资源
Configuring for open24x0 board...
4、删除Makefile.l文件,否则make的时候会出现一些错误
5、make
编译出现错误:
undefined reference to ‘raise’
解决方法参见:undefined reference to ‘raise’ 见 http://www.linuxidc.com/Linux/2011-12/50151.htm
之后编译还是会出现问题。通过找查找论坛资料,一位网友提出make distclean可以解决问题!
make distclean
make open24x0_config
make
6、编译成功
7、在display_banner()函数里面加入自己的一些调试显示信息
printf("###Hello u-boot!My name is care###n");
8、再次编译u-boot
9、将u-boot.bin烧写到板子的0x33000000地址上
10、复位一下板子,通过超级终端可以看到调试信息
###hello u-boot!My name is care###
大功告成。
最近公司忙着赶项目,我负责的是之前没有接触过的u-boot 。浪费了3天时间,都是在做无用功。主要的原因是切入点不对,3天的时间主要都用来跟着网上的高手移植u-boot。对于源码的阅读反而不是很多。看到了一篇文章(http://www.linuxidc.com/Linux/2011-12/50150p2.htm),描述了作者初学u-boot的心得。很有体会,在此附上连接。希望对和我一样的bootloader初学者能有帮助。
新手移植u-boot的一些建议
经过将近两个星期的时间,总算移植好了一个勉强能支持基本功能的u-boot了,泪流满面。在刚刚开始移植uboot时走了很多弯路,不过坚持下来,也算是苦中有乐!
一开始我是照着友善的移植Uboot手册上改代码,虽然也看了前半部分的uboot执行流程,但是到了改代码的时候还是很多东西不懂,就照着做,出现各种编译错误,慢慢改,一路下来,最后满怀期待的上电,超级终端里却无我所期待的字样。因为对很多代码不懂,也不知道到底是哪里出了错,甚是迷茫。
经过几次的尝试,还是没有得到最后想要的结果,几乎就要放弃。冷静下来,好好想了想,觉得自己的方法就不对,于是从头再把uboot的执行流程重新仔细学了一遍,大家在学start.S这个文件时基本不会有什么问题,建议大家可以在这个文件下先不用实现nand flash相关部分代码,只要能实现将代码从nor flash搬运即可(其实从nor flash搬运到sdram相关代码Uboot源码已经实现,就是relocate标号),关键的是跳转到lib_arm/board.c这个文件里的函数后就不知道是什么情况了,其实它就是执行一系列的初始化,每个函数基本初始化一个相应的部分,而且这些函数能不能执行都是由我们在include/configs/mini2440.h这个头文件中定义的所有宏来决定的,因此我根据自己的经历建议大家在确保start.S这个文件正确执行的前提下先使得我们自己的uboot执行board_init这个函数,这个函数里的一些修改比较简单,能运行后再使我们的serial_init函数能运行正确,其余board.c下面的很多初始化的函数的不用管,都给注释掉。因为这样,我们的Uboot如果能运行正确的话,我们是可以在串口看到一些相应的基本信息,这样就有助于我们的观察了,就算以后加入什么功能,哪里出了问题,我们也可以用printf输出到串口进行观察。
接下来就是一步步完善uboot功能的时刻了,大家可以根据自己实际的需求去增加一些功能,其实主要就是一些初始化(主要在比如实现从nand flash里面启动,这个你可以照着友善的手册(而且使用他们的nand_read.c这个文件);又比如你要实现网络,在mini2440.h里面增加dm9000相关的宏,然后在board.c里面将cs8900相关初始化的代码更换成dm9000的代码,uboot支持dm9000驱动,所以比较简单,当然,完善Uboot的功能可以照着友善移植uboot手册,关键是要理解相关宏的作用。
如果这样坚持下来,相信你对Uboot的执行流程会有一个真正比较深刻的理解,还是这个道理,从简单过渡到复杂,最后移植完成后最好回头把相关的部分重新温习一下,这样相信以后就算我们在工作中遇到新的板子,我们应该也会知道从哪里开始,怎么去深入。