前面幾篇文章,已經(jīng)搞定了Linux移植三巨頭:uboot、kernel(包含dtb)和rootfs,除了uboot是燒寫在SD中的,其它的都是在ubuntu虛擬機(jī)的nfs服務(wù)器中,運(yùn)行時必須通過網(wǎng)絡(luò)將這些文件加載到開發(fā)板的內(nèi)存中運(yùn)行。
本篇就來研究,將這幾個文件打包燒寫到板子的eMMC中,實現(xiàn)嵌入式Linux系統(tǒng)的燒寫,這樣,在沒有網(wǎng)絡(luò)的情況下,板子也可以正常運(yùn)行。系統(tǒng)燒寫使用的是NXP官方的MfgTool工具,通過USB OTG口來燒寫。
1 MfgTool介紹
MfgTool是NXP官方提供的用于燒寫i.MX系列CPU的系統(tǒng)燒寫工具,該軟件需要在Windows環(huán)境下使用。
這是使用正點(diǎn)原子提供的已經(jīng)下載好的NXP燒寫工具:L4.1.15_2.0.0-ga_mfg-tools.tar.gz。
將軟件包解壓,里面還有2個.gz 壓縮包,一個是帶rootfs,一個是不帶rootfs,我們是需要燒寫文件系統(tǒng)的,所以選擇 mfgtools-with-rootfs.tar.gz 這個壓縮包,繼續(xù)解壓。
進(jìn)入目錄 mfgtools-with-rootfs\mfgtools 中, 在此目錄下有幾個文件夾和很多的.vbs 文件:
Profiles文件夾
:要燒寫的文件就放到這個文件夾中。
MfgTool2.exe
:燒寫軟件,但不需要直接打開這個軟件燒寫。
眾多的.vbs 文件
:燒寫配置腳本,指定燒寫的芯片和地址,燒寫的時候通過雙擊這些.vbs文件來打開燒寫工具。因為我的這塊開發(fā)板是EMMC版本的,所以只需要關(guān)注mfgtool2-yocto-mx-evk-emmc.vbs這個vbs文件。
2 MfgTool燒寫步驟
2.1 連接USB OTG
MfgTool是通過USB OTG接口將系統(tǒng)燒寫進(jìn)EMMC中的,我這塊野火板子的OTG接口在板子右側(cè),使用USB線連接電腦(使用USB OTG連接時,需要先把SD卡拔出)。
2.2 切換撥碼開關(guān)模式
將撥碼開關(guān)撥到USB下載模式
撥碼編號 | NAND | EMMC | SD | USB |
---|---|---|---|---|
1 | 0 | 0 | 0 | 1 |
2 | 1 | 1 | 1 | 0 |
3 | 1 | 0 | 0 | x |
4 | 0 | 1 | 0 | x |
5 | 0 | 1 | 1 | x |
6 | 1 | 0 | 0 | x |
7 | 0 | 1 | 0 | x |
8 | 0 | 0 | 1 | x |
連接電源,進(jìn)入USB模式,連接成功后電腦右下角會有提示
2.3 系統(tǒng)燒寫
雙擊“mfgtool2-yocto-mx-evk-emmc.vbs” ,出現(xiàn)如下窗口:
如果出現(xiàn)“符合HID標(biāo)準(zhǔn)的供應(yīng)商定義設(shè)備”就說明連接正常,可以進(jìn)行燒寫。若硬件連接完畢,燒寫文件也配置好了,點(diǎn)擊Start按鈕即可一鍵燒寫。
3 MfgTool燒寫原理
我們需要燒寫uboot、kernel、.dtb 和 rootfs這四個文件,它們一起構(gòu)成了linux系統(tǒng)。
進(jìn)入如下的系統(tǒng)固件目錄中:
L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware
我們重點(diǎn)關(guān)注files、firmware這兩個文件夾,以及ucl2.xml這個文件。
MfgTool燒寫的工作過程主要分兩個階段:
第一階段:MfgTool先通過USB OTG先將firmware目錄中uboot、kernel和.dtb這是三個文件下載到開發(fā)板的DDR內(nèi)存中(注意不需要下載 rootfs),就相當(dāng)于直接在開發(fā)板的內(nèi)存上啟動Linux系統(tǒng)。
第二階段:等Linux 系統(tǒng)啟動以后(這時可以方便的完成對EMMC的格式化、分區(qū)等操作),再向EMMC中燒寫完整的系統(tǒng),包括files目錄中的uboot、linux kernel、.dtb和rootfs這4個文件。
3.1 firmeare文件夾
mfgtools/Profiles/Linux/OS Firmware/firmware文件夾里有很多NXP官方開發(fā)板使用的文件,包括.imx 結(jié)尾的uboot文件、一個zImage鏡像文件、很多.dtb結(jié)尾的設(shè)備樹文件,我們需要注意其中三個文件:
zImage
:NXP官方I.MX6ULL EVK開發(fā)板的Linux鏡像文件
u-boot-imx6ull14x14evk_emmc.imx
:NXP官方I.MX6ULL EVK開發(fā)板的uboot文件
zImage-imx6ull-14x14-evk-emmc.dtb
:NXP 官方I.MX6ULL EVK開發(fā)板的設(shè)備樹
這3個文件即第一階段需要燒寫的文件,如果要燒寫我們的系統(tǒng),就要用自己編譯的文件替換這3個文件。
3.2 files文件夾
mfgtools/Profiles/Linux/OS Firmware/files目錄中的文件和firmware 目錄中的基本差不多,這里就要注意下面4個文件
zImage
:同上
u-boot-imx6ull14x14evk_emmc.imx
:同上
zImage-imx6ull-14x14-evk-emmc.dtb
:同上
rootfs_nogpu.tar.bz2
:根文件系統(tǒng)(nogpu表示不包含GPU的內(nèi)容)
這4個文件即第二階段需要燒寫的文件,如果要燒寫我們的系統(tǒng),就要用自己編譯的文件替換這4個文件。
3.3 ucl2.xml文件
mfgtools/Profiles/Linux/OS Firmware/ucl2.xml是一種XML格式的文件,用來指定files和firmware目錄要燒寫的uboot和設(shè)備樹文件。
ucl2.xml 以 “” 開始, 以 “” 結(jié)束。 “”和“”之間是配置相關(guān)內(nèi)容,“”和“”之間的是針對不同存儲芯片的燒寫命令。
ucl2.xml文件有600多行,這里抽取主干結(jié)構(gòu)來看一個該文件的主要運(yùn)行流程:
Loading U-bootLoading Kernel.Loading Initramfs.Loading device tree. Jumping to OS image.
ucl2.xml 首先會判斷當(dāng)前要向I.MX系列的哪個型號的芯片燒寫系統(tǒng):
通過讀取芯片的VID和PID,即可判斷要燒什么處理器的系統(tǒng), 如VID=0X15A2,PID=0080,就表示要給I.MX6ULL燒寫系統(tǒng)。
3.4 xxx.vbs文件
ucl2.xml文件中確定了要燒寫的處理器型號以后,還要確定向什么存儲設(shè)備燒寫系統(tǒng),這是在mfgtools/mfgtool2-yocto-mx-evk-emmc.vbs中配置,右鍵,用文本編輯器打開這個文件(不要雙擊哦):
Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""eMMC"" -s ""board=sabresd"" -s ""mmc=1"" -s ""6uluboot=14x14evk"" -s ""6uldtb=14x14-evk"""
Set wshShell = Nothing
注意“wshShell.run”這一行,調(diào)用了 mfgtool2.exe 這個軟件,還給出了一堆的參數(shù),包含“eMMC”字樣,表示是向 EMMC 燒寫系統(tǒng)
下面繼續(xù)分析ucl2.xml文件中的燒寫過程
前面說了燒寫分兩個階段, 第一步是通過 USB OTG 向 DDR中下載系統(tǒng),第二步才是正常的燒寫。
根據(jù)當(dāng)前是EMMC的板子,第1步燒寫uboot的命令如下:
Loading U-boot
“file” 表示要下載的文件位置:
firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx
“%lite%”
和“%6uluboot%”
分別表示取lite和6uluboot的值, 那lite和6uluboot的值是多少呢?在cfg.ini文件中有定義。
3.5 cfg.ini文件
mfgtools/cfg.ini文件是一個配置文件,內(nèi)容如下:
[profiles]
chip = Linux
[platform]
board = SabreSD
[LIST]
name = SDCard
[variable]
board = sabresd
mmc = 0
sxuboot=sabresd
sxdtb=sdb
7duboot=sabresd
7ddtb=sdb
6uluboot=14x14ddr3arm2
6uldtb=14x14-ddr3-arm2
6ulldtb=14x14-ddr3-arm2
ldo=
plus=
lite=l
initramfs=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
seek = 1
sxnor=qspi2
7dnor=qspi1
6ulnor=qspi1
nor_part=0
可以看到,lite=l,6uluboot=14x14evk。
繼續(xù)分析ucl2.xml文件中的燒寫過程,將lite和6uluboot的值代入以后,要燒寫的uboot文件名就是:
firmware/u-boot-imx6ull14x14evk _emmc.imx
同樣的方法將.dtb(設(shè)備樹)和zImage都下載到DDR中以后就會跳轉(zhuǎn)去運(yùn)行OS,這個時候會在MfgTool工具中會有“Jumping to OS image”提示語句,ucl2.xml中的跳轉(zhuǎn)命令如下:
Jumping to OS image.
啟動Linux系統(tǒng)以后就可以在EMMC上創(chuàng)建分區(qū),然后燒寫uboot、zImage、.dtb(設(shè)備樹)和根文件系統(tǒng)。
4 系統(tǒng)燒寫實踐
4.1 燒寫NXP官方系統(tǒng)
因為我的板子是512MB的DDR3+8G的EMMC,與NXP官方開發(fā)板類似,可以先試著燒寫NX官方的系統(tǒng),熟悉燒寫流程:
撥碼開關(guān)撥到USB模式,拔出SD卡,連接USB
板子上電,連接串口(用于查看具體的下載信息)
按下開發(fā)板復(fù)位按鍵。
雙擊打開“mfgtool2-yocto-mx-evk-emmc.vbs” ,確認(rèn)出現(xiàn)“符合 HID 標(biāo)準(zhǔn)的供應(yīng)商定義設(shè)備”等字樣,點(diǎn)擊Start按鈕。
注:燒錄開始時,會彈出大容量存儲器之類的窗口,并會出現(xiàn)短暫的No Device Connet的提示,不用理會。
注:官方的系統(tǒng)文件較大,燒錄時間較長。另外,若燒錄失敗,串口也沒打印信息,我剛開始就遇到了這種情況,然后我用野火提供的軟件包(系統(tǒng)文件比較小,燒錄在1分鐘左右)燒錄成功后,再回過頭來繼續(xù)燒錄NXP官方的就有串口輸出信息了。
我的板子燒錄官方系統(tǒng)時,不知什么原因一直燒錄不成功,如下圖,因為用不到官方的系統(tǒng),就先不管它,有時間再查。
4.2 燒寫自己的系統(tǒng)
準(zhǔn)備要燒寫的文件:
自己移植編譯出來的uboot文件:u-boot.imx(位于u-boot源碼主目錄中)
自己移植編譯出來的zImage鏡像文件(位于Kernel源碼的arch/arm/boot目錄中)和開發(fā)板對應(yīng)的.dtb(設(shè)備樹)mx6ull-myboard.dtb(位于Kernel源碼的arch/arm/boot/dts目錄中)
自己構(gòu)建的根文件系統(tǒng)rootfs
rootfs需要先打包成rootfs.tar.bz2,進(jìn)入Ubuntu中的nfs目錄下的rootfs目錄,使用tar命令打包:
cd rootfs/
tar -vcjf rootfs.tar.bz2 *
將這4個文件復(fù)制到Windows系統(tǒng)中準(zhǔn)備燒錄。
總結(jié)一下要準(zhǔn)備的文件,如下圖:
燒寫時,這里有兩種修改方式進(jìn)行燒寫,一種是將自己的4個文件按照NXP官方的文件進(jìn)行重命名,并替換掉官網(wǎng)的文件,即可直接燒錄。另一種是改造MfgTool燒寫工具,使得該燒寫工具能夠兼容自己板子的文件名。因為第2種修改比較麻煩,先使用第1種簡單的方式進(jìn)行燒寫,只需要修改文件名即可。
需要替換的名稱為:
原名稱 | 修改替換的名稱 |
---|---|
u-boot.imx | u-boot-imx6ull14x14evk_emmc.imx |
zImage | zImage(不需要重命名) |
imx6ull-myboard.dtb | zImage-imx6ull-14x14-evk-emmc.dtb |
rootfs.tar.bz2 | rootfs_nogpu.tar.bz2 |
點(diǎn)擊Start開始燒寫,等待燒寫完成:
燒錄完,點(diǎn)擊Stop退出即可。
然后切換板子為EMMC啟動,復(fù)位重啟開發(fā)板,正常情況下應(yīng)該就可以看到燒錄的系統(tǒng)正常啟動了。
但是,我這里出現(xiàn)了一點(diǎn)小差錯。
4.3 解決內(nèi)核無法啟動的錯誤
在燒錄完系統(tǒng),切換到EMMC啟動時,我板子的內(nèi)核沒有運(yùn)行起來,提示“MMC:no card present”的錯誤:
好像是EMMC沒有找到,就無法啟動內(nèi)核。
網(wǎng)上查找相關(guān)問題,根據(jù)這篇:https://blog.csdn.net/qq_43605009/article/details/113646312的描述,應(yīng)該是uboot的里一個配置項搞錯了,就是這里:
我們的defconfig配置文件中,第一行最后那個不需要改,要改回默認(rèn)的MX6ULL_EVK_EMMC_REWORK,改完,重新編譯uboot生成u-boot.imx,再次進(jìn)行燒錄就能正常啟動內(nèi)核了。(這里的MX6ULL_EVK_EMMC_REWORK的具體作用我還沒搞明白,有時間再研究)
正常啟動后,就可以看到和之前使用nfs網(wǎng)絡(luò)方式啟動一樣的效果了:
4.4 解決網(wǎng)絡(luò)沒有啟動的問題
板子插上網(wǎng)線,使用ifconfig命令查看網(wǎng)絡(luò)信息,發(fā)現(xiàn)沒有連接網(wǎng)絡(luò),這是因為板子的網(wǎng)絡(luò)功能沒有打開。之前使用nfs掛載根文件系統(tǒng)的時候因為要使用nfs服務(wù),Linux內(nèi)核會打開eth0這個網(wǎng)卡,現(xiàn)在我們不使用nfs掛載根文件系統(tǒng), Linux內(nèi)核就沒有自動打開eth 網(wǎng)卡。
我們可以手動打開,以打開eth1網(wǎng)卡為例,輸入如下命令打開 eth1:
ifconfig eth1 up
然后可以為板子分配IP:
ifconfig eth1 192.168.5.108 netmask 255.255.255.0 //設(shè)置 IP 地址和子網(wǎng)掩碼
route add default gw 192.168.5.1 //添加默認(rèn)網(wǎng)關(guān)
目前這種手動修改的方式,每次開機(jī)以后就沒有了,還需要重新設(shè)置??梢詫⒃O(shè)置網(wǎng)卡IP地址的命令添加到/etc/init.d/rcS開機(jī)啟動文件中,添加如下內(nèi)容:
#config eth1
ifconfig eth1 up
ifconfig eth1 192.168.5.108 netmask 255.255.255.0
route add default gw 192.168.5.1
然后保存,reboot命令重啟開發(fā)板,重啟后就自動連上網(wǎng)了。
5 總結(jié)
本篇主要介紹了Linux移植的系統(tǒng)打包燒錄的EMMC的方法,使用MfgTool工具,將uboot、linux kernel、.dtb和rootfs這4個文件燒寫到板子的EMMC中。燒錄過程中,發(fā)現(xiàn)了之前修改uboot配置時的一個問題,導(dǎo)致內(nèi)核無法啟動,修改后可以正常啟動。另外,還修改開機(jī)啟動文件,使得網(wǎng)絡(luò)能夠開機(jī)自動連接。
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5060文章
18976瀏覽量
302220 -
Linux
+關(guān)注
關(guān)注
87文章
11213瀏覽量
208736 -
文件
+關(guān)注
關(guān)注
1文章
561瀏覽量
24675
發(fā)布評論請先 登錄
相關(guān)推薦
評論