问题描述:在MCIMX6DL_SDP上实现网络文件挂载,要求从emmc中启动uboot和kernel,从网络上挂载根文件系统。
操作平台:
host :Ubuntu14.04LTS
board:MCIMX6DL_SDP
在开始下列操作之前,请确保你已在host上正确安装了NFS服务器,并启动了NFS服务,以及你所编译的kernel是支持NFS的,同时要注意你的主机应该能够ping通你的开发板!除此之外,确保你的内核的ip地址与你的uboot中设置的ip地址一致!
1、添加uboot环境变量:
设置板子ip地址:
setenvipaddr 192.168.xx.xx
设置nfs的服务器地址:
setenvserverip 192.168.xx.xx
设置子网掩码:
setenvnetmask 255.255.0.0
设置网卡设备:
setenvnetdev eth0
设置nfsroot:
setenvnfsroot /opt/rootfs
uboot启动时相关命令bootcmd的分析:(为了方便查看,我已将命令进行了缩进)
boot_fdt=try
ip_dyn=yes
bootcmd=mmc dev 2;
if mmc rescan;
then
if run loadbootscript;
then
run bootscript;
elseif
run loadimage;
then
run mmcboot;
else
run netboot;
fi;
fi;
else
run netboot;
fi
对bootcmd的分析:
在uboot启动后,首先会去执行bootcmd的命令。通过对uboot启动时打印的信息结合boot_cmd命令进行判断,可以知道uboot启动过程中所执行的bootcmd的顺序为:
mmcdev 2 --> mmc rescan --> runloadbootscript -->run loadimage --> run mmcboot
在这个过程中:
mmc dev 2 //设置mmc设备号及当前分区
mmc rescan //重新搜索mmc设备
run loadbootscript(fatloadmmc 2:1 0x12000000 boot.scr ) //将boot.scr下载到0x12000000
run loadimage(fatloadmmc 2:1 0x12000000 zImage) //将mmc中的zImage下载到0x12000000地址中
run mmcboot //运行从mmc中启动的命令
mmcboot命令如下:
mmcargs=setenvbootargs console=${console},${baudrate} ${smp} root=${mmcroot}
loadfdt=fatloadmmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}
mmcboot=echoBooting from mmc ...; run mmcargs;
if test ${boot_fdt} = yes || test ${boot_fdt} = try;
then
if run loadfdt;
then
bootz0x12000000 - 0x18000000;
elseif test ${boot_fdt} = try;
then
bootz;
else
echo WARN: Cannot load the DT;
fi;
fi;
else
bootz;
fi;
通过对mmcboot命令进行分析可知,该命令的执行顺序为:
echoBooting form mmc... --> run mmcargs --> run loadfdt -->bootz 0x12000000 – 0x18000000
在这个过程中,重要的是mmcargs,loadfdt以及bootz这三个地方
run mmcargs //设置启动参数,包括控制台,波特率,以及根文件系统的启动方式(从mmc中启动)
run loadfdt //将imx6dl-sabresd.dtb加载到地址0x18000000,
bootz 0x12000000-0x18000000 //启动内核
完成了对上述两个变量的分析,挂载nfs网络文件系统的任务就完成了一半了。借下来只要按照类似的格式,添加对网络文件系统的支持,并在bootcmd命令中对其进行实现即可。
设置挂载网络文件系统:
setenvbootcmd_nfs 'setenv bootargs console=ttymxc0,115200 root=/dev/nfsip=${ipaddr} nfsroot=${serverip}:${nfsroot}'
修改bootcmd命令:
setenvbootcmd 'mmc dev 2;run loadimage;run bootcmd_nfs;run loadfdt;bootz0x12000000-0x1800000000'
添加完成后使用saveenv命令保存,并重启开发板。