linux 系统移植(第二十八期)---- 运用MfgTool 工具烧写自制的烧写自制的系统系统---- Ubuntu20.04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、改造我们自己的烧写工具

1.1、确定系统文件名字

[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 这个工具改造成支持自己的开发板的版本。

相关推荐
寂柒37 分钟前
信号量——基于环形队列的生产消费模型
linux·ubuntu
一袋米扛几楼982 小时前
【密码学】CrypTool2 工具是什么?
服务器·网络·密码学
vin_zheng3 小时前
破解企业安全软件网络拦截实战记录
运维
林姜泽樾5 小时前
Linux入门第十二章,创建用户、用户组、主组附加组等相关知识详解
linux·运维·服务器·centos
xiaokangzhe5 小时前
Linux系统安全
linux·运维·系统安全
feng一样的男子5 小时前
NFS 扩展属性 (xattr) 提示操作不支持解决方案
linux·go
南棱笑笑生5 小时前
20260310在瑞芯微原厂RK3576的Android14查看系统休眠时间
服务器·网络·数据库·rockchip
xiaokangzhe5 小时前
Nginx核心功能
运维·nginx
松果1775 小时前
以本地时钟为源的时间服务器
运维·chrony·时间服务器
XDHCOM6 小时前
ORA-32152报错咋整啊,数据库操作遇到null number问题远程帮忙修复
服务器·数据库·oracle