当前位置: 首页 > news >正文

64. MfgTool烧写工具详解

一、MfgTool工具简介

1、mfgtool是NXP官方做的向I.MX系列烧写系统的软件,运行在windows下。可以烧写uboot.imx、zImage、dtb,rootfs。通过USB烧写。

Mfgtool里面默认存放了NXP官方开发板的系统文件,
2、基本原理
向开发板烧系统分两部分:
1、先向开发板的DDR下载一个Linux系统,
2、通过前面下载到DDR中的Linux系统完成最终的烧写工作。

L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools\Profiles\Linux\OS Firmware下有:
files和firmware两个文件夹。
files里面保存着最终烧写到开发板中的uboo.imx、zImage、dtb以及rootfs。
Firmware里面保存着第一部的uboot.imx、zImage、dtb。

3、烧写脚本就是各种.vbs文件
在L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools下有很多.vbs文件。
.vbs脚本其实本质上是打开mfgtool2.exe,然后跟一堆的参数,linux,eMMc,board=sabresd、mmc=1、6uluboot=14x14evk、6uldtb=14x14-evk。

4、ucl2.xml文件
路径L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools\Profiles\Linux\OS Firmware。
ucl2.xml文件负责在files和firmware里面挑选合适的文件。如果是MX6ULL的话,uboot就是:firmware/u-boot-imx6ul%lite%%6uluboot%_sd.imx展开以后就是
firmware/u-boot-imx6ull14x14evk_sd.imx
根据:%lite% = l ,%6uluboot%

firmware/zImage-imx6ul%lite%-%6ulldtb%%ldo%.dtb
firmware/zImage-imx6ull-14x14-evk.dtb

二、烧写NXP官方系统

三、烧写自己的系统

首先是准备好要烧写的原材料:
①、自己移植编译出来的 uboot 可执行文件: u-boot.imx。
②、自己移植编译出来的 zImage 镜像文件和开发板对应的.dtb(设备树),对于 I.MX6UALPHA 开发板来说就是 imx6ull-alientek-emmc.dtb。
③、自己构建的根文件系统 rootfs,这里我们需要对 rootfs 进行打包,进入到 Ubuntu 中的rootfs 目录中,然后使用 tar 命令对其进行打包,命令如下:

cd rootfs/
tar -vcjf rootfs.tar.bz2 *

完成以后会在 rootfs 目录下生成一个名为 rootfs.tar.bz2 的压缩包,将 rootfs.tar.bz2 发送到windows 系统中。

烧写自己的系统。

1、firmare下的文件名
u-boot.imx
zImage
zImage.dtb

2、files下的文件名
u-boot.imx
zImage
zImage.dtb
rootf.tar.bz2

四、改造自己的烧写工具

1、确定自己的系统文件命名

2、创建自己的.vbs

mfgtool2-yocto-mx-evk-emmc-my.vbs

Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""eMMC"" -s ""board=sabresd"" -s ""mmc=1"" -s ""6uluboot=14x14evk"" -s ""6uldtb=14x14-evk"""
Set wshShell = Nothing

3、改造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>

  <LIST name="eMMC" desc="Choose eMMC as media">
	<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot.imx" ifdev="MX6ULL">Loading U-boot</CMD>
		
	<CMD state="BootStrap" type="load" file="firmware/zImage" 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="0x12C00000"
		loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</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-14x14-evk.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>


	<!-- create partition -->
	<CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD>
	<CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>
	<CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>

	<!-- burn uboot -->
	<CMD state="Updater" type="push" body="$ dd if=/dev/zero of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg</CMD>
	<!-- access boot partition -->
	<CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD>
	<CMD state="Updater" type="push" body="send" file="files/u-boot.imx" ifdev="MX6ULL">Sending u-boot.bin</CMD>
	<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sd card</CMD>
	<CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access </CMD>
	<CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>

	<!-- create fat partition -->
	<CMD state="Updater" type="push" body="$ while [ ! -e /dev/mmcblk%mmc%p1 ]; do sleep 1; echo \"waiting...\"; done ">Waiting for the partition ready</CMD>
	<CMD state="Updater" type="push" body="$ mkfs.vfat /dev/mmcblk%mmc%p1">Formatting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p1"/>
	<CMD state="Updater" type="push" body="$ mount -t vfat /dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/>	

	<!-- burn zImage -->
	<CMD state="Updater" type="push" body="send" file="files/zImage">Sending kernel zImage</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/zImage">write kernel image to sd card</CMD>

	<!-- burn dtb -->
	<CMD state="Updater" type="push" body="send" file="files/imx6ull-14x14-evk.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/imx6ull-14x14-evk.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>

	<!-- burn m4 demo bins-->
	<CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p1">Unmounting vfat partition</CMD>

	<!-- burn rootfs -->
	<CMD state="Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard /dev/mmcblk%mmc%p2">Formatting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk%mmc%p2"/>
	<CMD state="Updater" type="push" body="$ mount -t ext3 /dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/>
	<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk%mmc%p2" file="files/rootfs.tar.bz2" ifdev="MX6UL MX7D MX6ULL">Sending and writting rootfs</CMD>
	<CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
	<CMD state="Updater" type="push" body="$ umount /mnt/mmcblk%mmc%p2">Unmounting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
  </LIST>
</UCL>

4、启动测试
经过测试,uboot可以运行,但是Linux内核没启动。

U-Boot 2016.03 (Feb 04 2025 - 19:07:16 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 54C
Reset cause: POR
Board: MX6ULL MY EMMC
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
*** Warning - bad CRC, using default environment

Display: TFT4384 (800x480)
Video: 800x480x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc1(part 0) is current device
Net:   FEC1
Error: FEC1 address not set.

Normal Boot
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc1(part 0) is current device
switch to partitions #0, OK
mmc1(part 0) is current device
reading boot.scr
** Unable to read file boot.scr **
reading zImage
5582792 bytes read in 139 ms (38.3 MiB/s)
Booting from mmc ...
reading imx6ull-14x14-evk.dtb
** Unable to read file imx6ull-14x14-evk.dtb **
Kernel image @ 0x80800000 [ 0x000000 - 0x552fc8 ]

Starting kernel ...

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

mmc dev 1 

//输出 EMMC1 分区 1 中的所有文件

ls mmc 1:1 
=>  ls mmc 1:1
Unknown command '历ls' - try 'help'
=> mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
=> ls mmc 1:1
  5582792   zimage 
    36274   imx6ull-my-emmc.dtb 

2 file(s), 0 dir(s)

=> 


U-Boot 2016.03 (Feb 04 2025 - 19:07:16 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 54C
Reset cause: POR
Board: MX6ULL MY EMMC
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
*** Warning - bad CRC, using default environment

Display: TFT4384 (800x480)
Video: 800x480x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc1(part 0) is current device
Net:   FEC1
Error: FEC1 address not set.

Normal Boot
Hit any key to stop autoboot:  0 
=> fatls
fatls - list files in a directory (default /)

Usage:
fatls <interface> [<dev[:part]>] [directory]
    - list files from 'dev' on 'interface' in a 'directory'
=> fatls mmc 1:1
  5582792   zimage 
    36274   imx6ull-my-emmc.dtb 

2 file(s), 0 dir(s)

=> 

可以看出,uboot读取的dtb文件名为imx6ull-14x14-evk.dtb。实际的dtb文件名为:
imx6ull-my-emmc.dtb 。所以要修改bootcmd命令。内容如下:

setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000 imx6ull-my-emmc.dtb;bootz 80800000 - 83000000'
saveenv 

设置好以后可以启动系统,

但是根文件系统加载错误,原因是bootargs设置错误,重新设置bootargs:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' 
saveenv 

大家在测试网络的时候可能会发现网络不能用,这并不是因为我们将系统烧写到 EMMC 中以后网络坏了。仅仅是因为网络没有打开,我们用 NFS 挂载根文件系统的时候因为要使用 NFS服务,因此 Linux 内核会打开 eth0 这个网卡,现在我们不使用 NFS 挂载根文件系统,因此 Linux内核也就不会自动打开 eth0 网卡了。我们可以手动打开网卡,首先输入“ifconfig -a”命令查看一下 eth0 和 eth1 是否都存在,结果如图 39.4.3 所示:

可以看出 eth0 好 eth1 都存在,既然存在我们就打开,以打开 eth0 网卡为例,输入如下命令打开 eth0:

ifconfig eth0 up 
ifconfig 

接下来就是个 eth0 设置 IP 地址,如果你的开发板连接的路由器,那么可以通过路由器自动分配 IP 地址,命令如下:
//通过路由器分配 IP 地址

udhcpc -i eth0

如果你的开发板连接着电脑,那么就可以手动设置 IP 地址,比如设置为 192.168.1.251,命如下:
//设置 IP 地址和子网掩码

ifconfig eth0 192.168.1.251 netmask 255.255.255.0 

//添加默认网关

route add default gw 192.168.1.1

推荐大家将开发板连接到路由器上,设置好 IP 地址以后就可以测试网络了,比如 ping 一下电脑 IP 地址,或者 ping 一下百度官网。
每次开机以后都要自己手动打开网卡,然后手动设置 IP 地址也太麻烦了,有没有开机以后自动启动网卡并且设置 IP 地址的方法呢?肯定有的,我们将打开网卡,设置网卡 IP 地址的命令添加到/etc/init.d/rcS 文件中就行了,完成以后的 rcS 文件内容如下所示:

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH

#net setup 2025.3.25
ifconfig eth0 up
#udhcpc -i eth0
ifconfig eth0 192.168.31.50 netmask 255.255.255.0
route add default gw 192.168.31.1

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

#cd /drivers
#./hello &
#cd /

相关文章:

  • 在K8S中使用ArgoCD做持续部署
  • 模拟算法的应用
  • React 知识回顾(HOC、合成事件、Fiber)
  • python每日十题(10)
  • Hugging Face Spaces 介绍与使用指南
  • 茱元游戏TV2.9.3 | 适配多设备的经典街机游戏集合
  • 025-lz4
  • 21.Excel自动化:如何使用 xlwings 进行编程
  • 高斯核函数
  • Unity AzureKinect AvatarController 公开变量解释
  • 银河麒麟V10-SP3-aarch64操作系统版本 docker run时报错permission denied
  • IPv4向IPv6过渡
  • GitLab 中文版17.10正式发布,27项重点功能解读【一】
  • vue-如何将组件内容作为图片生成-html2canvas
  • C语言switch语句
  • OpenGL多纹理处理
  • 本地文生图使用插件(Stable Diffusion)
  • 【JavaWeb学校Day29】
  • 【QT5 多线程示例】信号量
  • Java面试黄金宝典13
  • 洛阳网站推广优化/app代理推广合作
  • 空间做网站/驻马店网站seo
  • 网站建设滕州信息港/seo自媒体运营技巧
  • 网易考拉的网站建设/短视频营销推广
  • 网站的论文怎么写/排名优化seo公司
  • 网站里的轮廓图 怎么做的/平台优化