linux 系统移植(第二十八期)---- 运用MfgTool 工具烧写自制的烧写自制的系统系统---- Ubuntu20.04
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
一、改造我们自己的烧写工具
1.1、确定系统文件名字
1.2、新建.vbs 文件
1.3、修改 ucl2.xml 文件
二、烧写测试
编辑
三、解决 Linux 内核启动失败
3.1、法1:重新设置 bootcmd 环境变量值
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 文件改为如下所示内容:
Loading U-boot
Loading Kernel
Loading Initramfs.
Loading device tree.
Jumping to OS image.
Sending partition shell
Partitioning..
Partitioning..
/sys/block/mmcblk0boot0/force_ro
Sending u-boot.bin
Write U-boot to sd card
/sys/block/mmcblk0boot0/force_ro
enable boot partition 1 to boot
Waiting for the partition ready
Formatting roots partition
Sending Kernel Image
Write kernel image to sd card
Sending Device Tree file
write device tree to sd card
Unmounting vfat partition
Formatting roots partition
Sending and writing roots
Finishing roots write
Unmounting roots partition
Done
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 启动,重启开发板,系统启动信息如下图所示:
三、解决 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'
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; "
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; "
第 196 行,如果 fdt_file 未定义的话,直接设置 fdt_file= imx6ull-alientek-emmc.dtb,简单直
接,不需要任何的判断语句。修改以后重新编译 uboot,然后用将新的 uboot 烧写到开发板中,
烧写完成以后重启测试,Linux 内核启动正常。
总结
本期博客把MfgTool 这个工具改造成支持自己的开发板的版本。






