
我的开发板是正点原子 i.MX6ULL ALPHAeMMC 版LCD屏幕是4.3寸的但这并不重要因为uuu工具适用于所有的搭载i.MX6ULL芯片的开发板例如野火的开发板和韦东山的开发板。以前调试裸机程序或者u-boot我要在电脑和开发板之间来回插拔三次 SD 卡现在换成 NXP 官方的 uuu 工具两条命令就够了。我把最近的总结与实际操作记录整理成文档供大家参考。一、以前调试程序要插拔三次 SD 卡先说老流程。按照正点原子的教程把led.imx或者 u-boot 镜像跑起来是这样一套动作准备一张 SD 卡和读卡器读卡器插到电脑的 USB 口在虚拟机Ubuntu里把读卡器直通给虚拟机用lsblk认出/dev/sdb用正点原子的imxdownload把镜像写到 SD 卡的扇区上sync、umount把卡弹出从读卡器里拔出 SD 卡再插进开发板的卡槽上电提前把拨码开关切到 SD 卡启动才能看到 LED 亮。第 4 步的命令很关键因为把sd设备写错的话容易出事故事故sudo./imxdownload led.bin /dev/sdb代码改一行上面这一套就要重来一遍。中间任何一步出错都可能白忙/dev/sdb认错成/dev/sda会写坏电脑硬盘虚拟机的 USB 直通时不时掉线卡和卡槽接触不良偶尔还得重新插一次。用一句话概括这条链路镜像要先从主机内存搬到 SD 卡这个块设备上人再把这个块设备从主机搬到开发板——两段物理搬运全靠手。二、使用UUU工具通过USB串行下载uuu 的全称是 Universal Update Utility来自 NXP 官方仓库nxp-imx/mfgtools是 mfgtools 的通用命令行版Windows / Linux / macOS 都能跑。本文用的是 Windows 版单文件启动横幅里带着版本号uuu (Universal Update Utility) for nxp imx chips -- libuuu_1.5.243-0-g230f1b1它和 imxdownload 的根本区别是imxdownload 面对的是 SD 卡这个块设备uuu 面对的是芯片内部的一段固化代码。i.MX6ULL 里有一段出厂就烧死的 Boot ROM上电后会监听 USBuuu 要做的只是把镜像通过 USB 递给它。没有卡、没有分区、没有文件系统也没有换介质这件事。三、使用UUU工具烧录前的两项准备工作1把板子拨到 USB 串行下载模式这是与从 SD 卡启动并列的另一种启动方式由板子上的拨码开关决定。i.MX6ULL 上电时会采样BOOT_MODE引脚采样结果是串行下载Boot ROM 就去等 USB采样结果是内部启动ROM 才去读 SD 卡 / eMMC 里的镜像。2把 uuu.exe 放到固定位置并加进 PATH我是把uuu.exe放在D:\MyProgram\uuu再把D:\MyProgram\uuu加进 Windows 的系统环境变量Path。之后在 WSL 里直接敲uuu.exe-V能打印出上面那行版本横幅就说明通路已经打通了。顺手可以先用uuu.exe -h看一眼用法它的帮助信息里也列出了支持的芯片和对应的 USB 设备表。四、实际操作记录一点亮 LED进入镜像所在目录一条命令uuu.exe led.imxuuu 会把led.imx通过 USB 送给 Boot ROMROM 初始化好 DDR 之后直接跳到镜像入口执行。命令行里看到Success 1 Failure 0板子上的 LED 就开始亮起来了。注意此时板子仍然停在 USB 下载模式程序是在 DDR 里跑起来的五、实际操作记录二把 u-boot 拉起来同样的道理换成 u-boot 镜像这个u-boot的镜像来源是正点原子官方给出的出厂系统镜像你也可以自己编译uuu.exe u-boot-imx6ull-14x14-ddr512-emmc.imx这次程序是 u-boot 本身。打开串口终端115200-8-N-1就能看到 u-boot 的启动打印两条命令对比一下老流程要很多个繁杂的步骤、三次插拔改一次代码就要重来一遍uuu 这边板子只需要拨一次拨码以后就不用再拨了之后每次验证都是改代码 → 重新敲一条命令。效率的差距就是这么来的。六、讲讲UUU工具的原理要理解这件事得先看芯片里有什么。i.MX6ULL 的 Boot ROM 是出厂固化在芯片内部的不受我们控制、也不能被改写。它认识两件事上电时看BOOT_MODE引脚决定去哪找镜像如果是串行下载模式就通过 USB 等主机把镜像送过来。这个 USB 协议叫 SDPSerial Download Protocol在 i.MX6/7 上是 HID 协议。用uuu.exe -V看它内置的设备表i.MX6ULL 那行写得明明白白SDP: MX6ULL 0x15a2 0x00800x15a2:0x0080就是板子进入下载模式后在电脑上出现的那个 USB 设备的 VID:PID。然后是镜像本身。.imx不是随便一堆二进制它开头就带着给 ROM 看的元数据。以本文这份 u-boot 镜像为例把开头 32 字节按 IVTImage Vector Table解出来tag 0xD1 # IVT 头 length 32 entry 0x87800000 # ROM 最终跳转的入口 dcd 0x877FF42C # DCDtag0xD2长度 488 字节 boot_data 0x877FF420 # { start 0x877FF000, size 0x59000 } self 0x877FF400 # 镜像在 DDR 中的落址于是整个流程就串起来了主机侧的 uuu 解析命令行 / 脚本通过 USB HID 把.imx分块发给 ROMROM 先执行 IVT 指向的 DCDDevice Configuration Data——那是一串寄存器地址 值的写命令任务是初始化时钟和 DDR 控制器DDR 能用之后ROM 按boot_data把镜像搬到 DDR 的self处最后跳到entry0x87800000执行——裸机程序开始跑或者 u-boot 开始打印。顺手把led.imx也解一遍entry、self、DCD 的位置都和上面一模一样只有boot_data.size跟着负载大小变led.imx是0x76000。也就是说裸机测试程序和 u-boot 用的是同一套镜像格式ROM 处理它们的方式没有任何区别。全程没有块设备参与这是它能替代 SD 卡的根本原因。但也正因为如此这份镜像只存在于板子的 DDR 里掉电就没了——所以它最适合调试验证阶段而不是最终交付。七、两种方式的对比总结维度SD 卡老流程uuu 新流程需要什么SD 卡 读卡器一根 USB 线镜像写到哪里SD 卡扇区块设备由 USB 递给 Boot ROM直接落到 DDR是否需要插拔至少 3 次0 次是否需要改启动模式拨一次 SD 卡启动拨一次 USB 下载模式镜像能保留吗能写在卡上不能掉电即失只加载到内存不改写板子适合场景系统集成裸机 / u-boot 调试验证调试阶段最烦的就是改一行代码就要把整条链路重来一遍。把介质那条链路砍掉之后板子拨一次拨码、插一根 USB 线剩下的就是两条命令的事——这也是我愿意把 uuu 推荐给每一个 i.MX6ULL 玩家的原因。