转载地址:https://blog.youkuaiyun.com/Phoenix500526/article/details/51182164
问题描述:在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命令保存,并重启开发板。