前面幾篇文章,已經搞定了Linux移植三巨頭:uboot、kernel(包含dtb)和rootfs,除了uboot是燒寫在SD中的,其它的都是在ubuntu虛擬機的nfs服務器中,運行時必須通過網絡將這些文件加載到開發板的內存中運行。
本篇就來研究,將這幾個文件打包燒寫到板子的eMMC中,實現嵌入式Linux系統的燒寫,這樣,在沒有網絡的情況下,板子也可以正常運行。系統燒寫使用的是NXP官方的MfgTool工具,通過USB OTG口來燒寫。
1 MfgTool介紹
MfgTool是NXP官方提供的用于燒寫i.MX系列CPU的系統燒寫工具,該軟件需要在Windows環境下使用。
這是使用正點原子提供的已經下載好的NXP燒寫工具:L4.1.15_2.0.0-ga_mfg-tools.tar.gz。
將軟件包解壓,里面還有2個.gz 壓縮包,一個是帶rootfs,一個是不帶rootfs,我們是需要燒寫文件系統的,所以選擇 mfgtools-with-rootfs.tar.gz 這個壓縮包,繼續解壓。
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/4C/poYBAGIx_KSAB1ywAAA7j1xsTno493.png)
進入目錄 mfgtools-with-rootfs\mfgtools 中, 在此目錄下有幾個文件夾和很多的.vbs 文件:
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/52/pYYBAGIx_KmAFlWyAACxmtrMP68488.png)
Profiles文件夾
:要燒寫的文件就放到這個文件夾中。
MfgTool2.exe
:燒寫軟件,但不需要直接打開這個軟件燒寫。
眾多的.vbs 文件
:燒寫配置腳本,指定燒寫的芯片和地址,燒寫的時候通過雙擊這些.vbs文件來打開燒寫工具。因為我的這塊開發板是EMMC版本的,所以只需要關注mfgtool2-yocto-mx-evk-emmc.vbs這個vbs文件。
2 MfgTool燒寫步驟
2.1 連接USB OTG
MfgTool是通過USB OTG接口將系統燒寫進EMMC中的,我這塊野火板子的OTG接口在板子右側,使用USB線連接電腦(使用USB OTG連接時,需要先把SD卡拔出)。
2.2 切換撥碼開關模式
將撥碼開關撥到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 |
連接電源,進入USB模式,連接成功后電腦右下角會有提示
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/52/pYYBAGIx_LWAMa6FAAI5jtvGkTA232.png)
2.3 系統燒寫
雙擊“mfgtool2-yocto-mx-evk-emmc.vbs” ,出現如下窗口:
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/52/pYYBAGIx_LqALS31AABwlcauHNc381.png)
如果出現“符合HID標準的供應商定義設備”就說明連接正常,可以進行燒寫。若硬件連接完畢,燒寫文件也配置好了,點擊Start按鈕即可一鍵燒寫。
3 MfgTool燒寫原理
我們需要燒寫uboot、kernel、.dtb 和 rootfs這四個文件,它們一起構成了linux系統。
進入如下的系統固件目錄中:
L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/4C/poYBAGIx_MKAIzcXAABG9Mx2bIo118.png)
我們重點關注files、firmware這兩個文件夾,以及ucl2.xml這個文件。
MfgTool燒寫的工作過程主要分兩個階段:
第一階段:MfgTool先通過USB OTG先將firmware目錄中uboot、kernel和.dtb這是三個文件下載到開發板的DDR內存中(注意不需要下載 rootfs),就相當于直接在開發板的內存上啟動Linux系統。
第二階段:等Linux 系統啟動以后(這時可以方便的完成對EMMC的格式化、分區等操作),再向EMMC中燒寫完整的系統,包括files目錄中的uboot、linux kernel、.dtb和rootfs這4個文件。
3.1 firmeare文件夾
mfgtools/Profiles/Linux/OS Firmware/firmware文件夾里有很多NXP官方開發板使用的文件,包括.imx 結尾的uboot文件、一個zImage鏡像文件、很多.dtb結尾的設備樹文件,我們需要注意其中三個文件:
zImage
:NXP官方I.MX6ULL EVK開發板的Linux鏡像文件
u-boot-imx6ull14x14evk_emmc.imx
:NXP官方I.MX6ULL EVK開發板的uboot文件
zImage-imx6ull-14x14-evk-emmc.dtb
:NXP 官方I.MX6ULL EVK開發板的設備樹
這3個文件即第一階段需要燒寫的文件,如果要燒寫我們的系統,就要用自己編譯的文件替換這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
:根文件系統(nogpu表示不包含GPU的內容)
這4個文件即第二階段需要燒寫的文件,如果要燒寫我們的系統,就要用自己編譯的文件替換這4個文件。
3.3 ucl2.xml文件
mfgtools/Profiles/Linux/OS Firmware/ucl2.xml是一種XML格式的文件,用來指定files和firmware目錄要燒寫的uboot和設備樹文件。
ucl2.xml 以 “” 開始, 以 “” 結束。 “”和“”之間是配置相關內容,“”和“”之間的是針對不同存儲芯片的燒寫命令。
ucl2.xml文件有600多行,這里抽取主干結構來看一個該文件的主要運行流程:
Loading U-bootLoading Kernel.Loading Initramfs.Loading device tree. Jumping to OS image.
ucl2.xml 首先會判斷當前要向I.MX系列的哪個型號的芯片燒寫系統:
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/52/pYYBAGIx_MuAOwiVAAByP0e1xsA226.png)
通過讀取芯片的VID和PID,即可判斷要燒什么處理器的系統, 如VID=0X15A2,PID=0080,就表示要給I.MX6ULL燒寫系統。
3.4 xxx.vbs文件
ucl2.xml文件中確定了要燒寫的處理器型號以后,還要確定向什么存儲設備燒寫系統,這是在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”這一行,調用了 mfgtool2.exe 這個軟件,還給出了一堆的參數,包含“eMMC”字樣,表示是向 EMMC 燒寫系統
下面繼續分析ucl2.xml文件中的燒寫過程
前面說了燒寫分兩個階段, 第一步是通過 USB OTG 向 DDR中下載系統,第二步才是正常的燒寫。
根據當前是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文件是一個配置文件,內容如下:
[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。
繼續分析ucl2.xml文件中的燒寫過程,將lite和6uluboot的值代入以后,要燒寫的uboot文件名就是:
firmware/u-boot-imx6ull14x14evk _emmc.imx
同樣的方法將.dtb(設備樹)和zImage都下載到DDR中以后就會跳轉去運行OS,這個時候會在MfgTool工具中會有“Jumping to OS image”提示語句,ucl2.xml中的跳轉命令如下:
Jumping to OS image.
啟動Linux系統以后就可以在EMMC上創建分區,然后燒寫uboot、zImage、.dtb(設備樹)和根文件系統。
4 系統燒寫實踐
4.1 燒寫NXP官方系統
因為我的板子是512MB的DDR3+8G的EMMC,與NXP官方開發板類似,可以先試著燒寫NX官方的系統,熟悉燒寫流程:
撥碼開關撥到USB模式,拔出SD卡,連接USB
板子上電,連接串口(用于查看具體的下載信息)
按下開發板復位按鍵。
雙擊打開“mfgtool2-yocto-mx-evk-emmc.vbs” ,確認出現“符合 HID 標準的供應商定義設備”等字樣,點擊Start按鈕。
注:燒錄開始時,會彈出大容量存儲器之類的窗口,并會出現短暫的No Device Connet的提示,不用理會。
注:官方的系統文件較大,燒錄時間較長。另外,若燒錄失敗,串口也沒打印信息,我剛開始就遇到了這種情況,然后我用野火提供的軟件包(系統文件比較小,燒錄在1分鐘左右)燒錄成功后,再回過頭來繼續燒錄NXP官方的就有串口輸出信息了。
我的板子燒錄官方系統時,不知什么原因一直燒錄不成功,如下圖,因為用不到官方的系統,就先不管它,有時間再查。
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/4C/poYBAGIx_NSAWxyKAACO1xodPM8592.png)
4.2 燒寫自己的系統
準備要燒寫的文件:
自己移植編譯出來的uboot文件:u-boot.imx(位于u-boot源碼主目錄中)
自己移植編譯出來的zImage鏡像文件(位于Kernel源碼的arch/arm/boot目錄中)和開發板對應的.dtb(設備樹)mx6ull-myboard.dtb(位于Kernel源碼的arch/arm/boot/dts目錄中)
自己構建的根文件系統rootfs
rootfs需要先打包成rootfs.tar.bz2,進入Ubuntu中的nfs目錄下的rootfs目錄,使用tar命令打包:
cd rootfs/
tar -vcjf rootfs.tar.bz2 *
將這4個文件復制到Windows系統中準備燒錄。
總結一下要準備的文件,如下圖:
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/52/pYYBAGIx_OaABmODAADt3OoY1D8635.png)
燒寫時,這里有兩種修改方式進行燒寫,一種是將自己的4個文件按照NXP官方的文件進行重命名,并替換掉官網的文件,即可直接燒錄。另一種是改造MfgTool燒寫工具,使得該燒寫工具能夠兼容自己板子的文件名。因為第2種修改比較麻煩,先使用第1種簡單的方式進行燒寫,只需要修改文件名即可。
需要替換的名稱為:
原名稱 | 修改替換的名稱 |
---|---|
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 |
點擊Start開始燒寫,等待燒寫完成:
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/52/pYYBAGIx_O2AViguAAEkZB07oMg081.png)
燒錄完,點擊Stop退出即可。
然后切換板子為EMMC啟動,復位重啟開發板,正常情況下應該就可以看到燒錄的系統正常啟動了。
但是,我這里出現了一點小差錯。
4.3 解決內核無法啟動的錯誤
在燒錄完系統,切換到EMMC啟動時,我板子的內核沒有運行起來,提示“MMC:no card present”的錯誤:
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/4C/poYBAGIx_POAM9C9AAC7paWLP-w407.png)
好像是EMMC沒有找到,就無法啟動內核。
網上查找相關問題,根據這篇:https://blog.csdn.net/qq_43605009/article/details/113646312的描述,應該是uboot的里一個配置項搞錯了,就是這里:
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/4C/poYBAGIx_PmAKZcAAAHGaqnzB7Q566.png)
我們的defconfig配置文件中,第一行最后那個不需要改,要改回默認的MX6ULL_EVK_EMMC_REWORK,改完,重新編譯uboot生成u-boot.imx,再次進行燒錄就能正常啟動內核了。(這里的MX6ULL_EVK_EMMC_REWORK的具體作用我還沒搞明白,有時間再研究)
正常啟動后,就可以看到和之前使用nfs網絡方式啟動一樣的效果了:
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/52/pYYBAGIx_P2AatwuAABKN60vKKs851.png)
4.4 解決網絡沒有啟動的問題
板子插上網線,使用ifconfig命令查看網絡信息,發現沒有連接網絡,這是因為板子的網絡功能沒有打開。之前使用nfs掛載根文件系統的時候因為要使用nfs服務,Linux內核會打開eth0這個網卡,現在我們不使用nfs掛載根文件系統, Linux內核就沒有自動打開eth 網卡。
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/4C/poYBAGIx_QSAfLH2AABqhalR0FU556.png)
我們可以手動打開,以打開eth1網卡為例,輸入如下命令打開 eth1:
ifconfig eth1 up
然后可以為板子分配IP:
ifconfig eth1 192.168.5.108 netmask 255.255.255.0 //設置 IP 地址和子網掩碼
route add default gw 192.168.5.1 //添加默認網關
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/52/pYYBAGIx_QqARFKZAACJxwgP0V0560.png)
目前這種手動修改的方式,每次開機以后就沒有了,還需要重新設置。可以將設置網卡IP地址的命令添加到/etc/init.d/rcS開機啟動文件中,添加如下內容:
#config eth1
ifconfig eth1 up
ifconfig eth1 192.168.5.108 netmask 255.255.255.0
route add default gw 192.168.5.1
![i.MX6ULL嵌入式Linux開發6-系統燒寫到eMMC](http://file.elecfans.com/web2/M00/36/4C/poYBAGIx_RCAXb9WAAB7bcVr1UQ181.png)
然后保存,reboot命令重啟開發板,重啟后就自動連上網了。
5 總結
本篇主要介紹了Linux移植的系統打包燒錄的EMMC的方法,使用MfgTool工具,將uboot、linux kernel、.dtb和rootfs這4個文件燒寫到板子的EMMC中。燒錄過程中,發現了之前修改uboot配置時的一個問題,導致內核無法啟動,修改后可以正常啟動。另外,還修改開機啟動文件,使得網絡能夠開機自動連接。
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5092文章
19177瀏覽量
307673 -
Linux
+關注
關注
87文章
11345瀏覽量
210392 -
文件
+關注
關注
1文章
570瀏覽量
24822
發布評論請先 登錄
相關推薦
使用i.MX6ULL開發板進行Linux根文件系統的完善
移植5.4內核到迅為I.MX6ULL開發板
編譯IMX6ULL開發板的Uboot和Linux內核
i.MX6ULL開發板硬件資源
i.MX6ULL核心板資源
初識 i.MX6ULL 寄存器
飛凌i.MX6ULL開發板的評測,再次進階擁有更高的性價比
![飛凌<b class='flag-5'>i.MX6ULL</b><b class='flag-5'>開發</b>板的評測,再次進階擁有更高的性價比](https://file.elecfans.com/web1/M00/CC/50/pIYBAF-XmfmAURl5AACodGrXx4o999.png)
基于i.MX6ULL的掉電檢測設計與軟件測試
![基于<b class='flag-5'>i.MX6ULL</b>的掉電檢測設計與軟件測試](https://file1.elecfans.com/web2/M00/AD/29/wKgaomVMRLyAA2QaAAAn19at1kE447.png)
【新品】i.MX6ULL工業嵌入式核心板!NXP低功耗MPU,LCD顯示
![【新品】<b class='flag-5'>i.MX6ULL</b>工業<b class='flag-5'>嵌入式</b>核心板!NXP低功耗MPU,LCD顯示](https://file.elecfans.com/web2/M00/3E/6A/pYYBAGJhBGGAGyDYAACBPQuBZQI711.png)
評論