本帖最后由 sjtitr 于 2014-7-24 09:26 编辑
搭建开发环境和使用UBOOT【下】
HELPER2416开发板助学计划
接下来是关于UBoot的使用。
根据之前的分析,接下来我们需要集中精力来学习一下UBoot的有关内容。当然了,无论是从Flash启动还是从SD启动,UBoot总是要事先准备好的。其实板子出厂的时候,Flash里已经烧好了UBoot、Kernel和文件系统,所以这部分我们就简单来,直接利用Flash中的UBoot,来通过网络启动我们的kernel和文件系统。如果板子烧成了裸机程序,没有UBoot的话,利用烧写了UBoot的SD卡启动板子也是OK的,而且利用UBoot还可以把UBoot烧写到Flash里,但是这部分内容就不是我们这次的重点,就暂且不展开详解了。
在PC上打开串口工具,然后启动开发板,在看到提示信息的时候随便拍拍键盘,启动过程就暂停了,进入了UBoot的提示符。UBoot可以支持许多的命令,可以用于读写传输数据什么的。
第一件事,能够使UBoot加载NFS中的Kernel。
首先要了解的就是Kernel是怎么被使用起来的。对于我们现在使用UBoot来说,实际上也就是把Kernel文件加载到内存的某个位置,然后跳转过去运行。那么第一件事也就是把NFS的内核文件加载到内存里啦。
准备工作,把/helper2416/boot目录下的zImage.43复制为zImage文件,
接下来需要用到的命令如下:
- nfs c0008000 192.168.168.168:/helper2416/boot/zImage
复制代码
这就是说,把后面NFS网络地址上的文件,加载到内存c0008000的位置上了。
别急,你别看我执行成功了,你执行可能就失败啦,如下信息——
==========================================================
- Helper2416 # nfs c0008000 192.168.168.168:/helper2416/boot/test
smc911x: initializing
smc911x: detected LAN9220 controller
smc911x: phy initialized
smc911x: MAC 00:40:5c:26:0a:5b
File transfer via NFS from server 192.168.168.168; our IP address is 192.168.0.1
Filename '/helper2416/boot/test'.
Load address: 0xc0008000
Loading: *
ARP Retry count exceeded; starting again
==========================================================
为啥呢?因为在加载文件以前,我们还需要正确配置自己的开发板的IP地址。
这就说到另外一个事了,设置参数,也可以认为自定义命令吧。
在UBoot中可以使用set命令或setenv命令设置环境参数和自定义的命令。
那么,废话少说,直接上有营养的,开发板上的UBoot已经设置好了一些参数,我们需要设置开发板的IP地址:
==========================================================
- set ipaddr 192.168.168.100
set netmask 255.255.255.0
set serverip 192.168.168.168
==========================================================
设置完成以后,可以通过print命令或者printenv命令来观察设定值是否正确。
设定OK,这次执行nfs命令吧,应该就成功了吧。
成功以后,执行如下命令,就是跳转到指定位置去运行啦:
但是因为还没有配置文件系统从NFS加载,所以现在跳转还为时过早。
启动内核以前,一定要设置好内核参数。
在UBoot中,去设置bootargs就对啦
对于我们使用君益兴的板子来说,把bootargs设置成这样:
- set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.168.168:/helper2416/rootfs,tcp,nolock,rsize=1024,wsize=1024 rw ip=192.168.168.100 init=/linuxrc
复制代码
里面的重要内容一看就懂咯,控制台输出不用说,就那样设置,根文件系统利用nfs,加载自指定IP的指定路径,稍微有些读写参数,还要设定本机IP和init程序。
好了,有了以上的内容就足够了。所以我们把ipaddr、netmask、serverip、bootargs按照上面设定好,然后再定义一条命令:
- set bootcmd nfs c0008000 192.168.168.168:/helper2416/boot/zImage \; bootm c0008000
复制代码
这样,执行saveenv命令就能把前面的设置都保存到Flash中,以后就不需要每次都设置一遍了。
大功告成,启个动吧!
可是不幸的是,启动过程似乎卡住了。
之后显示
==========================================================
- [31/Dec/1999:16:21:10 +0000] boa: server version Boa/0.94.13
[31/Dec/1999:16:21:10 +0000] boa: server built Mar 26 2009 at 15:28:42.
[31/Dec/1999:16:21:10 +0000] boa: starting server pid=71, port 80
==========================================================
过了好一阵子,最后显示
- nfs: server 192.168.168.168 not responding, still trying
复制代码
好吧,只能一步一步查。不说废话了,以下是我发现的线索……
首先在FC上ping开发板,一开始是通的,到上述LOG boa信息之后就ping不通了,看来是这里的问题……
Boa据说是http服务器,所以观察文件系统中的/etc/init.d/rcS,在httpd启动之后,有两条脚本命令:
==========================================================
- /sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0
==========================================================
不用说,就是ifconfig搞的了,继续,检查这个ifconfig-eth0
检查这个文件,发现里面没什么不对劲的,当然它确实是在设置IP,会导致开发板和NFS的连接断开,但是看起来,从NFS启动的时候应该不会重新设置IP啊。
把脚本中的条件单独拿出来跑一下,原形毕露了,条件判断不正常!
好吧,在网上使劲搜一搜,发现问题根源了。
脚本中的判断
- if grep -q "^/dev/root / nfs " /etc/mtab ; then
复制代码
在我们使用的这个版本已经不好用了,需要修改这一行,变更为:
- if grep -q "root=/dev/nfs" /proc/cmdline ; then
复制代码
从内核参数上来判断,应该是再准确不过了吧,试着改一下。
再次启动,运行平稳,Qt界面也出现了。
这次真是大功告成了。
论坛ID:sjtitr
提交时间:2014.07.23