問題描述:在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命令保存,並重啓開發板。