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

相关推荐
太理摆烂哥5 小时前
Linux基础指令
linux·运维·服务器
xkxnq5 小时前
第四阶段:Vue 进阶与生态整合(第 58 天)(Vue 项目部署:打包、上线与服务器配置)
服务器·前端·vue.js
昨夜见军贴06165 小时前
合规性管理的现代化实践:IACheck的AI审核如何系统提升生产型检测报告的合规水平
大数据·运维·人工智能
Doro再努力5 小时前
【Linux04】 Linux基础指令完结与Linux权限初识(一)
linux·运维·服务器
江畔何人初5 小时前
k8s中namespace与容器cgroup区别
linux·运维·云原生
DARLING Zero two♡5 小时前
白板协作总卡壳?Tldraw+cpolar 解锁跨地域实时共创
服务器
草莓熊Lotso5 小时前
远程控制软件实测!2026年1月远程软件从“夯”到“拉”全功能横评
运维·服务器·数据库·人工智能
次旅行的库5 小时前
不能将windows本地虚拟环境打包到实验室服务器
linux·windows·conda
沐雪架构师5 小时前
LangChain 1.0 记忆管理:短期与长期记忆详解
服务器·数据库·langchain