您的位置:首页 > 其它

mini2440 编译U-Boot-1.1.6遇到的一些问题

2012-07-22 23:19 337 查看
新手移植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的执行流程会有一个真正比较深刻的理解,还是这个道理,从简单过渡到复杂,最后移植完成后最好回头把相关的部分重新温习一下,这样相信以后就算我们在工作中遇到新的板子,我们应该也会知道从哪里开始,怎么去深入。

当然,这只是我的一些个人建议,每个人都有各自不同的体会,还望大家一起交流。

本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-12/50150p2.htm

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服务器里,下载地址:

[align=center][/align]
FTP地址:ftp://www.linuxidc.com

用户名:www.linuxidc.com

密码:www.muu.cc

在 2011年LinuxIDC.com\12月\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初学者能有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: