提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
[1.2、新建.vbs 文件](#1.2、新建.vbs 文件)
[1.3、修改 ucl2.xml 文件](#1.3、修改 ucl2.xml 文件)
[三、解决 Linux 内核启动失败](#三、解决 Linux 内核启动失败)
[3.1、法1:重新设置 bootcmd 环境变量值](#3.1、法1:重新设置 bootcmd 环境变量值)
[3.2、法2:修改 uboot 源码(推荐)](#3.2、法2:修改 uboot 源码(推荐))
前言
在上一期博客中我们已经实现了将自己的系统烧写到开发板中。我们通过将NXP 官方的系统更换成我们自己制作的系统来完成系统烧写,本期博客将MfgTool 这个工具改造成我们自己的工具,让其支持我们自己的开发板。
一、改造我们自己的烧写工具
要改造 MfgTool,重点是三方面:
①、针对不同的核心版,确定系统文件相关名字。
②、新建我们自己的.vbs 文件。
③、修改 ucl2.xml 文件。
1.1**、确定系统文件名字**
确定系统文件名字完全是为了兼容不同的产品,为了在MfgTool 工具中同时支持 EMMC 和 NAND 这两个版本的核心板,EMMC 版本的系统文件命名如下图所示:

1.2**、新建****.vbs****文件**
直接复制 mfgtool2-yocto-mx-evk-emmc.vbs 文件即可,将新复制的文件重命名为 mfgtool2-
alientek-alpha-emmc.vbs即可。
1.3**、修改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="006F" 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 MX6UL MX6ULL">Loading Kernel</CMD>
<CMD state="BootStrap" type="load" file="firmware/initramfs%" address="0x83800000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX6UL MX6ULL">Loading Initramfs.</CMD>
<CMD state="BootStrap" type="load" file="firmware/fsl-imx6ul-alientek-emmc.dtb" address="0x83000000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading device tree.</CMD>
<CMD state="BootStrap" type="jump" ></CMD> Jumping to OS image.</CMD>
<!-- create partition -->
<CMD state="Updater" type="push" body="send" file="mke2disk.tar">Sending partition shell</CMD>
<CMD state="Updater" type="push" body="tar xvf %FILE%">Partitioning..</CMD>
<CMD state="Updater" type="push" body="sh mkedisk.sh /dev/mmcblk0p0">Partitioning..</CMD>
<!-- ! burn uboot -->
<CMD state="Updater" type="push" body="dd if=/dev/zero of=/dev/mmcblk0boot0 bs=seek=768 conv=fsync count=1 u-boot.arg"></CMD>
<!-- ! access boot partition -->
<CMD state="Updater" type="push" body="echo 0">/sys/block/mmcblk0boot0/force_ro</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/mmcblk0boot0 bs=512 seek=2">Write U-boot to sd card</CMD>
<CMD state="Updater" type="push" body="echo 1">/sys/block/mmcblk0boot0/force_ro</CMD>
<CMD state="Updater" type="push" body="mmc bootpart enable 1 1 /dev/mmcblk0boot0">enable boot partition 1 to boot</CMD>
<!-- ! create fat partition -->
<CMD state="Updater" type="push" body="while [ ! -e /dev/mmcblk0p1 ]; do sleep 1; echo Waiting...; done">Waiting for the partition ready</CMD>
<CMD state="Updater" type="push" body="mkfs.vfat /dev/mmcblk0p1">Formatting roots partition</CMD>
<CMD state="Updater" type="push" body="mkdir -p /mnt/mmcblk0p1"></CMD>
<CMD state="Updater" type="push" body="mount -t vfat /dev/mmcblk0p1 /mnt/mmcblk0p1"></CMD>
<!-- ! burn zimage -->
<CMD state="Updater" type="push" body="send" file="files/zImage-alientek-emmc">Sending Kernel Image</CMD>
<CMD state="Updater" type="push" body="cp %FILE% /mnt/mmcblk0p1/zImage">Write kernel image to sd card</CMD>
<!-- ! burn dtb -->
<CMD state="Updater" type="push" body="send" file="files/fsl-imx6ul-alientek-emmc.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
<CMD state="Updater" type="push" body="cp %FILE% /mnt/mmcblk0p1/fsl-imx6ul-alientek-emmc.dtb">write device tree to sd card</CMD>
<CMD state="Updater" type="push" body="umount /mnt/mmcblk0p1">Unmounting vfat partition</CMD>
<!-- ! burn roots -->
<CMD state="Updater" type="push" body="mkfs.ext3 -F -E nodiscard /dev/mmcblk0p2">Formatting roots partition</CMD>
<CMD state="Updater" type="push" body="mkdir -p /mnt/mmcblk0p2"></CMD>
<CMD state="Updater" type="push" body="mount -t ext3 /dev/mmcblk0p2 /mnt/mmcblk0p2"></CMD>
<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk0p2" file="files/rootfs-alientek-emmc.tar.bz2" ifdev="MX6UL MX7D MX6ULL">Sending and writing roots</CMD>
<CMD state="Updater" type="push" body="rf">Finishing roots write</CMD>
<CMD state="Updater" type="push" body="umount /mnt/mmcblk0p2">Unmounting roots partition</CMD>
<CMD state="Updater" type="push" body="echo Update Complete!">Done</CMD>
</LIST>
</UCL>
ucl2.xml 文件在此仅保留了给 EMMC 烧写系统。
二、烧写测试
MfgTool 工具修改好以后就可以进行烧写测试了,将 imx6ull-alientek-emmc.dtb、u-boot-alientek-emmc.imx 和 zImage-alientek-emmc 这三个文件复制到firmware 目录中。将 imx6ull-alientek-emmc.dtb、u-boot-alientek-emmc.imx、zImage-alientek-emmc 和 rootfs-alientek-emmc.tar.bz2 这四个文件复制到 files 目录中。
点击"mfgtool2-alientek-alpha-emmc.vbs"打开 MfgTool 烧写系统,等待烧写完成,然后设
置拨码开关为 EMMC 启动,重启开发板,系统启动信息如下图所示:
从上图 可以看出,出现" Starting kernel ... "以后就再也没有任何信息输出了,说明
Linux 内核启动失败了。接下来就是解决为何 Linux 内核启动失败这个问题。
三、解决Linux内核启动失败
上一小节我们启动系统以后发现输出"Starting kernel ...",说明启动 Linux 的时候出问题了,仔
细观察 uboot 输出的 log 信息,会发现如下图所示两行信息:

从图可以看出,在读取"imx6ull-14x14-evk.dtb"这个设备树文件的时候出错了。
重启 uboot,进入到命令行模式,输入如下命令查看 EMMC 的分区 1 里面有没有设备树文件:
mmc dev 1 //切换到 EMMC
ls mmc 1:1 //输出 EMMC1 分区 1 中的所有文件
结果如下图所示:

从上图中可以看出,此时 EMMC 的分区 1 中是存在设备树文件的,只是文件名字为:
imx6ull-alientek-emmc.dtb,因此读取 imx6ull-14x14-evk.dtb 肯定会出错的,因为根本就不存在
这个文件。之所以出现这个错误的原因是因为 uboot 里面默认的设备树名字就是 imx6ull-14x14-
evk.dtb。解决这个问题有两种方法:
3.1**、法1:重新设置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'
设置好 bootcmd 和 bootargs 这两个环境变量以后重启开发板, Linux 系统就可以正常启动。
3.2**、法2:修改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 开发板用不到,因此直接将上述代码中 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 内核启动正常。
总结
本期博客把MfgTool 这个工具改造成支持自己的开发板的版本。
