日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

系统烧写方法(MfgTool烧写工具)

發布時間:2023/12/10 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 系统烧写方法(MfgTool烧写工具) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • MfgTool 工具簡介
  • MfgTool 工作原理簡介
    • USB接線
    • 系統燒寫原理
  • 燒寫NXP 官方系統
  • 燒寫自制的系統
    • 系統燒寫
    • 網絡開機自啟動設置
  • 改造我們自己的燒寫工具
    • 改造MfgTool
    • 燒寫測試
    • 解決Linux 內核啟動失敗
  • 總結

前面我們已經移植好了uboot 和linux kernle,制作好了根文件系統。但是我們移植都是通過網絡來測試的,在實際的產品開發中肯定不可能通過網絡來運行,否則沒網的時候產品豈不是就歇菜了。因此我們需要將uboot、linux kernel、.dtb(設備樹)和rootfs這四個文件燒寫到板子上的EMMC、NAND 或QSPI Flash 等其他存儲設備上,這樣不管有沒有網絡我們的產品都可以正常運行。本章我們就來學習一下如何使用NXP 官方提供的MfgTool 工具通過USB OTG 口來燒寫系統。

MfgTool 工具簡介

MfgTool 工具是NXP 提供的專門用于給I.MX 系列CPU 燒寫系統的軟件,可以在NXP 官網下載到。

此工具已經放到了開發板光盤中,路勁為:5、開發工具->3、NXP 官方原版MFG_TOOL燒寫工具->L4.1.15_2.0.0-ga_mfg-tools.tar.gz。此軟件在Windows下使用,對于我們來說太友好了。將此壓縮包進行解壓,解壓完成以后會出現一個名為L4.1.15_2.0.0-ga_mfg-tools的文件夾,進入此文件夾,此文件夾的內容如圖39.1.1 所示:


從圖39.1.1 可以看出,有兩個.txt 文件和兩個.gz 壓縮包。.txt 文檔就不去看了,重點是這兩個.gz 壓縮包,這兩個壓縮包的區別在名字上已經寫的很詳細了。“without-rootfs”和“with-rootfs”,一個是帶rootfs 和一個是不帶rootfs。mfg_tools 這個工具本意是給NXP 自己的開發板設計的燒寫軟件,所以肯定帶有自家開發板對應的uboot、linux kernel 和rootfs 的文件。我們肯定是要燒
寫文件系統的,所以選擇mfgtools-with-rootfs.tar.gz 這個壓縮包,繼續對其解壓,解壓出一個名為mfgtools-with-rootfs 的文件夾,此文件夾就包含有我們需要的燒寫工具。

進入目錄mfgtools-with-rootfs\mfgtools 中,在此目錄下有幾個文件夾和很多的.vbs 文件,如圖39.1.2 所示:

我們只關心圖39.1.2 中Profiles 這個文件夾,因為后面要燒寫文件就放到這個文件夾中。MfgTool2.exe 就是燒寫軟件,但是我們不會直接打開這個軟件燒寫,mfg_tools 不僅能燒寫I.MX6U,而且也能給I.MX7、I.MX6Q 等芯片燒寫,所以在燒寫之前必須要進行配置,指定燒寫的是什么芯片,燒寫到哪里去?

下面的這些眾多的.vbs 文件就是配置腳本,燒寫的時候通過雙擊這些.vbs 文件來打開燒寫工具。這些.vbs 燒寫腳本既可以根據處理器的不同,由用戶選擇向I.MX6D、I.MX6Q、I.MX6S、I.MX7、I.MX6UL 和I.MX6ULL 等的哪一款芯片燒寫系統。也可以根據存儲芯片的不同,選擇向EMMC、NAND 或QSPI Flash 等的哪一種存儲設備燒寫,功能非常強大!!我們現在需要向I.MX6U 燒寫系統,因此需要參考表39.1.1 所示的5 個燒寫腳
本:

腳本文件描述
mfgtool2-yocto-mx-evk-emmc.vbsEMMC 燒寫腳本。
mfgtool2-yocto-mx-evk-nand.vbsNAND 燒寫腳本
mfgtool2-yocto-mx-evk-qspi-nor-n25q256a.vbsQSPI Flash 燒寫腳本,型號為n25q256a
mfgtool2-yocto-mx-evk-sdcard-sd1.vbs如果SD1 和SD2 接的SD 卡,這兩個文件分
mfgtool2-yocto-mx-evk-sdcard-sd2.vbs別向SD1 和SD2 上的SD 卡燒寫系統。

本書用的是正點原子的EMMC 版核心板,因此只會用到mfgtool2-yocto-mx-evk-emmc.vbs 這個燒寫腳本,如果用其他的核心板請參考相應的燒寫腳本。

MfgTool 工作原理簡介

MfgTool 只是個工具,具體的原理不需要去深入研究,大概來了解一下其工作原理就行了,知道它的工作流程就行了。

USB接線

1、連接USB 線

MfgTool 是通過USB OTG 接口將系統燒寫進EMMC 中的,正點原子I.MX6U-ALPHA 開發板上的USB OTG 口如圖39.2.1.1 所示:

在燒寫之前,需要先用USB 線將圖39.2.2.1 中的USB_OTG1 接口與電腦連接起來。

2、撥碼開關撥到USB 下載模式

將圖39.2.2.1 中的撥碼開關撥到“USB”模式,如圖39.2.2.2 所示:

如果插了TF 卡,請彈出TF 卡,否則電腦不能識別USB!等識別出來以后再插上TF 卡!

一切準備就緒以后,按一下開發板的復位鍵,此時就會進入到USB 模式,如果是第一次進入USB 模式的話可能會久一點,這個是免驅的,因此不需要安裝驅動。第一次進入USB 模式會在電腦右下角有如圖39.2.2.3 所示提示:

一旦第一次設置好設備以后,后面每次連接都不會有任何提示了。到這里,我們的開發板已經和電腦連接好了,可以開始燒寫系統了。

系統燒寫原理

開發板連接電腦以后雙擊“mfgtool2-yocto-mx-evk-emmc.vbs”,打開下載對話框,如圖39.2.2.1 所示:


如果出現“符合HID 標準的供應商定義設備”就說明連接正常,可以進行燒寫,如果出現其他的字符那么就要檢查連接是否正確。點擊“Start”按鈕即可開始燒寫

燒寫什么東西呢?肯定是燒寫uboot、Linux kernel、.dtb 和rootfs,那么這四個應該放到哪里MfgTool 才能訪問到呢?進入如下目錄中:

L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware

此目錄中的文件如圖39.2.2.2 所示:

文件夾“OS Firmware”看名字就知道是存放系統固件的,我們重點關注files、firmware 這兩個文件夾,以及ucl2.xml 這個文件。

在具體看這三個文件和文件夾之前,我們先來簡單了解一下MfgTool 燒寫的原理,主要分兩個階段:

  • ①、將firmware 目錄中的uboot、linux kernel 和.dtb(設備樹),通過USB OTG 將這個文件下載到開發板的DDR 中(注意不需要下載rootfs),目的就是在DDR 中啟動Linux 系統,為后面的燒寫做準備。

  • ②、經過第①步的操作,此時Linux 系統已經運行起來了,系統運行起來以后就可以很方便的完成對EMMC 的格式化、分區等操作。EMMC 分區建立好以后就可以從files 中讀取要燒寫的uboot、linux kernel、.dtb(設備樹)和rootfs 這4 個文件,然后將其燒寫到EMMC 中,這個就是MfgTool 的大概工作流程。

1、firmeare 文件夾

打開firmware 文件夾,里面有很多的.imx 結尾的uboot 文件、一個zImage 鏡像文件、很多.dtb 結尾的設備樹文件。這些文件都是NXP 官方開發板使用的,不同的板子使用不同的文件,其中我們需要關心的只有表39.2.2.1 中的這三個文件:

腳本文件描述
zImageNXP 官方I.MX6ULL EVK 開發板的Linux 鏡像文件。
u-boot-imx6ull14x14evk_emmc.imxNXP 官方I.MX6ULL EVK 開發板的uboot 文件。
zImage-imx6ull-14x14-evk-emmc.dtbNXP 官方I.MX6ULL EVK 開發板的設備樹

表39.2.2.1 中的這三個文件就是I.MX6ULL EVK 開發板燒寫系統的時候第一階段所需的文件。如果要燒寫我們的系統,就需要用我們編譯出來的zImage、u-boot.imx 和imx6ull-alientek-emmc.dtb 這三個文件替換掉表39.2.2.1 中這三個文件。但是名字要和表39.2.2.1 中的一致,因此需要將u-boot.imx 重命名為u-boot-imx6ull14x14evk_emmc.imx,將imx6ull-alientek-emmc.dtb重命名為zImage-imx6ull-14x14-evk-emmc.dtb。

2、files 文件夾

將表39.2.2.1 中的這三個文件下載到開發板的DDR 上以后燒寫的第一階段就完成了,第二階段就是從files 目錄中讀取整個系統文件,并將其燒寫到EMMC 中。files 目錄中的文件和firmware 目錄中的基本差不多,都是不同板子對應的uboot、設備樹文件,同樣,我們只關心表39.2.2.2 中的四個文件:

腳本文件描述
zImageNXP 官方I.MX6ULL EVK 開發板的Linux 鏡像文件。
u-boot-imx6ull14x14evk_emmc.imxNXP 官方I.MX6ULL EVK 開發板的uboot 文件。
zImage-imx6ull-14x14-evk-emmc.dtbNXP 官方I.MX6ULL EVK 開發板的設備樹
rootfs_nogpu.tar.bz2根文件系統,注意和另外一個rootfs.tar.bz2 根文件系統區分開。nogpu 表示此根文件系統不包含GPU 的內容,I.MX6ULL 沒有GPU,因此要使用此根文件系統

如果要燒寫我們自己編譯出來的系統,就需要用我們編譯出來的zImage、u-boot.imx 和imx6ull-alientek-emmc.dtb 和rootfs 這四個文件替換掉表39.2.2.2 中這四個文件。

3、ucl2.xml 文件

files 和firmware 目錄下有眾多的uboot 和設備樹,那么燒寫的時候究竟選擇哪一個呢?這個工作就是由ucl2.xml 文件來完成的。

ucl2.xml 以“< UCL>”開始,以“< /UCL>”結束。“< CFG>”和“< /CFG>”之間是配置相關內容,主要是判斷當前是給I.MX 系列的哪個芯片燒寫系統。“< LIST>”和“< /LIST>”之間的是針對不同存儲芯片的燒寫命令。整體框架如下:

<UCL><CFG>......<!-- 判斷向I.MX系列的哪個芯片燒寫系統-->......</CFG><LIST name="SDCard" desc="Choose SD Card as media"><!-- 向SD卡燒寫Linux系統--></LIST><LIST name="eMMC" desc="Choose eMMC as media"><!-- 向EMMC燒寫Linux系統--></LIST><LIST name="Nor Flash" desc="Choose Nor flash as media"><!-- 向Nor Flash燒寫Linux系統--></LIST><LIST name="Quad Nor Flash" desc="Choose Quad Nor flash as media"><!-- 向Quad Nor Flash燒寫Linux系統--></LIST><LIST name="NAND Flash" desc="Choose NAND as media"><!-- 向NAND Flash燒寫Linux系統--></LIST><LIST name="SDCard-Android" desc="Choose SD Card as media"><!-- 向SD卡燒寫Android系統--></LIST><LIST name="eMMC-Android" desc="Choose eMMC as media"><!-- 向EMMC燒寫Android系統--></LIST><LIST name="Nand-Android" desc="Choose NAND as media"><!-- 向NAND Flash燒寫Android系統--></LIST><LIST name="SDCard-Brillo" desc="Choose SD Card as media"><!-- 向SD卡燒寫Brillo系統--></LIST> </UCL>

ucl2.xml 首先會判斷當前要向I.MX 系列的哪個芯片燒寫系統,代碼如下:

21 <CFG> 22 <STATE name="BootStrap" dev="MX6SL" vid="15A2" pid="0063"/> 23 <STATE name="BootStrap" dev="MX6D" vid="15A2" pid="0061"/> 24 <STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/> 25 <STATE name="BootStrap" dev="MX6SX" vid="15A2" pid="0071"/> 26 <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/> 27 <STATE name="BootStrap" dev="MX7D" vid="15A2" pid="0076"/> 28 <STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/> 29 <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/> 30 </CFG>

通過讀取芯片的VID 和PID 即可判斷出當前要燒寫什么處理器的系統,如果VID=0X15A2,PID=0080,那么就表示要給I.MX6ULL 燒寫系統。確定了處理器以后就要確定向什么存儲設備燒寫系統,這個時候打開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 燒寫系統,要燒寫的存儲設備就這樣確定下來了。“wshShell.run”后面還有一堆的其他參數,這些參數都有對應的值,如下所示:

board=sabresd mmc=1 6uluboot=14x14evk 6uldtb=14x14-evk

我們繼續回到ucl2.xml 中,既然現在已經知道了是向I.MX6ULL 的EMMC 中燒寫系統,那么直接在ucl2.xml 中找到相應的燒寫命令就行了,因為相應的命令太長,為了縮小篇幅,我們就以uboot 的燒寫為例講解一下。前面說了燒寫分兩個階段,第一步是通過USB OTG 向DDR中下載系統,第二步才是正常的燒寫。通過USB OTG 向DDR 下載uboot 的命令如下:

<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx" ifdev="MX6ULL">Loading U-boot </CMD>

上面的命令就是BootStrap 階段,也就是第一階段,“file”表示要下載的文件位置,在firmware目錄下,文件名字為

u-boot-imx6ul%lite%%6uluboot%_emmc.imx

在L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools-with-rootfs\mfgtools 下找到cfg.ini 文件,該文件里包含了開發板的一些信息,查看cfg.ini 文件可得lite=l 以及一些字符串代表的值。
“%lite%”和“%6uluboot%”分別表示取lite 和6uluboot 的值,而lite=l,6uluboot=14x14evk,因此將這個值代入以后就是:

u-boot-imx6ull14x14evk _emmc.imx

所以,這里向DDR 中下載的是firmware/ u-boot-imx6ull14x14evk _emmc.imx 這個uboot 文件。同樣的方法將.dtb(設備樹)和zImage 都下載到DDR 中以后就會跳轉去運行OS,這個時候會在MfgTool 工具中會有“Jumping to OS image”提示語句,ucl2.xml 中的跳轉命令如下:

<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

啟動Linux 系統以后進入第二階段,就是在EMMC 上創建分區,然后燒寫uboot、zImage、.dtb(設備樹)和根文件系統。

這個就是MfgTool 的整個燒寫原理,弄懂了燒寫原理以后就可以開始試著先將NXP 官方的系統燒寫到正點原子的I.MX6U-ALPHA 開發板中。

燒寫NXP 官方系統

我們先試著將NXP 官方的系統燒寫到正點原子的I.MX6U-ALPHA 開發板中,主要是先熟悉一下燒寫過程。因為正點原子的EMMC 核心版用的也是512MB 的DDR3 加8G 的EMMC,因此燒寫NXP 官方的系統是沒有任何問題的。燒寫步驟如下:

①、連接好USB,撥碼開關撥到USB 下載模式。
②、彈出TF卡,然后按下開發板復位按鍵。
③、打開SecureCRT。
③、雙擊“mfgtool2-yocto-mx-evk-emmc.vbs”,打開下載軟件,如果出現“符合HID 標準的供應商定義設備”等字樣就說明下載軟件已經準備就緒。點擊“Start”按鈕開發燒寫NXP 官方系統,燒寫過程如圖39.3.1 所示:

這個時候可以在SecurCRT 上看到具體的燒寫過程,如圖39.3.2 所示:

等待燒寫完成,因為NXP 官方的根文件系統比較大,因此燒寫的時候耗時會久一點。燒寫完成以后MfgTool 軟件如圖39.3.3 所示:

燒寫完成以后點擊“Stop”按鈕停止燒寫,然后點擊“Exit”鍵退出。拔出USB 線,將開發板上的撥碼開關撥到EMMC 啟動模式,然后重啟開發板,此時就會從EMMC 啟動。只是啟動以后的系統是NXP 官方給I.MX6ULL EVK 開發板制作的,這個系統需要輸入用戶名,用戶名為“root”,沒有密碼,如圖39.3.3 所示:

在“imx6ul7d login:”后面輸入“root”用戶名,然后點擊回車鍵即可進入系統中,進入系統以后就可以進行其他操作了。所以說,NXP 官方的系統其實是可以在正點原子的EMMC 版核心板上運行的。

燒寫自制的系統

系統燒寫

上一小節我們試著將NXP 官方提供的系統燒寫到正點原子的I.MX6U-ALPHA 開發板中,目的是體驗一下通過MfgTool 燒寫系統的過程。本小節我們就來學習如何將我們做好的系統燒寫到開發板中,首先是準備好要燒寫的原材料:

  • ①、自己移植編譯出來的uboot 可執行文件:u-boot.imx。
  • ②、自己移植編譯出來的zImage 鏡像文件和開發板對應的.dtb(設備樹),對于I.MX6U-ALPHA 開發板來說就是imx6ull-alientek-emmc.dtb。
  • ③、自己構建的根文件系統rootfs,這里我們需要對rootfs 進行打包,進入到Ubuntu 中的rootfs 目錄中,然后使用tar 命令對其進行打包,命令如下:
cd rootfs/ tar -vcjf rootfs.tar.bz2 *

完成以后會在rootfs 目錄下生成一個名為rootfs.tar.bz2 的壓縮包,將rootfs.tar.bz2 發送到windows 系統中。

將上面提到的這4 個“原材料”都發送到Windows 系統中,如圖39.4.1 所示:


材料準備好以后還不能直接進行燒寫,必須對其進行重命名,否則的話ucl2.xml 是識別不出來的,前面講解ucl2.xml 語法的時候已經說過了,圖39.4.1 中的這四個文件重命名見表39.4.1:

原名字重命名
u-boot.imxu-boot-imx6ull14x14evk_emmc.imx
zImagezImage(不需要重命名)
imx6ull-alientek-emmc.dtbzImage-imx6ull-14x14-evk-emmc.dtb
rootfs.tar.bz2rootfs_nogpu.tar.bz2

完成以后如圖39.4.2 所示:

接下來就是用我們的文件替換掉NXP 官方的文件,先將圖39.4.2 中的zImage、u-boot-imx6ull14x14evk_emmc.imx 和zImage-imx6ull-14x14-evk-emmc.dtb 這三個文件拷貝到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware目錄中,替換掉原來的文件。然后將圖39.4.2 中的所有4 個文件都拷貝到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files目錄中,這兩個操作完成以后我們就可以進行燒寫了。

雙擊“mfgtool2-yocto-mx-evk-emmc.vbs”,打開燒寫軟件,點擊“Start”按鈕開始燒寫,由于我們自己制作的rootfs 比較小,因此燒寫相對來說會快一點。燒寫完成以后設置開發板從EMMC 啟動,啟動我們剛剛燒寫進去的系統,測試有沒有問題。

注意!一旦自己改造的mfgtools 工具能夠正常燒寫系統,那么mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目錄下的文件以后就不能再修改!否則可能導致燒寫失敗!

網絡開機自啟動設置

大家在測試網絡的時候可能會發現網絡不能用,這并不是因為我們將系統燒寫到EMMC中以后網絡壞了,是因為網絡沒有打開。

前面我們用NFS 掛載根文件系統的時候因為要使用NFS服務,因此Linux 內核會打開eth0 這個網卡,現在我們不使用NFS 掛載根文件系統,因此Linux內核也就不會自動打開eth0 網卡了。

我們可以手動打開網卡,首先輸入

ifconfig -a

命令查看一下eth0 和eth1 網卡是否都存在,結果如圖39.4.3 所示:

可以看出eth0 好eth1 都存在,既然存在我們就打開,以打開eth0 網卡為例,輸入如下命令打開eth0:

ifconfig eth0 up

打開網卡的時候會有如圖39.4.4 所示的提示信息:

打開的時候會提示使用LAN8710/LAN8720 的網絡芯片,eth0 連接成功,并且是100Mpbs全雙工,eth0 鏈接準備就緒。這個時候輸入“ifconfig”命令就會看到eth0 這個網卡,如圖39.4.6所示:

接下來就是給每個eth0網卡設置IP 地址,如果你的開發板連接的路由器,那么可以通過路由器自動分配IP 地址,命令如下:

udhcpc -i eth0 //通過路由器分配IP 地址

如果你的開發板連接著電腦,那么就可以手動設置IP 地址,比如設置為192.168.1.251,命令如下:

ifconfig eth0 192.168.1.251 netmask 255.255.255.0 //設置IP 地址和子網掩碼 route add default gw 192.168.1.1 //添加默認網關

推薦大家將開發板連接到路由器上,設置好IP 地址以后就可以測試網絡了,比如ping 一下電腦IP 地址,或者ping 一下百度官網。

每次開機以后都要自己手動打開網卡,然后手動設置IP 地址也太麻煩了,有沒有開機以后自動啟動網卡并且設置IP 地址的方法呢?肯定有的,我們將打開網卡,設置網卡IP 地址的命令添加到/etc/init.d/rcS 文件中就行了,完成以后的rcS 文件內容如下所示:

1 #!/bin/sh 2 3 PATH=/sbin:/bin:/usr/sbin:/usr/bin 4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib 5 export PATH LD_LIBRARY_PATH runlevel 6 7 #網絡開機自啟動設置 8 ifconfig eth0 up 9 #udhcpc -i eth0 10 ifconfig eth0 192.168.1.251 netmask 255.255.255.0 11 route add default gw 192.168.1.1 ...... 12 #cd /drivers 13 #./hello & 14 #cd /

第8 行,打開eth0 網卡
第9 行,通過路由器自動獲取IP 地址。
第10 行,手動設置eth0 的IP 地址和子網掩碼。
第11 行,添加默認網關。

修改好rcS 文件以后保存并退出,重啟開發板,這個時候eth0 網卡就會在開機的時候自動啟動了,我們也就不用手動添加相關設置了。

改造我們自己的燒寫工具

改造MfgTool

在上一小節中我們已經實現了將自己的系統燒寫到開發板中,但是使用的是“借雞生蛋”的方法。我們通過將NXP 官方的系統更換成我們自己制作的系統來完成系統燒寫,本節我們就來學習一下如何將MfgTool 這個工具改造成我們自己的工具,讓其支持我們自己的開發板。要改造MfgTool,重點是三方面:

  • ①、針對不同的核心版,確定系統文件相關名字。
  • ②、新建我們自己的.vbs 文件。
  • ③、修改ucl2.xml 文件。

1、確定系統文件名字

確定系統文件名字完全是為了兼容不同的產品,比如某個產品有NAND 和EMMC 兩個版本,那么EMMC 和NAND 這兩個版本的uboot、zImage、.dtb 和rootfs 有可能不同。為了在MfgTool 工具中同時支持EMMC 和NAND 這兩個版本的核心板,EMMC 版本的系統文件命名如圖39.5.1.1 所示:

2、新建.vbs 文件

直接復制mfgtool2-yocto-mx-evk-emmc.vbs 文件即可,將新復制的文件重命名為mfgtool2-alientek-alpha-emmc.vbs,文件內容不要做任何修改,.vbs 文件我們就新建好了。

3、修改ucl2.xml 文件

在修改ucl2.xml 文件之前,先保存一份原始的ucl2.xml。將ucl2.xml 文件改為如下所示內容:

<!-- 正點原子修改后的ucl2.xml文件--> <UCL> <CFG> <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/> <STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/> <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/> </CFG> <!-- 向EMMC燒寫系統--> <LIST name="eMMC" desc="Choose eMMC as media"> <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-alientek-emmc.imx" ifdev="MX6ULL">Loading U-boot</CMD> <CMD state="BootStrap" type="load" file="firmware/zImage-alientek-emmc" address="0x80800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD> <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD> <CMD state="BootStrap" type="load" file="firmware/imx6ull-alientek-emmc.dtb" address="0x83000000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading device tree.</CMD> <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD> <!-- create partition --> <CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD> <CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD> <CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk%mmc%"> Partitioning...</CMD> <!-- burn uboot --> <CMD state="Updater" type="push" body="$ dd if=/dev/zero of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg</CMD> <!-- access boot partition --> <CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD> <CMD state="Updater" type="push" body="send" file="files/u-boot-alientek-emmc.imx" ifdev="MX6ULL">Sending u-boot.bin</CMD> <CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sd card</CMD> <CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access </CMD> <CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD> <!-- create fat partition --> <CMD state="Updater" type="push" body="$ while [ ! -e /dev/mmcblk%mmc%p1 ]; do sleep 1; echo \"waiting...\"; done ">Waiting for the partition ready</CMD> <CMD state="Updater" type="push" body="$ mkfs.vfat /dev/mmcblk%mmc%p1">Formatting rootfs partition</CMD> <CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p1"/> <CMD state="Updater" type="push" body="$ mount -t vfat /dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/> <!-- burn zImage --> <CMD state="Updater" type="push" body="send" file="files/zImage-alientek-emmc">Sending kernel zImage</CMD> <CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/zImage">write kernel image to sd card</CMD> <!-- burn dtb --> <CMD state="Updater" type="push" body="send" file="files/imx6ull-alientek-emmc.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD> <CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/imx6ull-alientek-emmc.dtb" ifdev="MX6ULL">write device tree to sd card</CMD> <CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p1">Unmounting vfat partition</CMD> <!-- burn rootfs --> <CMD state="Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard /dev/mmcblk%mmc%p2">Formatting rootfs partition</CMD> <CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p2"/> <CMD state="Updater" type="push" body="$ mount -t ext3 /dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/> <CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk%mmc%p2" file="files/rootfs-alientek-emmc.tar.bz2" ifdev="MX6UL MX7D MX6ULL">Sending and writting rootfs</CMD> <CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD> <CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p2">Unmounting rootfs partition</CMD> <CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD> </LIST> </UCL>

燒寫測試

MfgTool 工具修改好以后就可以進行燒寫測試了,將imx6ull-alientek-emmc.dtb、u-boot-alientek-emmc.imx 和zImage-alientek-emmc 這三個文件復制到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目錄中。
將imx6ull-alientek-emmc.dtb、u-boot-alientek-emmc.imx、zImage-alientek-emmc 和rootfs-alientek-emmc.tar.bz2 這四個文件復制到
mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files 目錄中(相當于刪除了其他無關的內容,只保留了4個有用的文件)。

點擊“mfgtool2-alientek-alpha-emmc.vbs”打開MfgTool 燒寫系統,等待燒寫完成,然后設置撥碼開關為EMMC 啟動,重啟開發板,系統啟動信息如圖39.5.2.1 所示:

從圖39.5.2.1 可以看出,出現“Starting kernel …”以后就再也沒有任何信息輸出了,說明Linux 內核啟動失敗了。接下來就是解決為何Linux 內核啟動失敗這個問題。

解決Linux 內核啟動失敗

上一小節啟動Linux 的時候出問題了,仔細觀察uboot 輸出的log 信息,會發現如圖39.5.3.1 所示兩行信息:

從圖39.5.3.1 可以看出,在讀取“imx6ull-14x14-evk.dtb”這個設備樹文件的時候出錯了。

重啟uboot,進入到命令行模式,輸入如下命令查看EMMC 的分區1 里面有沒有設備樹文件:

mmc dev 1 //切換到EMMC ls mmc 1:1 //輸出EMMC1 分區1 中的所有文件

結果如圖39.5.3.2 所示:

從圖39.5.3.2 可以看出,此時EMMC 的分區1 中是存在設備樹文件的,只是文件名字為:imx6ull-alientek-emmc.dtb,因此讀取imx6ull-14x14-evk.dtb 肯定會出錯的,因為根本就不存在這個文件。之所以出現這個錯誤的原因是因為uboot 里面默認的設備樹名字就是imx6ull-14x14-evk.dtb,這個我們在講解uboot 的時候就已經說過了。解決方法很簡單,有兩種方法:

方法一:重新設置bootcmd 環境變量值

進入uboot 的命令行,重新設置bootcmd 和bootargs 這兩個環境變量的值,這里要注意的是bootargs 的值也要重新設置一下,命令如下:

setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000' setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' saveenv

設置好bootcmd 和bootargs 這兩個環境變量以后重啟開發板,Linux 系統就可以正常啟動。

方法二:修改uboot 源碼

第1 種方法每次重新燒寫系統以后都要先手動設置一下bootcmd 的值,這樣有點麻煩,有沒有一勞永逸的方法呢?肯定是有的,就是直接修改uboot 源碼。打開uboot 源碼中的文件include/configs/mx6ull_alientek_emmc.h,在宏CONFIG_EXTRA_ENV_SETTINGS 中找到如下所示內容:

194 "findfdt="\ 195 "if test $fdt_file = undefined; then " \ 196 "if test $board_name = EVK && test $board_rev = 9X9; then " \ 197 "setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \ 198 "if test $board_name = EVK && test $board_rev = 14X14; then " \ 199 "setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \ 200 "if test $fdt_file = undefined; then " \ 201 "echo WARNING: Could not determine dtb to use; fi; " \ 202 "fi;\0" \

findfdt 就是用于確定設備樹文件名字的環境變量,fdt_file 環境變量保存著設備樹文件名。

第196 行和197 行用于判斷設備樹文件名字是否為imx6ull-9x9-evk.dtb,第198 行和199 行用于判斷設備樹文件名字是否為imx6ull-14x14-evk.dtb。這兩個設備樹都是NXP 官方開發板使用的,I.MX6U-ALPHA 開發板用不到,因此直接將示例代碼39.5.3.1 中findfdt 的值改為如下內容:

194 "findfdt="\ 195 "if test $fdt_file = undefined; then " \ 196 "setenv fdt_file imx6ull-alientek-emmc.dtb; " \ 197 "fi;\0" \

第196 行,如果fdt_file 未定義的話,直接設置fdt_file= imx6ull-alientek-emmc.dtb,簡單直接,不需要任何的判斷語句。修改以后重新編譯uboot,然后用將新的uboot 燒寫到開發板中,燒寫完成以后重啟測試,Linux 內核啟動正常。

總結

關于系統燒寫就講解到這里,本章我們使用NXP 提供的MfgTool 工具通過USB OTG 口向開發板的EMMC 中燒寫uboot、Linux kernel、.dtb(設備樹)和rootfs 這四個文件。在本章我們主要做了五個工作:

①、理解MfgTool 工具的工作原理。
②、使用MfgTool 工具將NXP 官方系統燒寫到I.MX6U-ALPHA 開發板中,主要是為了體
驗一下MfgTool 軟件的工作流程以及燒寫方法。
③、使用MfgTool 工具將我們自己編譯出來的系統燒寫到I.MX6U-ALPHA 開發板中。
④、修改MfgTool 工具,使其支持我們所使用的硬件平臺。
⑤、修改相應的錯誤。

關于系統燒寫的方法就講解到這里,本章內容不僅僅是為了講解如何向I.MX6ULL 芯片中燒寫系統,更重要的是向大家詳細的講解了MfgTool 的工作原理。如果大家在后續的工作或學習中使用I.MX7 或者I.MX8 等芯片,本章同樣適用。

隨著本章的結束,本書第三篇的內容也正式結束了,第三篇是系統移植篇,重點就是uboot、Linux kernel 和rootfs 的移植,看似簡簡單單的“移植”兩個字,引出的卻是一篇300 多頁的“愛恨情仇”。授人以魚不如授人以漁,本可以簡簡單單的教大家修改哪些文件、添加哪些內容,怎么去編譯,然后得到哪些文件。但是這樣只能看到表象,并不能深入的了解其原理,為了讓大家能夠詳細的了解整個流程,筆者義無反顧的選擇了這條最難走的路,不管是uboot 還是Linux kernel,從Makefile 到啟動流程,都盡自己最大的努力去闡述清楚。奈何,筆者水平有限,還是有很多的細節沒有處理好,大家有疑問的地方可以一起討論學習。

總結

以上是生活随笔為你收集整理的系统烧写方法(MfgTool烧写工具)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。