FEATURED · 精选文章

i.MX 6ULL eMMC烧录实战:MFGTool与Ubuntu 18.04部署

发布时间 / 2026/9/15 15:30:48
来源 / 创域科博编辑部
栏目 / 资讯中心
i.MX 6ULL eMMC烧录实战:MFGTool与Ubuntu 18.04部署 简介野火EBF 6ULL开发板烧录Ubuntu 18.04至emmc的mfgtool工具包面向嵌入式Linux开发与运维人员解决在6ULL平台刷写系统固件的关键需求。包内共595个文件包含238个dtb设备树、182个imx镜像、97个vbs脚本、tar/bz2根文件系统压缩包、bin/u-boot引导文件以及docx操作文档等整体约538MB可完整支撑从驱动加载到系统镜像写入的烧录流程。已有689人浏览学习适用于需要快速部署Ubuntu 18.04服务器或进行嵌入式系统二次开发的场景。工具包还提供了多种配置文件与批处理脚本用户可按需选用emmc、SD卡等不同介质配合mfgtool命令行接口完成固件烧录与验证并参考文档中的排错思路解决常见连接与格式问题无论是学习嵌入式Linux启动流程还是为现网设备定制系统镜像都能从中找到可复用的参考文件。整体目录结构清晰bootloader、kernel、rootfs各组件分层明确方便开发者按需替换或调试。1. i.MX 6ULL 的 eMMC 烧录为什么必须用 MFGTool很多玩 i.MX 6ULL 的人第一块板是从 SD 卡启动的dd 一个镜像进去就完事。但拿到野火 EBF 6ULL 的 eMMC 版本那一套就不灵了eMMC 内部有 FTL 和坏块管理Boot0/Boot1 分区要按地址精确写入普通读卡器方案行不通。MFGTool 是 NXP 官方量产烧录工具通过 USB OTG 先把 U-Boot 拉进内存再由 U-Boot 接管 eMMC 写入。这篇文章从工具包文件拆解开始给出 Ubuntu 18.04 烧录的完整流程最后讲 eMMC 的 TRIM、磨损均衡和运维配置。适合准备把 Ubuntu 18.04 落地到 eMMC 的开发者。2. MFGTool 固件包结构解析从 .bat 到 rootfs 的传递链拿到野火 EBF 6ULL 的 mfgtool 工具包解压后直接看到一堆 .bin、.bat、.tar.bz2。第一次看的人很容易懵哪个是 bootloader哪个才是要烧的 Ubuntu其实这些文件各司其职整个烧录链路可以理解为“引导装载引导装载器”的过程。工具包里最常见的就是下面这张表列出的几类文件文件实际作用noui-mfgtool2-yocto-mx-sabresd-sdcard-sd1.batWindows 批处理入口最终调用 mfgtoolcli.exe 去解析 XML 配置ddr-test-uboot-jtag-mx6ull.bin用于 DDR 压力测试的 U-Boot 固件和正式烧录不是同一个文件imx7d_sabresd_m4_*.bin7D 平台上 M4 核的示例程序工具包为了通用性一并打包与本项目无关core-image-minimal-imx6ull14x14evk.tar.bz2Yocto 构建的最小 rootfs可作为烧录镜像的占位包实际替换成 Ubuntu 18.04 rootfs这里有个容易踩的坑imx7d 开头的文件不是给 6ULL 用的但 mfgtool 的 XML 配置可能按 board 名自动过滤如果你自己改配置时不小心把路径指到这些 bin 上烧录会直接卡死在初始化阶段。所以第一步不是执行 bat而是把工具包里的 ucl2.xml 和 cfg.ini 打开确认目标配置文件到底引用的是哪个固件。2.1 MFGTool 的两种工作状态下载态与升级态MFGTool 的核心机制是让 i.MX 6ULL 从 USB OTG 口进入下载模式。芯片内部的 BootROM 会枚举成一个 USB HID 设备主机端 mfgtool 将 U-Boot 镜像就是那些 .bin送入内存并让其运行。此时 U-Boot 会再次回应 USB 枚举进入所谓的“升级态”后续的 kernel、dtb、rootfs 都由这个内存中的 U-Boot 写入 eMMC。为什么要绕这么一圈因为 eMMC 的烧录不像 SD 卡那样可以拔下来接读卡器。eMMC 焊死在板上唯一可控的启动介质就是 BootROM 支持的 USB、UART 或 SD。MFGTool 选的是 USB因为速率比 UART 高一个量级20 MB 左右的 rootfs 压缩包能在两三分钟内传完。理解这个状态切换很重要如果 ddr-test-uboot-jtag-mx6ull.bin 里带的 U-Boot 在 DDR 初始化时就崩溃你就永远看不到下一步的 eMMC 枚举排错方向也会跑偏。2.2 cfg.ini 与 ucl2.xml烧录的描述文件怎么读手写 mfgtool 命令之前得先搞清楚它读什么。mfgtool 默认读取目录下的 cfg.ini这个文件决定了芯片类型和 UCL 配置的路径。常见的内容是这样[profiles] chip MX6ULL [platform] board EBF6ULL [LIST] name EBF6ULL-eMMC每项的说明[profiles]段声明芯片型号。chip MX6ULL会告诉 mfgtool 去查找以 MX6ULL 开头的 U-Boot 镜像不要写成MX6UL两者在 DDR 初始化上不兼容。[platform]段的board只是注释性标签实际行为由后面 XML 里的LIST控制。[LIST]段的name要和ucl2.xml中某个LIST nameEBF6ULL-eMMC desc...完全一致否则工具会报 “profile not found”。ucl2.xml是真正的执行步骤描述一条条CMD告诉 mfgtool 先下载哪个文件到哪个地址再执行什么命令。对于烧 Ubuntu 的场景核心是看它是否包含mknod和parted这类分区命令以及最后tar解包 rootfs 到mmcblk1p2之类的动作。不要直接改 XML 里的解包命令除非你清楚 U-Boot 内建的ums和fastboot的行为。注意野火官方提供的 Ubuntu 18.04 工具包一般会带一个ubuntu18.04-rootfs.tar.bz2你只需要把它替换掉core-image-minimal-*.tar.bz2并确认 XML 里指向的文件名一致即可。不要改动分区表和 bootloader 的烧写地址否则可能出现 rootfs 起来了但 kernel 不知道 eMMC 分区布局的问题。3. 写死 Ubuntu 18.04MFGTool 烧录 eMMC 的完整操作前面把文件结构摸清了这一步就是把 Ubuntu 18.04 的 rootfs 真正写进 eMMC。整个过程可以分成准备、配置、执行、观察四步。我假设你用的是 Windows 主机因为野火这个工具包的默认入口是 .bat如果用的是 Linuxmfgtool 也有对应二进制原理完全一样只是驱动和枚举名不同。3.1 环境准备驱动、USB OTG 与串口三件套先装驱动。i.MX 6ULL 在 USB 下载态下会枚举为USB HID 设备或NXP Semiconductors设备Windows 需要安装 NXP 提供的 mfgtool 驱动或者从设备管理器手动指向驱动目录里的 winusb 驱动。这一步最容易出问题Windows 10/11 的驱动签名策略会把未签名的 WinUSB 驱动拦掉解决方法是暂时进入“禁用驱动程序强制签名”模式重启时按 F7 选择或者在高级启动里关掉签名校验后再装。然后连接硬件。开发板需要把 USB OTG 口通常标注OTG、USB_OTG或DEV接到电脑 USB-A 口同时用 USB 转串口线连接 UART1波特率固定为 115200。接好后按住启动拨码开关的对应位置让 BootROM 进入下载模式。野火 EBF 6ULL 板上一般有拨码或跳线专门管启动源拨到USB 下载一侧即可具体以板子丝印为准。连接完成后在 Windows 设备管理器里确认出现了一个 HID 设备。如果你想在 Linux 主机下用 mfgtool可以先查看内核日志确认枚举dmesg | tail -20如果看到hid-generic或类似的设备握手记录说明 BootROM 已经枚举成功。这个命令在排查时很重要先确认 USB 链路再说烧录。3.2 指定 Ubuntu 18.04 rootfs 并修改配置工具包默认带的是core-image-minimal-imx6ull14x14evk.tar.bz2这是 Yocto 的最小根文件系统只能用来验证烧录链路。要换成 Ubuntu 18.04需要准备一个野火官方编译好的ubuntu18.04-rootfs.tar.bz2把它复制到工具包files或os目录下。然后编辑ucl2.xml中引用 rootfs 的那一行。修改前最好先备份cp ucl2.xml ucl2.xml.bak编辑ucl2.xml找到类似下面这段CMD stateUpdater typepush bodypipe tar -jxf - -C /mnt/mmcblk1p2mknod /dev/mmcblk1p2; tar -jxf $FILE/CMD注意$FILE变量指向的是下面CMD typepush valueubuntu18.04-rootfs.tar.bz2 ...里声明的文件名。你需要把value改为实际的 Ubuntu 包文件名并保证该文件确实存在于工具包对应路径下。这里-j表示用 bz2 压缩如果你的 Ubuntu 包是.tar.gz就要把-j改成-z否则解包直接报错。提示不要试图在 XML 里直接写其他发行版的名字mfgtool 不会帮你递归解包只会按指定的压缩格式解一次。看到tar: Unrecognized option这类错误时先检查压缩参数。3.3 执行烧录批处理与命令行直跑配置完成后双击运行noui-mfgtool2-yocto-mx-sabresd-sdcard-sd1.bat。这个脚本实际是隐藏窗口版内部会调用mfgtoolcli.exe参数大致是..\mfgtoolcli\mfgtoolcli.exe -u -d -c ..\Profiles\Linux\OS\firmware\ucl2.xml在 Windows 命令行里手动执行也是一样的效果。参数含义-u使用 USB 下载模式。-d启用调试输出把日志打印到控制台比双击 bat 能看到更多信息。-c指定ucl2.xml的路径如果不写工具会默认找当前目录下的配置。执行后控制台会打印出类似Device: 1或HID Device vid:pid的信息。随后工具先发送 DDR 初始化固件再发送 U-Boot最后开始传 rootfs。整个过程中开发板的串口会有 U-Boot 的启动日志注意看有没有USB CONNECT和mmc write这样的关键字。如果在双击 bat 后闪一下就没了说明命令执行失败这时应该用 cmd 窗口手动运行加上-d参数把错误信息留住。常见的错误是No device found这基本可以确定卡在 USB 枚举环节和配置文件无关。3.4 验证 rootfs 是否真的写进了 eMMC烧录脚本跑完并不代表万事大吉。工具包里的脚本经常在 rootfs 写入完成后没有做umount或sync直接重启会导致 eMMC 上的数据不完整。所以我通常会在烧录完成后先不断开 USB 和串口在 mfgtool 的升级态里执行一次sync命令。如果你用的是野火定制的 mfgtool它可能在 XML 里内置了sync但手动确认最稳妥。然后在串口终端里直接重启开发板按 CtrlC 进入 U-Boot 命令行输入mmc dev 1 mmc part第一行把当前设备切到 eMMC索引 1第二行打印分区表。如果看到了mmcblk1p1和mmcblk1p2且大小和你预期一致说明分区写入没问题。接着setenv bootargs ...让它从 eMMC 启动或者直接saveenvreset进入正常的 Ubuntu 启动流程。4. 烧录失败排查从握手失败到 U-Boot 崩溃这里整理的是实际踩坑路上最常见的问题按出现的顺序排列USB 链路、DDR 初始化、eMMC 识别。先把现象和快速定位手段列成一张表现象可能原因检查点No device foundUSB 线/拨码/驱动lsusb看 15a2 或设备管理器看 HID发送镜像后立即断开DDR 参数不匹配换 ddr-test 固件单独测内存卡在Trying to boot from MMCU-Boot 找不到 eMMC 分区U-Boot 里执行mmc partrootfs 解包报错压缩参数不对确认-j还是-z4.1 USB 握手失败先从 HID 设备消失查起执行 mfgtool 时如果提示找不到设备先不要怀疑配置文件。打开设备管理器看有没有一个带黄色感叹号的USB HID或NXP设备。没有的话检查 USB 线很多 Type-A 线只充电不传数据换一根短一点的线再试。接着看 boot 拨码i.MX 6ULL 的 BootROM 只有在BOOT_CFG指向 USB 下载模式时才会枚举。野火 EBF 6ULL 板上有个拨码或跳线专门管启动源拨到 SD 卡启动时 USB 是静默的这会让 mfgtool 一直卡在No Device Connected。在 Linux 主机上可以用lsusb查看设备是否出现lsusb | grep -i nxp输出类似Bus 001 Device 003: ID 15a2:007f Freescale Semiconductor, Inc.才对。ID 15a2 是 NXP 的 vendor ID007f 是下载模式 device ID。如果你看到的是别的 PID比如 0054说明 U-Boot 已经跑起来了此时烧录进入第二阶段mfgtool 日志会从Device: 1变成Device: 2这两个状态不要混淆。4.2 U-Boot 崩溃和 DDR 测试固件如果握手成功但烧录到一半报错或者串口日志里出现Trying to boot from MMC但随即卡死多半是 U-Boot 或 DDR 初始化的问题。工具包里的ddr-test-uboot-jtag-mx6ull.bin就是用来单独验证 DDR 参数的。把它烧到 i.MX 6ULL 的内存里运行执行内存读写测试ddr-test-uboot-jtag-mx6ull.bin 0x80000000这里的地址0x80000000是 i.MX 6ULL 的 DDR 起始地址具体以你的板载 DDR 配置为准。如果测试稳不住说明开发板硬件有问题或者工具包里的 DDR 配置与你的板型不匹配。注意野火 EBF 6ULL 可能有 256MB 和 512MB 两种内存版本用错 U-Boot 会直接导致 kernel 启动后 OOM。此外不要把imx7d_sabresd_m4_TCM_*.bin当成 U-Boot 烧进去。那些是 i.MX 7D 上 M4 核的测试程序地址域完全不同写入后不会有任何输出只会在 USB 枚举后立即断开。4.3 eMMC 写入失败分区表、HS400 和坏块U-Boot 正确执行到mmc write但返回写入错误常见原因有三个。第一eMMC 的 Boot0/Boot1 分区被写保护了U-Boot 需要在mmc dev 1 1这种模式下先关闭 protect或者用mmc bootpart enable 1 1打开 BOOT 分区访问。第二eMMC 工作模式不对。i.MX 6ULL 支持 HS400 模式但 U-Boot 这边的时钟配置可能没跟上导致数据线采样错乱。解决方案是在 U-Boot 环境变量里强制降为 HS200 或 DDR50比如setenv mmcdev 1 setenv mmcroot /dev/mmcblk1p2 setenv bootargs ${bootargs} mmc_clock200000000第三eMMC 本身有坏块但 U-Boot 写入时不会像文件系统那样做坏块管理。所以 rootfs 写入后要回到 Linux 里跑一次e2fsck确认文件系统完好。这有点违背直觉烧录工具只保证“写进去”不保证“能读出来”。注意不是所有 eMMC 都支持 TRIM但它确实大部分支持 DISCARD。在排查写入问题时先确认 eMMC 型号支持 HS400再看 U-Boot 和内核的时序配置别一上来就怀疑板子虚焊。5. eMMC 寿命优化FSTRIM 与 Ubuntu 18.04 运维配置烧录成功后长期运行就要考虑损耗均衡。Ubuntu 18.04 默认使用 ext4挂载参数没有discard所以需要手动执行 fstrim。先确定 eMMC 是否支持 TRIM 类命令lsblk -D /dev/mmcblk1DISC-GRAN和DISC-MAX非零则支持。然后执行sudo fstrim -v /-v会打回实际释放的字节数。如果输出0 B说明当前没有可回收块不代表不支持。接着启用系统自带的定期 trim 服务Ubuntu 18.04 提供了 fstrim.timersudo systemctl enable fstrim.timer sudo systemctl start fstrim.timer这个 timer 每周触发一次对嵌入式 eMMC 来说频率合理不会因为频繁 discard 放大写入。如果 eMMC 不支持 trimfstrim 会报错这时不要强行启用否则会在内核日志里刷大量EXT4-fs错误。对于打算把 6ULL 当服务器跑的读者建议在/etc/fstab里调整 rootfs 挂载参数减少元数据写入/dev/mmcblk1p2 / ext4 noatime,nodiratime,commit600 0 1commit600把 data 刷盘周期从默认 5 秒拉到 600 秒显著降低 eMMC 写次数代价是异常断电会丢最近 10 分钟的数据。另外配合sudo ufw enable限制端口以及用unattended-upgrades只打安全补丁就能让这台 Ubuntu 18.04 设备稳定跑在 eMMC 上。最后给你一个可复现的打包思路把自己定制的 rootfs 重新打成 tar 包放进 mfgtool 的 files 目录并把 XML 里的 value 改成新包名以后每次批量烧录都用同一套命令避免手动配置漂移。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻