I.MX6ULL_Linux_系统篇(27) 系统烧录工具

news2025/7/27 12:59:32

前面我们已经移植好了 uboot 和 linux kernle,制作好了根文件系统。但是我们移植都是通过网络来测试的,在实际的产品开发中肯定不可能通过网络来运行,因此我们需要将 uboot、 linux kernel、 .dtb(设备树)和 rootfs 这四个文件烧写到板子上的 EMMC、 NAND 或 QSPI Flash 等其他存储设备上,这样不管有没有网络我们的产品都可以正常运行。本章我们就来学习一下如何使用 NXP 官方提供的 MfgTool 工具通过 USB OTG 口来烧写系统。

MfgTool 工具简介

MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件,可以在 NXP 官网下载到。L4.1.15_2.0.0-ga_mfg-tools.tar.gz。此软件在 Windows 下使用,对于我们来说太友好
了。将此压缩包进行解压,解压完成以后会出现一个名为 L4.1.15_2.0.0-ga_mfg-tools 的文件夹,进入此文件夹,此文件夹的内容如图所示:

从图中可以看出,有两个.txt 文件和两个.gz 压缩包。 .txt 文档就不去看了,重点是这两个.gz 压缩包,这两个压缩包的区别在名字上已经写的很详细了。“without-rootfs”和“with-rootfs”,一个是带 rootfs 和一个是不带 rootfs。 mfg_tools 这个工具本意是给 NXP 自己的开发板设计的烧写软件,所以肯定带有自家开发板对应的 uboot、 linux kernel 和 rootfs 的文件。我们肯定是要烧写文件系统的,所以选择 mfgtools-with-rootfs.tar.gz 这个压缩包,继续对其解压, 解压出一个名为 mfgtools-with-rootfs 的文件夹,此文件夹就包含有我们需要的烧写工具。进入目录 mfgtools-with-rootfs\mfgtools 中,在此目录下有几个文件夹和很多的.vbs 文件,如图所示:

我们只关心图中 Profiles 这个文件夹,因为后面要烧写文件就放到这个文件夹中。MfgTool2.exe 就是烧写软件,但是我们不会直接打开这个软件烧写, mfg_tools 不仅能烧写I.MX6U,而且也能给 I.MX7、 I.MX6Q 等芯片烧写,所以在烧写之前必须要进行配置,指定烧写的是什么芯片,烧写到哪里去?下面的这些众多的.vbs 文件就是配置脚本,烧写的时候通过双击这些.vbs 文件来打开烧写工具。这些.vbs 烧写脚本既可以根据处理器的不同,由用户选择向 I.MX6D、 I.MX6Q、 I.MX6S、 I.MX7、 I.MX6UL 和 I.MX6ULL 等的哪一款芯片烧写系统。也可以根据存储芯片的不同,选择向 EMMC、 NAND 或 QSPI Flash 等的哪一种存储设备烧写,功能非常强大!!我们现在需要向 I.MX6U 烧写系统,因此需要参考表所示的 5 个烧写脚本:

脚本文件描述
mfgtool2-yocto-mx-evk-emmc.vbsEMMC 烧写脚本。
mfgtool2-yocto-mx-evk-nand.vbsNAND 烧写脚本
mfgtool2-yocto-mx-evk-qspi-nor-n25q256a.vbsQSPI Flash 烧写脚本,型号为 n25q256a
mfgtool2-yocto-mx-evk-sdcard-sd1.vbs如果 SD1 和 SD2 接的 SD 卡,这两个文件分
别向 SD1 和 SD2 上的 SD 卡烧写系统。
mfgtool2-yocto-mx-evk-sdcard-sd2.vbs

其他的.vbs 烧写脚本用不到,因此可以删除掉,防止干扰我们的视线。本文用的是正点原子的 EMMC 版核心板,因此只会用到 mfgtool2-yocto-mx-evk-emmc.vbs 这个烧写脚本,如果用其他的核心板请参考相应的烧写脚本。

烧写

开发板连接电脑以后双击“ mfgtool2-yocto-mx-evk-emmc.vbs”,打开下载对话框,如图所示:

 如果出现“符合 HID 标准的供应商定义设备”就说明连接正常,可以进行烧写,如果出现其他的字符那么就要检查连接是否正确。点击“Start”按钮即可开始烧写,烧写什么东西呢?肯定是烧写 uboot、 Linux kernel、 .dtb 和 rootfs,那么这四个应该放到哪里 MfgTool 才能访问到呢?进入如下目录中:

L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware

 原理概述

文件夹“OS Firmware”看名字就知道是存放系统固件的,我们重点关注 files、 firmware 这两个文件夹,以及 ucl2.xml 这个文件。在具体看这三个文件和文件夹之前,我们先来简单了解
一下 MfgTool 烧写的原理, MfgTool 其实是先通过 USB OTG 先将 uboot、 kernel 和.dtb(设备树)这是三个文件下载到开发板的 DDR 中,注意不需要下载 rootfs。就相当于直接在开发板的 DDR
上启动 Linux 系统,等 Linux 系统启动以后再向 EMMC 中烧写完整的系统,包括 uboot、 linux kernel、 .dtb(设备树)和 rootfs,因此 MfgTool 工作过程主要分两个阶段:
①、将 firmware 目录中的 uboot、 linux kernel 和.dtb(设备树),然后通过 USB OTG 将这个文件下载到开发板的 DDR 中,目的就是在 DDR 中启动 Linux 系统,为后面的烧写做准备。
②、经过第①步的操作,此时 Linux 系统已经运行起来了,系统运行起来以后就可以很方便的完成对 EMMC 的格式化、分区等操作。 EMMC 分区建立好以后就可以从 files 中读取要烧写的 uboot、 linux kernel、 .dtb(设备树)和 rootfs 这 4 个文件,然后将其烧写到 EMMC 中,这个就是 MfgTool 的大概工作流程。

打开 firmware 文件夹,里面有很多的.imx 结尾的 uboot 文件、一个 zImage 镜像文件、很多.dtb结尾的设备树文件。这些文件都是NXP官方开发板使用的,不同的板子使用不同的文件,其中我们需要关心的只有表中的这三个文件:

脚本文件描述
zImageNXP 官方 I.MX6ULL EVK 开发板的 Linux 镜像文件。
u-boot-imx6ull14x14evk_emmc.imxNXP 官方 I.MX6ULL EVK 开发板的 uboot 文件。
zImage-imx6ull-14x14-evk-emmc.dtbNXP 官方 I.MX6ULL EVK 开发板的设备树

表中的这三个文件就是 I.MX6ULL EVK 开发板烧写系统的时候第一阶段所需的文件。如果要烧写我们的系统,就需要用我们编译出来的 zImage、 u-boot.imx 和 imx6ull-alientekemmc.dtb 这三个文件替换掉表 39.2.2.1 中这三个文件。但是名字要和表 39.2.2.1 中的一致,因此需要将 u-boot.imx 重命名为 u-boot-imx6ull14x14evk_emmc.imx,将 imx6ull-alientek-emmc.dtb重命名为 zImage-imx6ull-14x14-evk-emmc.dtb。

将表中的这三个文件下载到开发板的 DDR 上以后烧写的第一阶段就完成了,第二阶段就是从 files 目录中读取整个系统文件,并将其烧写到 EMMC 中。 files 目录中的文件和firmware 目录中的基本差不多,都是不同板子对应的 uboot、设备树文件,同样,我们只关心表中的四个文件:

脚本文件描述
zImageNXP 官方 I.MX6ULL EVK 开发板的 Linux 镜像文件。
u-boot-imx6ull14x14evk_emmc.imxNXP 官方 I.MX6ULL EVK 开发板的 uboot 文件。
zImage-imx6ull-14x14-evk-emmc.dtbNXP 官方 I.MX6ULL EVK 开发板的设备树
rootfs_nogpu.tar.bz2根文件系统,注意和另外一个 rootfs.tar.bz2 根文件系
统区分开。 nogpu 表示此根文件系统不包含 GPU 的内
容, I.MX6ULL 没有 GPU,因此要使用此根文件系统

如果要烧写我们自己编译出来的系统,就需要用我们编译出来的 zImage、 u-boot.imx 和imx6ull-alientek-emmc.dtb 和 rootfs 这四个文件替换掉表中这四个文件。

files 和 firmware 目录下有众多的 uboot 和设备树,那么烧写的时候究竟选择哪一个呢?这个工作就是由 ucl2.xml 文件来完成的。 ucl2.xml 以“<UCL>”开始,以“</UCL>”结束。“<CFG>”
和“</CFG>”之间是配置相关内容,主要是判断当前是给 I.MX 系列的哪个芯片烧写系统。“<LIST>”和“</LIST>”之间的是针对不同存储芯片的烧写命令。整体框架如下:

<UCL>
<CFG>
......
<!-- 判断向 I.MX 系列的哪个芯片烧写系统 -->
......
</CFG>
<LIST name="SDCard" desc="Choose SD Card as media">
<!-- 向 SD 卡烧写 Linux 系统 -->
</LIST>
<LIST name="eMMC" desc="Choose eMMC as media">
<!-- 向 EMMC 烧写 Linux 系统 -->
</LIST>
<LIST name="Nor Flash" desc="Choose Nor flash as media">
<!-- 向 Nor Flash 烧写 Linux 系统 -->
</LIST>
<LIST name="Quad Nor Flash" desc="Choose Quad Nor flash as media">
<!-- 向 Quad Nor Flash 烧写 Linux 系统 -->
</LIST>
<LIST name="NAND Flash" desc="Choose NAND as media">
<!-- 向 NAND Flash 烧写 Linux 系统 -->
</LIST>
<LIST name="SDCard-Android" desc="Choose SD Card as media">
<!-- 向 SD 卡烧写 Android 系统 -->
</LIST>
<LIST name="eMMC-Android" desc="Choose eMMC as media">
<!-- 向 EMMC 烧写 Android 系统 -->
</LIST>
<LIST name="Nand-Android" desc="Choose NAND as media">
<!-- 向 NAND Flash 烧写 Android 系统 -->
</LIST>
<LIST name="SDCard-Brillo" desc="Choose SD Card as media">
<!-- 向 SD 卡烧写 Brillo 系统 -->
</LIST>
</UCL>

ucl2.xml 首先会判断当前要向 I.MX 系列的哪个芯片烧写系统,代码如下:

21 <CFG>
22 <STATE name="BootStrap" dev="MX6SL" vid="15A2" pid="0063"/>
23 <STATE name="BootStrap" dev="MX6D" vid="15A2" pid="0061"/>
24 <STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/>
25 <STATE name="BootStrap" dev="MX6SX" vid="15A2" pid="0071"/>
26 <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
27 <STATE name="BootStrap" dev="MX7D" vid="15A2" pid="0076"/>
28 <STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
29 <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
30 </CFG>

通过读取芯片的VID 和PID 即可判断出当前要烧写什么处理器的系统,如果VID=0X15A2,PID=0080,那么就表示要给 I.MX6ULL 烧写系统。确定了处理器以后就要确定向什么存储设备烧写系统,这个时候就要有请 mfgtool2-yocto-mx-evk-emmc.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

重点是“wshShell.run”这一行,这里一行调用了 mfgtool2.exe 这个软件,并且还给出了一堆的参数,其中就有“eMMC”字样,说明是向 EMMC 烧写系统,要烧写的存储设备就这样确定下来了。“wshShell.run”后面还有一堆的其他参数,这些参数都有对应的值,如下所示:

board=sabresd
mmc=1
6uluboot=14x14evk
6uldtb=14x14-evk

我们继续回到 ucl2.xml 中,既然现在已经知道了是向 I.MX6ULL 的 EMMC 中烧写系统,那么直接在 ucl2.xml 中找到相应的烧写命令就行了,因为相应的命令太长,为了缩小篇幅,我们就以 uboot 的烧写为例讲解一下。前面说了烧写分两个阶段,第一步是通过 USB OTG 向 DDR中下载系统,第二步才是正常的烧写。通过 USB OTG 向 DDR 下载 uboot 的命令如下:

<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/uboot-imx6ul%lite%%6uluboot%_emmc.imx" ifdev="MX6ULL">Loading U-boot
</CMD>

上面的命令就是BootStrap阶段,也就是第一阶段,“file”表示要下载的文件位置,在firmware目录下,文件名字为

u-boot-imx6ul%lite%%6uluboot%_emmc.imx

在 L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools-with-rootfs\mfgtools 下找到 cfg.ini 文件,该文件里包含了开发板的一些信息,查看 cfg.ini 文件可得 lite=l 以及一些字符串代表的值。
“%lite%”和“%6uluboot%”分别表示取 lite 和 6uluboot 的值,而 lite=l, 6uluboot=14x14evk,因此将这个值代入以后就是:

u-boot-imx6ull14x14evk _emmc.imx

所以,这里向 DDR 中下载的是 firmware/ u-boot-imx6ull14x14evk _emmc.imx 这个 uboot 文件。同样的方法将.dtb(设备树)和 zImage 都下载到 DDR 中以后就会跳转去运行 OS,这个时候
会在 MfgTool 工具中会有“Jumping to OS image”提示语句, ucl2.xml 中的跳转命令如下:

<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

启动 Linux 系统以后就可以在 EMMC 上创建分区,然后烧写 uboot、 zImage、 .dtb(设备树)和根文件系统。这个就是 MfgTool 的整个烧写原理,弄懂了烧写原理以后就可以开始试着先将 NXP 官方的系统烧写到正点原子的 I.MX6U-ALPHA 开发板中。
 

改造 MfgTool

在上一小节中我们已经实现了将自己的系统烧写到开发板中,我们通过将 NXP 官方的系统更换成我们自己制作的系统来完成系统烧写,本节我们就来学习一下如何将 MfgTool 这个工具改造成我们自己的工具,让其支持我们自己的开发板。要改造 MfgTool,重点是三方面:
①、针对不同的核心版,确定系统文件相关名字。
②、新建我们自己的.vbs 文件。
③、修改 ucl2.xml 文件。
确定系统文件名字完全是为了兼容不同的产品,比如某个产品有 NAND 和 EMMC 两个版本, 那么 EMMC 和 NAND 这两个版本的 uboot、 zImage、 .dtb 和 rootfs 有可能不同。为了在MfgTool 工具中同时支持 EMMC 和 NAND 这两个版本的核心板, EMMC 版本的系统文件命名如图所示:

直接复制 mfgtool2-yocto-mx-evk-emmc.vbs 文件即可,将新复制的文件重命名为 mfgtool2-alientek-alpha-emmc.vbs,文件内容不要做任何修改, .vbs 文件我们就新建好了。

在修改 ucl2.xml 文件之前,先保存一份原始的 ucl2.xml。将 ucl2.xml 文件改为如下所示内容:
 

<!--
* Copyright (C) 2012, Freescale Semiconductor, Inc. All Rights Reserved.
* The CFG element contains a list of recognized usb devices.
*  DEV elements provide a name, class, vid and pid for each device.
*
* Each LIST element contains a list of update instructions.
*  "Install" - Erase media and install firmware.
*  "Update" - Update firmware only.
*
* Each CMD element contains one update instruction of attribute type.
*  "pull" - Does UtpRead(body, file) transaction.
*  "push" - Does UtpWrite(body, file) transaction.
*  "drop" - Does UtpCommand(body) then waits for device to disconnect.
*  "boot" - Finds configured device, forces it to "body" device and downloads "file".
*  "find" - Waits for "timeout" seconds for the "body" device to connect.
*  "show" - Parse and show device info in "file".  
-->


<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="SDCard" desc="Choose SD Card as media">
	<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ull-14x14-sd.imx" ifdev="MX6ULL">Loading U-boot</CMD>
		
	<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
		loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading Kernel.</CMD>

	<CMD state="BootStrap" type="load" file="firmware/fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot" address="0x83800000"
		loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading Initramfs.</CMD>

	<CMD state="BootStrap" type="load" file="firmware/imx6ull-14x14-sd.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/mmcblk0"> Partitioning...</CMD>

	<!-- burn uboot -->
	<CMD state="Updater" type="push" body="$ dd if=/dev/zero of=/dev/mmcblk0 bs=1k seek=768 conv=fsync count=8">clear u-boot env</CMD>
	<CMD state="Updater" type="push" body="send" file="files/boot/u-boot-imx6ull-14x14-ddr%ddr%-%board%%boot%.imx" ifdev="MX6ULL">Sending u-boot.bin</CMD>
	<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk0 bs=1k seek=1 conv=fsync">write u-boot.bin to sd card</CMD>

	<!-- format and mount boot 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 -F 32 -n \"boot\" /dev/mmcblk0p1">Formatting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk0p1"/>
	<CMD state="Updater" type="push" body="$ mount -t vfat /dev/mmcblk0p1 /mnt/mmcblk0p1"/>

	<!-- burn logo -->
	<!--<CMD state="Updater" type="push" body="send" file="files/alientek.bmp">Sending logo</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk0p1/alientek.bmp">write boot logo to sd card</CMD> >

	<!-- burn zImage -->
	<CMD state="Updater" type="push" body="send" file="files/boot/zImage">Sending kernel</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/boot/imx6ull-14x14-%board%-4.3-480x272-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk0p1/imx6ull-14x14-%board%-4.3-480x272-c.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>
	
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-%board%-4.3-800x480-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk0p1/imx6ull-14x14-%board%-4.3-800x480-c.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-%board%-7-800x480-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk0p1/imx6ull-14x14-%board%-7-800x480-c.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-%board%-7-1024x600-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk0p1/imx6ull-14x14-%board%-7-1024x600-c.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-%board%-10.1-1280x800-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk0p1/imx6ull-14x14-%board%-10.1-1280x800-c.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>
	
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-%board%-hdmi.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk0p1/imx6ull-14x14-%board%-hdmi.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>
	
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-%board%-vga.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk0p1/imx6ull-14x14-%board%-vga.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>
	<CMD state="Updater" type="push" body="$ sleep 1">delay</CMD>
	<CMD state="Updater" type="push" body="$ sync">Sync...</CMD>
	<CMD state="Updater" type="push" body="$ umount /mnt/mmcblk0p1">Unmounting vfat partition</CMD>

	<!-- format and mount rootfs partition -->
	<CMD state="Updater" type="push" body="$ mkfs.ext3 -F -j -L \"rootfs\" /dev/mmcblk0p2">Formatting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk0p2"/>
	<CMD state="Updater" type="push" body="$ mount -t ext3 /dev/mmcblk0p2 /mnt/mmcblk0p2"/>

	<!-- burn rootfs -->
	<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk0p2" file="files/filesystem/rootfs.tar.bz2" ifdev="MX6ULL">Sending and writting rootfs</CMD>
	<CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk0p2/lib/modules">Mkdir -p /mnt/mmcblk0p2/lib/modules</CMD>
	<CMD state="Updater" type="push" body="send" file="files/modules/modules.tar.bz2" ifdev="MX6ULL">Sending Modules file</CMD>
	<CMD state="Updater" type="push" body="$ tar jxf $FILE -C /mnt/mmcblk0p2/lib/modules/" ifdev="MX6ULL">tar Modules file</CMD>
	<CMD state="Updater" type="push" body="$ sleep 1">delay</CMD>
	<CMD state="Updater" type="push" body="$ sync">Sync...</CMD>
	<CMD state="Updater" type="push" body="$ umount /mnt/mmcblk0p2">Unmounting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
  </LIST>


  <LIST name="eMMC" desc="Choose eMMC as media">
	<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ull-14x14-emmc.imx" ifdev="MX6ULL">Loading U-boot</CMD>
		
	<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
		loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading Kernel.</CMD>

	<CMD state="BootStrap" type="load" file="firmware/fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot" address="0x83800000"
		loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading Initramfs.</CMD>

	<CMD state="BootStrap" type="load" file="firmware/imx6ull-14x14-emmc.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/mmcblk1"> Partitioning...</CMD>

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

	<!-- format and mount boot partition -->
	<CMD state="Updater" type="push" body="$ while [ ! -e /dev/mmcblk1p1 ]; do sleep 1; echo \"waiting...\"; done ">Waiting for the partition ready</CMD>
	<CMD state="Updater" type="push" body="$ mkfs.vfat -F 32 /dev/mmcblk1p1">Formatting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk1p1"/>
	<CMD state="Updater" type="push" body="$ mount -t vfat /dev/mmcblk1p1 /mnt/mmcblk1p1"/>

	<!-- burn logo -->
	<!--<CMD state="Updater" type="push" body="send" file="files/alientek.bmp">Sending Boot Logo</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/alientek.bmp">write boot logo to sd card</CMD> >

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

	<!-- burn dtb -->
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-emmc-4.3-480x272-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/imx6ull-14x14-emmc-4.3-480x272-c.dtb" ifdev="MX6ULL">write device tree to eMMC card</CMD>
	
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-emmc-4.3-800x480-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/imx6ull-14x14-emmc-4.3-800x480-c.dtb" ifdev="MX6ULL">write device tree to eMMC card</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-emmc-7-800x480-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/imx6ull-14x14-emmc-7-800x480-c.dtb" ifdev="MX6ULL">write device tree to eMMC card</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-emmc-7-1024x600-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/imx6ull-14x14-emmc-7-1024x600-c.dtb" ifdev="MX6ULL">write device tree to eMMC card</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-emmc-10.1-1280x800-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/imx6ull-14x14-emmc-10.1-1280x800-c.dtb" ifdev="MX6ULL">write device tree to eMMC card</CMD>
	
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-emmc-hdmi.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/imx6ull-14x14-emmc-hdmi.dtb" ifdev="MX6ULL">write device tree to eMMC card</CMD>
	
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-emmc-vga.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk1p1/imx6ull-14x14-emmc-vga.dtb" ifdev="MX6ULL">write device tree to eMMC card</CMD>
	
	<CMD state="Updater" type="push" body="$ sleep 1">delay</CMD>
	<CMD state="Updater" type="push" body="$ sync">Sync...</CMD>
	<CMD state="Updater" type="push" body="$ umount /mnt/mmcblk1p1">Unmounting vfat partition</CMD>

	<!-- format and mount rootfs partition -->
	<CMD state="Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard /dev/mmcblk1p2">Formatting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk1p2"/>
	<CMD state="Updater" type="push" body="$ mount -t ext3 /dev/mmcblk1p2 /mnt/mmcblk1p2"/>

	<!-- burn rootfs -->
	<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblk1p2" file="files/filesystem/rootfs.tar.bz2" ifdev="MX6ULL">Sending and writting rootfs</CMD>
	<CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
	<CMD state="Updater" type="push" body="send" file="files/modules/modules.tar.bz2" ifdev="MX6ULL">Sending Modules file</CMD>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mmcblk1p2/lib/modules">Mkdir -p /mnt/mmcblk1p2/lib/modules</CMD>
	<CMD state="Updater" type="push" body="$ tar jxf $FILE -C /mnt/mmcblk1p2/lib/modules/" ifdev="MX6ULL">tar Modules file</CMD>
	<CMD state="Updater" type="push" body="$ sleep 1">delay</CMD>
	<CMD state="Updater" type="push" body="$ sync">Sync...</CMD>
	<CMD state="Updater" type="push" body="$ umount /mnt/mmcblk1p2">Unmounting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
  </LIST>


  <LIST name="NAND Flash" desc="Choose NAND as media">
	<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ull-14x14-nand.imx" ifdev="MX6ULL">Loading U-boot</CMD>

	<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
		loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading Kernel.</CMD>

	<CMD state="BootStrap" type="load" file="firmware/fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot" address="0x83800000"
				loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading Initramfs.</CMD>

	<CMD state="BootStrap" type="load" file="firmware/imx6ull-14x14-nand.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>

	<!--burn the uboot to NAND: -->	
	<CMD state="Updater" type="push" body="$ mount -t debugfs debugfs /sys/kernel/debug">Mounting debugfs</CMD>
	<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd0 0 0">Erasing Boot partition</CMD>
	<CMD state="Updater" type="push" body="send" file="files/boot/u-boot-imx6ull-14x14-ddr%ddr%-nand.imx" ifdev="MX6ULL">Sending u-boot.bin</CMD>
	<CMD state="Updater" type="push" body="$ kobs-ng init -x -v --chip_0_device_path=/dev/mtd0 $FILE">Flashing Bootloader</CMD>

	<!--erase env partition: -->
	<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd1 0 0">Erasing Env partition</CMD>

	<!--burn the logo to NAND: -->
	<!--<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd2 0 0">Erasing Logo partition</CMD>
	<CMD state="Updater" type="push" body="send" file="files/alientek.bmp">Sending Boot Logo</CMD>
	<CMD state="Updater" type="push" body="$ nandwrite -p /dev/mtd2 $FILE">Flashing Logo</CMD>>

	<!--burn the dtb to NAND: -->
	<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd3 0 0">Erasing dtb partition</CMD>
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-nand-4.3-480x272-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ nandwrite -p /dev/mtd3 $FILE">Flashing dtb</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-nand-4.3-800x480-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ nandwrite -s 0x20000 -p /dev/mtd3 $FILE">Flashing dtb</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-nand-7-800x480-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ nandwrite -s 0x40000 -p /dev/mtd3 $FILE">Flashing dtb</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-nand-7-1024x600-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ nandwrite -s 0x60000 -p /dev/mtd3 $FILE">Flashing dtb</CMD>

	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-nand-10.1-1280x800-c.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ nandwrite -s 0x80000 -p /dev/mtd3 $FILE">Flashing dtb</CMD>
	
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-nand-hdmi.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ nandwrite -s 0xa0000 -p /dev/mtd3 $FILE">Flashing dtb</CMD>
	
	<CMD state="Updater" type="push" body="send" file="files/boot/imx6ull-14x14-nand-vga.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
	<CMD state="Updater" type="push" body="$ nandwrite -s 0xc0000 -p /dev/mtd3 $FILE">Flashing dtb</CMD>

	<!--burn the kernel to NAND: -->
	<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd4 0 0">Erasing Kernel partition</CMD>
	<CMD state="Updater" type="push" body="send" file="files/boot/zImage">Sending kernel zImage</CMD>
	<CMD state="Updater" type="push" body="$ nandwrite -p /dev/mtd4 $FILE">Flashing Kernel</CMD>

	<!--burn the rootfs to NAND: -->
	<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd5 0 0">Erasing rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ ubiformat /dev/mtd5"/>
	<CMD state="Updater" type="push" body="$ ubiattach /dev/ubi_ctrl -m 5">Attaching UBI partition</CMD>
	<CMD state="Updater" type="push" body="$ ubimkvol /dev/ubi0 -Nrootfs -m"/>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mtd5"/>
	<CMD state="Updater" type="push" body="$ mount -t ubifs ubi0:rootfs /mnt/mtd5"/>
	<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mtd5" file="files/filesystem/rootfs.tar.bz2" ifdev="MX6ULL">Sending and writting rootfs</CMD>
	<CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
	<CMD state="Updater" type="push" body="send" file="files/modules/modules.tar.bz2" ifdev="MX6ULL">Sending Modules file</CMD>
	<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mtd5/lib/modules">mkdir -p /mnt/mtd5/lib/modules</CMD>
	<CMD state="Updater" type="push" body="$ tar jxf $FILE -C /mnt/mtd5/lib/modules/" ifdev="MX6ULL">tar Modules file</CMD>
	<CMD state="Updater" type="push" body="$ sleep 1">delay</CMD>
	<CMD state="Updater" type="push" body="$ sync">Sync...</CMD>
	<CMD state="Updater" type="push" body="$ umount /mnt/mtd5">Unmounting rootfs partition</CMD>
	<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
  </LIST>
</UCL>

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 启动,重启开发板。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx学习 (2) —— 虚拟主机配置

文章目录虚拟主机原理域名解析与泛域名解析&#xff08;实践&#xff09;配置文件中ServerName的匹配规则技术架构多用户二级域名短网址虚拟主机原理 为什么需要虚拟主机&#xff1a; 当一台主机充当服务器给用户提供资源的时候&#xff0c;并不是一直都有很大的用户量&#…

数据库面试题总结——DBA面试battle指南

目录 前言 数据库复制 oracle和pg的同步原理 mysql的同步原理 mysql的GTID 主从架构如何保证数据不丢失 oracle的保护模式 pg的日志传输模​​​​​​​式 mysql同步模式 从库只读 oracle的只读 pg的只读 mysql的只读 索引结构和寻迹 B树索引 索引寻迹 绑定执…

nacos源码入门

nacos官方文档地址&#xff1a;nacos官方文档 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 简单来说&#xff0c;nacos就是一个注册中心、配置中心&#xff0…

灯具照明行业MES系统,助力企业实现数字化转型

灯具照明行业在制造领域&#xff0c;是典型的高科技离散生产制造模式&#xff0c;大部分企业都设置&#xff1a;电源组件、光源组件、或光电一体组件 &#xff0c;工艺以SMT、DIP等。 灯罩主要采用吸塑工艺及模具加工&#xff1b;其它金属的面盖、灯体、灯盒基本都是采用压铸、…

传送点遍历分析

由于《天涯明月刀》的地图较大&#xff0c;所以每个地图中会分布很多的传送点&#xff0c;而这些传送点都可以在访问过地图之后以“御风神行”这类技能进行传送。为了能够很好的利用这类技能&#xff0c;提高外挂的效率&#xff0c;传送点的遍历是必不可少的。 首先找一个可以…

代码随想录算法训练营第七天|454.四数相加II 、 383. 赎金信 、 15. 三数之和 、18. 四数之和

454.四数相加II 454.四数相加II介绍给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a;思路因为是存放在数组里不同位置的元素&#xff0c;因此不需要考虑去重的操作&#xff0c;而…

深度学习算法简要总结系列

今天突发奇想&#xff0c;准备一个总结系列&#xff0c;以备面试只需&#xff0c;嘿嘿&#xff0c;忘了就回来看看&#xff0c;以框架流程为主&#xff0c;不涉及细节、 点云 pointnet 代码仓库 https://github.com/yanx27/Pointnet_Pointnet2_pytorch 参考博客 论文阅读笔记 …

java单元测试批处理数据模板【亿点点日志配合分页以及多线程处理】

文章目录引入相关资料环境准备分页查询处理&#xff0c;减少单次批量处理的数据量级补充亿点点日志&#xff0c;更易观察多线程优化查询_切数据版多线程_每个线程都分页处理引入 都说后端开发能顶半个运维&#xff0c;我们经常需要对大量输出进行需求调整&#xff0c;很多时候…

Umi + React + Ant Design Pro 项目实践(一)—— 项目搭建

学习一下 Umi、 Ant Design 和 Ant Design Pro 从 0 开始创建一个简单应用。 首先&#xff0c;新建项目目录&#xff1a; 在项目目录 D:\react\demo 中&#xff0c;安装 Umi 脚手架&#xff1a; yarn create umi # npm create umi安装成功&#xff1a; 接下来&#xff0c;…

《OpenGL宝典》--纹理

文章目录创建并初始化纹理创建纹理更新纹理数据纹理目标和类型从着色器中读取纹理数据采样器类型使用texelFetch内置函数从着色器读取纹理使用texture&#xff08;&#xff09;函数从着色器读取纹理获取更多信息控制纹理数据的读取方式使用采样器对象存储采样器包装和过滤模式的…

AVL树的介绍和实现

我们知道&#xff0c;二叉搜索树是会出现单向的。单向在查找时效率是非常低的&#xff0c;时间复杂度会退化成O(N)&#xff0c;而AVL树就是解决这个问题。 文章目录1. AVL 树1.1 AVL树的概念1.2 AVL树节点的定义1.3 插入后的平衡因子1.4 AVL树的旋转1.4.1 右右&#xff1a;左单…

JavaScript 循环实例集合

文章目录JavaScript 循环实例集合For 循环循环输出 HTML 标题While 循环Do while 循环break 语句continue 语句使用 For...In 声明来遍历数组内的元素JavaScript 循环实例集合 For 循环 源码 <!DOCTYPE html> <html> <head> <meta charset"utf-8&q…

PG数据库入门知识

前言 Linux和windows的路劲分隔符是不同的&#xff0c;Linux下是斜杠/,而windows是反斜杠&#xff08;\&#xff09;。但在PG里window下也要使用linux的/作为路劲分隔符。 基础知识 为什么选择PG PostgreSQL是一款企业级关系型数据库管理系统。PostgreSQL之所以如此特别&am…

如何成为程序员中的牛人/高手?

目录 一、牛人是怎么成为牛人的&#xff1f; 二、关于牛人的一点看法 三、让程序员与业务接壤&#xff0c;在开发团队中“升级” 四、使用低代码平台 目标效果 五、最后 祝伟大的程序员们梦想成真、码到成功&#xff01; 一、牛人是怎么成为牛人的&#xff1f; 最近在某…

Android开发学习—手机开机启动的AMS流程

前言 AMS是Android中最核心的服务&#xff0c;主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作&#xff0c;其职责与操作系统中的进程管理和调度模块相类似&#xff0c;因此它在Android中非常重要。 客户端使用ActivityManager类。由于AMS是系统核心服…

浅谈ChatGPT 和 对AI 的思考

新世纪以来&#xff0c;人工智能作为一个非常热门话题&#xff0c;一直收到大众的广泛的关注。从一开始的图像的分类&#xff0c;检测&#xff0c;到人脸的识别&#xff0c;到视频分析分类&#xff0c;到事件的监测&#xff0c;到基于图片的文本生成&#xff0c;到AI自动写小说…

机器学习-卷积神经网络CNN中的单通道和多通道图片差异

背景 最近在使用CNN的场景中&#xff0c;既有单通道的图片输入需求&#xff0c;也有多通道的图片输入需求&#xff0c;因此又整理回顾了一下单通道或者多通道卷积的差别&#xff0c;这里记录一下探索过程。 结论 直接给出结论&#xff0c;单通道图片和多通道图片在经历了第一…

QUIC 多流桥接、新增 DDS 协议转换代理

驽马十驾&#xff0c;功在不舍。新春之交&#xff0c;NanoMQ 继续保持稳步更新&#xff0c;最新的 0.16 版本将于三月初发布。NanoMQ 为用户提供了 2 个重要新功能&#xff1a;MQTT over QUIC 的多流桥接和 DDS 协议转换代理&#xff0c;拓宽了 NanoMQ 的弱网桥接传输性能和在边…

08 CSS05

目标&#xff1a; 1、定位 2、装饰 3、选择器拓展 一、定位 1、定位的基本介绍 2、定位的基本使用 3、静态定位 4、相对定位 5、绝对定位 6、子绝父相 7、固定定位 8、元素的层级关系1、定位的基本介绍 1.1 网页常见布局方式 &#xff08;1&#xff09;标准流 块级元素独…

CVTE前端面经(2023)

CVTE前端面经项目介绍&#xff08;重点&#xff09;在数据B中找到数组A对应的值&#xff0c;并把数组B对应的值放在数据最前面css1 定位2 外边距3 css高级应用3.1. 过渡3.2. 变形2. 浮动2.1 浮动元素特点2. 2 清除浮动3. html5语义标签4. 实现圣杯布局的两种方式4.1 定位浮动4.…