,
39.5.1 改造 MfgTool
本节我们就来学习一下如何将 MfgTool 这个工具改造成我们自己的工具,让其支持我们自己的开发板。要
改造 MfgTool,重点是三方面:
①、针对不同的核心版,确定系统文件相关名字。
②、新建我们自己的.vbs 文件。
③、 修改 ucl2.xml 文件。
1、确定系统文件名字
确定系统文件名字完全是为了兼容不同的产品,比如某个产品有 NAND 和 EMMC 两个版
本,那么 EMMC 和 NAND 这两个版本的 uboot、 zImage、 .dtb 和 rootfs 有可能不同。
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 Uboot</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-alientekemmc" 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-alientekemmc.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>
...
ucl2.xml 文件我们仅仅保留了给 EMMC 烧写系统,如果要支持 NAND 的话可以自行参考
原版的 ucl2.xml 文件,添加相关的内容。
39.5.2 烧写测试
MfgTool 工具修改好以后就可以进行烧写测试了,将 imx6ull-alientek-emmc.dtb、 u-bootalientek-emmc.imx 和 zImage-alientek-emmc 这 三 个 文 件 复 制 到 mfgtools-withrootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录中。将 imx6ull-alientek-emmc.dtb、u-bootalientek-emmc.imx、 zImage-alientek-emmc 和 rootfs-alientek-emmc.tar.bz2 这四个文件复制到
mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files 目录中。
点击“ mfgtool2-alientek-alpha-emmc.vbs”打开 MfgTool 烧写系统,等待烧写完成,然后设
置拨码开关为 EMMC 启动,重启开发板
39.5.3 解决 Linux 内核启动失败
上一小节我们启动系统以后发现输出“ Starting kernel ...”以后就再也没有任何信息了,难
道是系统烧写错误了?可以确定的是 uboot 启动正常,就是在启动 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,这个我们在讲解 uboot 的时候就已经说过了。解决方法很简单,有两种方法:
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'
saveenv
设置好 bootcmd 和 bootargs 这两个环境变量以后重启开发板, Linux 系统就可以正常启动。
2、修改 uboot 源码
第 1 种方法每次重新烧写系统以后都要先手动设置一下 bootcmd 的值,这样有点麻烦,有
没有一劳永逸的方法呢?肯定是有的,就是直接修改 uboot 源码。打开 uboot 源码中的文件
include/configs/mx6ull_alientek_emmc.h,在宏 CONFIG_EXTRA_ENV_SETTINGS 中找到如下所
示内容:
示例代码 39.5.3.1 查找设备树文件
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 的值改为如下内
容:
示例代码 39.5.3.1 查找设备树文件
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 内核启动正常。
很抱歉,你的问题是关于红绿灯图片需要讲解实现方式,参考资料中都与此无关,无法为您提供具体的解决方案。建议您提供更详细的信息和要求。感谢您的理解。