系統(tǒng)燒寫實(shí)操
在Linux系統(tǒng)燒寫初探一文中介紹了mfgtool燒寫工具及其工作原理,下面以 I.MX6U-ALPHA EMMC開發(fā)板為平臺(tái),分別介紹如何燒寫 NXP官方系統(tǒng),以及燒寫自制系統(tǒng)
1. 燒寫NXP官方系統(tǒng)
燒寫 NXP官方的系統(tǒng)到 I.MX6U-ALPHA EMMC開發(fā)板(512MB DDR3 + 8G EMMC)中,具體步驟如下:
- 連接好USB,撥碼開關(guān)撥到USB下載模式
- 彈出TF卡,然后按下開發(fā)板復(fù)位按鍵
- 打開MobaXterm串口助手終端
- 雙擊mfgtool2-yocto-mx-evk-emmc.vbs
- 點(diǎn)擊Start按鈕燒寫 NXP 官方系統(tǒng)
燒寫過程如下示
MobaXterm串口助手終端上顯示的燒寫過程
燒寫完成后點(diǎn)擊Stop按鈕停止燒寫,點(diǎn)擊Exit鍵退出
拔出USB線,將撥碼開關(guān)撥到EMMC啟動(dòng)模式,重啟后就會(huì)從EMMC啟動(dòng)
此時(shí)啟動(dòng)后的系統(tǒng)是 NXP給 I.MX6ULL EVK開發(fā)板制作的,需要輸入用戶名,用戶名為“root”,沒有密碼
2. 燒寫自制系統(tǒng)
燒寫自制系統(tǒng)到 I.MX6U-ALPHA EMMC開發(fā)板(512MB DDR3 + 8G EMMC)中。 準(zhǔn)備好自制的 uboot、kernel、. dtb 和 rootfs(壓縮包)這四個(gè)燒寫文件,對(duì)其進(jìn)行重命名
##根文件系統(tǒng) rootfs 打包
cd rootfs/
tar -vcjf rootfs.tar.bz2 *
將改名后的uboot、kernel、. dtb 這三個(gè)文件拷貝到firmware目錄中,替換掉原來的文件
將改名后的所有四個(gè)文件拷貝到files目錄中
雙擊mfgtool2-yocto-mx-evk-emmc.vbs文件,打開燒寫軟件,點(diǎn)擊Start按鈕即可燒寫
燒寫完成后從EMMC啟動(dòng)系統(tǒng),如下圖示可見自制系統(tǒng)已經(jīng)燒寫成功
3. 改造燒寫工具
3.1 改造Mfgtool
上面是將 NXP官方的系統(tǒng)更換成自制的系統(tǒng)來完成燒寫,下面將介紹如何改造 MfgTool工具,讓其支持自己的開發(fā)板。 改造MfgTool,主要從以下三方面著手
確定系統(tǒng)文件名字:確定系統(tǒng)文件名字是為了兼容不同的產(chǎn)品
新建.vbs文件:復(fù)制 mfgtool2-yocto-mx-evk-emmc.vbs 文件,重新按需要命令,比如命名成 mfgtool2-andyxi-emmc.vbs
修改OS Firmware文件夾里的 ucl2.xml文件:改為如下所示內(nèi)容
"BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
"BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
"Updater" dev="MSC" vid="066F" pid="37FF"/>
class="hljs-name"CFG>
<LIST name="eMMC" desc="Choose eMMC as media">
"BootStrap" type="boot" body="BootStrap" file
="firmware/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">Loading Ubootclass="hljs-name"CMD>
"BootStrap" type="load" file="firmware/zImage-andyxi-emmc" address="0x80800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.class="hljs-name"CMD>
"BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.class="hljs-name"CMD>
"BootStrap" type="load" file="firmware/imx6ull-andyxi-emmc.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
ifdev="MX6ULL">Loading device tree.class="hljs-name"CMD>
"BootStrap" type="jump" > Jumping to OS image. class="hljs-name"CMD>
"Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shellclass="hljs-name"CMD>
"Updater" type="push" body="$ tar xf $FILE ">Partitioning...class="hljs-name"CMD>
"Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk%mmc%"> Partitioning...class="hljs-name"CMD>
"Updater" type="push" body="$ dd if=/dev/zero
of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg
"Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">
access boot partition 1class="hljs-name"CMD>
"Updater" type="push" body="send" file="files/u-boot-andyxi-emmc.imx" ifdev="MX6ULL">
Sending u-boot.binclass="hljs-name"CMD>
"Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">
write U-Boot to sd cardclass="hljs-name"CMD>
"Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro">
re-enable read-only accessclass="hljs-name"CMD>
"Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">
enable boot partion 1 to bootclass="hljs-name"CMD>
"Updater" type="push" body="$ while [ ! -e
/dev/mmcblk%mmc%p1 ]; do sleep 1; echo \\"waiting...\"; done ">Waiting for the partition ready
"Updater" type="push" body="$ mkfs.vfat /dev/mmcblk%mmc%p1">
Formatting rootfs partitionclass="hljs-name"CMD>
"Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p1"/>
"Updater" type="push" body="$ mount -t vfat /dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/>
"Updater" type="push" body="send" file="files/zImage-andyxi-emmc">
Sending kernel zImageclass="hljs-name"CMD>
"Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/zImage">
write kernel image to sd cardclass="hljs-name"CMD>
"Updater" type="push" body="send" file="files/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">
Sending Device Tree fileclass="hljs-name"CMD>
"Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/imx6ull-andyxi-emmc.dtb" ifdev="MX6ULL">
write device tree to sd cardclass="hljs-name"CMD>
"Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p1">
Unmounting vfat partitionclass="hljs-name"CMD>
"Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard /dev/mmcblk%mmc%p2">
Formatting rootfs partitionclass="hljs-name"CMD>
"Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p2"/>
"Updater" type="push" body="$ mount -t ext3 /dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/>
"Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk%mmc%p2"
file="files/rootfs-andyxi-emmc.tar.bz2" ifdev="MX6UL MX7D MX6ULL">Sending and writting rootfsclass="hljs-name"CMD>
"Updater" type="push" body="frf">Finishing rootfs writeclass="hljs-name"CMD>
"Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p2">Unmounting rootfs partitionclass="hljs-name"CMD>
"Updater" type="push" body="$ echo Update Complete!">Doneclass="hljs-name"CMD>
class="hljs-name"LIST>
class="hljs-name"UCL>
3.2 燒寫測(cè)試
MfgTool 工具修改好后就可以進(jìn)行燒寫測(cè)試了,將自制的 uboot、linux kernel、和 .dtb 這三個(gè)文件拷貝到firmware目錄中,替換掉原來的文件; 將所有四個(gè)文件拷貝到files目錄中
雙擊 mfgtool2-andyxi-emmc.vbs文件,打開燒寫軟件,點(diǎn)擊“Start”按鈕即可燒寫。 燒寫完成,設(shè)置撥碼開關(guān)為 EMMC 啟動(dòng),重啟開發(fā)板,系統(tǒng)啟動(dòng)信息如下圖示:
開發(fā)板最終卡在 “Starting kernel …”,內(nèi)核啟動(dòng)失敗。 下面介紹如何解決內(nèi)核啟動(dòng)失敗的問題
3.3 解決內(nèi)核啟動(dòng)失敗
仔細(xì)觀察 uboot 輸出的 log 信息,會(huì)發(fā)現(xiàn)如下圖所示的兩行信息:
可見在讀取設(shè)備樹文件時(shí)就出錯(cuò)了。 重啟 uboot,進(jìn)入到命令行模式,輸入如下命令查看 EMMC 的分區(qū) 1 里面有沒有設(shè)備樹文件
mmc dev 1 //切換到EMMC
ls mmc 1:1 //輸出EMMC1分區(qū)1中的所有文件
可見此時(shí) EMMC的分區(qū)1中是存在設(shè)備樹文件的,只是名字不同,因此讀取 imx6ull-14x14-evk.dtb肯定會(huì)出錯(cuò)。 出現(xiàn)這個(gè)錯(cuò)誤的原因是 uboot里默認(rèn)的設(shè)備樹名字是imx6ull-14x14-evk.dtb,解決方法有以下兩種:
重新設(shè)置 bootcmd環(huán)境變量值:在 uboot的命令行模式下,重設(shè) bootcmd 和 bootargs 這兩個(gè)環(huán)境變量的值
setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000
imx6ull-andyxi-emmc.dtb;bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
修改 uboot源碼:上面方法每次重新燒寫都要再設(shè)置,以下方法只需設(shè)置一次,uboot源碼 include/configs/mx6ull_andyxi_emmc.h文件里,在宏 CONFIG_EXTRA_ENV_SETTINGS中找到如下所示內(nèi)容:
"findfdt="\\
"if test $fdt_file = undefined; then " \\
"if test $board_name = EVK && test $board_rev = 9X9; then " \\
"setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \\
"if test $board_name = EVK && test $board_rev = 14X14; then " \\
"setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \\
"if test $fdt_file = undefined; then " \\
"echo WARNING: Could not determine dtb to use; fi; " \\
"fi;\\0" \\
findfdt 是用于確定設(shè)備樹文件名字的環(huán)境變量, fdt_file環(huán)境變量保存著設(shè)備樹文件名。 上面代碼中的兩個(gè)設(shè)備樹都是 NXP官方開發(fā)板使用的。 因此將 findfdt 值改為如下內(nèi)容:
"findfdt="\\
"if test $fdt_file = undefined; then " \\
"setenv fdt_file imx6ull-andyxi-emmc.dtb; " \\
"fi;\\0" \\
修改后重新編譯 uboot,然后將新的 uboot燒寫到開發(fā)板后重啟測(cè)試,內(nèi)核啟動(dòng)正常。 至此自制系統(tǒng)燒寫完成,并測(cè)試成功,開發(fā)板可以在沒有網(wǎng)絡(luò)的情況下正常啟動(dòng)
-
usb
+關(guān)注
關(guān)注
60文章
7988瀏覽量
266248 -
Linux
+關(guān)注
關(guān)注
87文章
11351瀏覽量
210494 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
596瀏覽量
27524 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5126瀏覽量
98310 -
燒寫
+關(guān)注
關(guān)注
0文章
57瀏覽量
14376
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux系統(tǒng)移植開發(fā)篇2:燒寫linux鏡像
![<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>移植開發(fā)篇2:<b class='flag-5'>燒</b>寫<b class='flag-5'>linux</b>鏡像](https://file.elecfans.com//web2/M00/16/7B/poYBAGFUG_-ARix5ABdNEz79Xe8526.png)
i.MX6ULL嵌入式Linux開發(fā)6-系統(tǒng)燒寫到eMMC
![i.MX6ULL嵌入式<b class='flag-5'>Linux</b>開發(fā)6-<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>燒</b>寫到eMMC](https://file.elecfans.com/web2/M00/36/4F/poYBAGIyh9uAekxFAABvmZixdsA511.png)
【OK210試用體驗(yàn)】之(二)——Linux系統(tǒng)燒寫和Android HDMI顯示
【OK210試用體驗(yàn)】SD燒寫Linux系統(tǒng)
TQ210 燒寫Linux系統(tǒng)
TQ210 燒寫Linux系統(tǒng)
3399 開發(fā)板Linux 系統(tǒng)燒寫
[充電樁計(jì)費(fèi)控制單元主板]如何一鍵燒寫啟動(dòng)Linux系統(tǒng)
Linux系統(tǒng)燒寫DNW報(bào)錯(cuò)這是什么問題
如何燒寫linux鏡像
STM32MP157 Linux系統(tǒng)移植開發(fā)篇2:燒寫linux鏡像
![STM32MP157 <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>移植開發(fā)篇2:<b class='flag-5'>燒</b>寫<b class='flag-5'>linux</b>鏡像](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32MP157系列教程連載-Linux系統(tǒng)移植篇2:STM32MP1微處理器之系統(tǒng)鏡像燒寫
![STM32MP157系列教程連載-<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>移植篇2:STM32MP1微處理器之<b class='flag-5'>系統(tǒng)</b>鏡像<b class='flag-5'>燒</b>寫](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux系統(tǒng)燒寫初探
![<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>燒</b>寫初探](https://file1.elecfans.com/web2/M00/82/11/wKgaomQ-RNqAcpN6AAEOI8aQ7qY722.jpg)
評(píng)論