本文摘自:http://blog.sina.com.cn/s/blog_4a04f11c0100rr38.html
感谢这位博主为我们提供了这么详尽的方法。
首先,从http://ftp.denx.de/pub/u-boot/下载u-boot-2010.06.tar.bz2,解压后用u-boot-2010.06/driver/net中的dm9000x.c和dm9000x.h替换友坚u-boot driver目录下的dm9000x.c和dm9000x.h,并将u-boot-2010.06/include/目录下的dm9000.h拷贝到友坚u-boot include目录下。
其次,修改/include/configs/smdk6410.h,将在函数int eth_initialize(bd_t *bis)
{
#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
miiphy_init();
#endif
#if defined(CONFIG_DRIVER_DM9000)
dm9000_initialize(bis);
#endif
}
最后,按照手册编译生成u-boot-nand.bin文件
实验过程
ubuntu9.04配置tftp
1:在新立得软件包管理器中安装 xinetd, tftpd, tftp.
2:在/etc/xinetd.d/下增加一个文件,名为tftp,内容如下:
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftproot
}
3:进入目录/etc/init.d/中,重新启动xinetd
sudo ./xinetd restart
4:到根目录创建文件夹 /tftproot,并将权限设置为777
sudo mkdir /tftproot
sudo chmod 777 /tftproot
5:将生成的内核镜像zImage拷贝到/tftproot目录下
6:主机ip地址192.168.1.10,开发板地址为192.168.1.20
设置u-boot启动参数
#setenv bootcmd tftp 0xc0008000 zImage\;bootm 0xc0008000
#setenv bootargs "root=/dev/nfs nfsroot=192.168.1.10:/home/yangze/nfs_share ip=192.168.1.20:192.168.1.10:192.168.1.1:255.255.255.0:www.urbetter.com:eth0:off console=ttySAC0,115200"
#saveenv
实验结果
内核能够正常启动,但是缺少文件系统,所以没有太大意义。
OK
我根据下面的方法再修改一下u-boot的环境变量,使之能够在加载完内核镜像之后再挂载上nfs文件系统,具体做法如下:
事先准备:有已经成功在内核上挂载的NFS文件系统,并且开发板已经曾经成功挂载过。
1.在linux主机上正确配置NFS服务后,开启NFS服务。
2.在上面的实验之后,重启/复位开发板,进入u-boot命令行,输入
#setenv bootcmd tftp 0xc0008000 zImage\;nand read 0xc0208000 0x100000 0x3000000\;bootm 0xc0008000
#saveenv
重启/复位开发板,就能够正常启动内核了。并且启动之后会成功挂载NFS
***解释一下,这里首先设置了bootcmd环境变量
bootcmd环境变量用于设置启动时自动加载的命令序列,但该环境变量只有在设置了CONFIG_BOOTDELAY时才会生效,实际上 main_loop()函数只有在CONFIG_BOOTDELAY被定义且大于0时,才会对”bootcmd“进行解析(来自于http://blog.csdn.net/americanfllow/article/details/6867988)
开发板首先使用tftp协议将linux主机上准备的zImage文件下载到0xc0008000处。然后再挂载nfs
(这里不怎么懂,为什么nand read 就是加载nfs呢?0x100000内容处存了什么东西呢?以后懂了再补充,希望知道的人解答下,谢谢。)
注意:0xc0208000是一个起始地址,这个地址应该在kernel之后,我的kernel大小为1fe0a0,我在0xc0008000上加了0x200000。如果后面的起始地址和kernel程序空间有叠加的部分,后果当然是不能正常启动了。