3. 开发环境与Yocto构建

i.MX 多媒体终端系统的软件栈通常由 U-Boot、Linux 内核、设备树、根文件系统以及多媒体相关用户态组件构成。要把这些组件稳定地组合成可启动镜像,最常用的方式是基于 NXP 官方维护的 Yocto BSP 层进行构建。本节围绕一条可复现的主线展开:准备 Ubuntu 主机、获取 Yocto 与 i.MX BSP 层、配置构建环境、编译最小镜像,最后通过 MFGTool 或 dd 方式烧录到目标板并验证启动。

主机环境准备

Yocto 对主机有明确要求。推荐使用 Ubuntu 20.04 LTS 或 22.04 LTS,磁盘至少预留 120 GB,内存建议 16 GB 以上,CPU 核心数越多编译越快。若使用虚拟机,需开启嵌套虚拟化并分配足够 I/O 带宽,否则 bitbake 解析和编译阶段会明显变慢。

先安装基础依赖包,这些包覆盖 Git、编译工具链、Python、压缩解压、伪终端等构建所需能力:

sudo apt update
sudo apt install -y gawk wget git diffstat unzip texinfo gcc build-essential \
  chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \
  iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
  pylint xterm zstd liblz4-tool file locales
sudo locale-gen en_US.UTF-8

随后配置 Git 身份并安装 repo 工具。repo 是 Google 提供的多仓库管理脚本,Yocto 的 BSP 发布通常由多个 Git 仓库组成,用 repo 可以一次性同步 manifest 中声明的全部层:

git config --global user.name "your_name"
git config --global user.email "your_mail@example.com"
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

获取 Yocto 与 i.MX BSP 层

NXP 的 i.MX Yocto 发布以 manifest 形式组织,例如 i.MX Linux 5.15.71_2.2.0 或 6.1.x 系列。以 5.15.71_2.2.0 为例,创建源码目录并初始化 repo:

mkdir ~/imx-yocto-bsp && cd ~/imx-yocto-bsp
repo init -u https://github.com/nxp-imx/imx-manifest \
  -b imx-linux-kirkstone -m imx-5.15.71-2.2.0.xml
repo sync -j8

同步完成后,目录中会出现 sources 文件夹,其中包含 poky、meta-openembedded、meta-freescale、meta-imx 等层。meta-imx 是 NXP 对 i.MX 系列的官方支持层,内部又细分为 meta-imx-bsp、meta-imx-ml、meta-imx-sdk 等子层,分别负责基础 BSP、机器学习与 SDK 相关配方。

若网络受限,可先配置 Git 代理或使用国内镜像;repo sync 支持断点续传,失败后重复执行即可,不必删除整个目录。

配置构建环境与选择机器

Yocto 通过 imx-setup-release.sh 脚本初始化构建目录。该脚本会创建 build 目录、写入 bblayers.conf 与 local.conf,并 source 环境变量。常用参数 -b 指定构建目录名,-e 指定图形后端,例如 wayland、xwayland、fb 或 none:

DISTRO=fsl-imx-wayland MACHINE=imx8mm-evk \
  source imx-setup-release.sh -b build-imx8mm

这里 MACHINE 决定目标板型,i.MX8M Mini EVK 对应 imx8mm-evk,i.MX8M Plus 对应 imx8mp-evk,i.MX6ULL 对应 imx6ull14x14evk。DISTRO 决定发行版特性,fsl-imx-wayland 适合带 GPU 与显示的多媒体终端,fsl-imx-xwayland 兼容 X11 应用,fsl-imx-fb 则用于无 GPU 的 framebuffer 场景。

构建目录中的 conf/local.conf 是本地配置核心。可在此追加下载缓存、并行度与镜像特性。例如把下载目录统一到共享路径,避免重复下载:

DL_DIR ?= "${HOME}/yocto-downloads"
SSTATE_DIR ?= "${HOME}/yocto-sstate"
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j8"

编译最小镜像

最小镜像用于快速验证启动链路,通常选择 core-image-minimal。它只包含 BusyBox、基础库与启动所需组件,体积小、编译快,适合首次打通板级启动。执行:

bitbake core-image-minimal

bitbake 会依次完成配方解析、源码下载、交叉编译、打包与根文件系统生成。首次构建耗时较长,取决于主机性能与网络,通常 1 至 3 小时。构建完成后,镜像位于 tmp/deploy/images/imx8mm-evk/,关键产物包括:

产物作用
imx-boot-imx8mm-evk.bin含 SPL、DDR 固件与 U-Boot 的启动镜像
ImageLinux 内核镜像
imx8mm-evk.dtb设备树二进制
core-image-minimal-imx8mm-evk.wic可直接写入 SD 卡的完整磁盘镜像

若需在最小系统上验证多媒体能力,可改用 core-image-base 或 imx-image-multimedia,后者会加入 GStreamer、VPU 固件与相关插件。

i.MX Yocto 构建与烧录链路 Ubuntu 主机 20.04 / 22.04 LTS 依赖包 + repo + Git ≥120GB 磁盘 / 16GB 内存 repo sync imx-manifest poky / meta-freescale meta-imx-bsp / meta-imx-ml imx-setup-release.sh MACHINE=imx8mm-evk DISTRO=fsl-imx-wayland 生成 build/conf bitbake core-image-minimal 解析配方 → 下载源码 → 交叉编译 打包 rootfs → 生成 wic 镜像 输出 tmp/deploy/images/imx8mm-evk/ imx-boot.bin SPL + DDR + U-Boot 启动第一阶段 Image + dtb 内核与设备树 板级硬件描述 *.wic 完整磁盘镜像 含分区与 rootfs 烧录到目标板 dd 写 SD 卡 或 MFGTool / uuu 示例参数:MACHINE=imx8mm-evk,DISTRO=fsl-imx-wayland,镜像 core-image-minimal

烧录到目标板

对于 i.MX8M Mini EVK,最直接的方式是把 wic 镜像写入 SD 卡。先确认设备节点,避免误写系统盘:

lsblk
sudo umount /dev/sdX*
sudo dd if=core-image-minimal-imx8mm-evk.wic of=/dev/sdX bs=1M conv=fsync
sync

若目标板从 eMMC 启动,可使用 NXP 的 uuu(Universal Update Utility)或 MFGTool。uuu 通过 USB OTG 与芯片内 ROM 通信,脚本中按 bootloader、kernel、dtb、rootfs 顺序下载。典型命令如下:

sudo uuu -b emmc_all imx-boot-imx8mm-evk.bin \
  core-image-minimal-imx8mm-evk.wic

烧录完成后,将启动模式拨码开关设为对应介质,上电观察串口输出。串口参数通常为 115200-8-N-1。若看到 U-Boot 打印、内核解压、设备树加载、根文件系统挂载,并最终进入登录提示,说明最小镜像构建与烧录链路已经打通。

dd 写入前务必用 lsblk 核对设备名;写错盘会直接破坏主机数据。uuu 需要 udev 规则或 sudo 权限,否则会报 USB 设备打开失败。

常见问题与判断依据

构建阶段若出现 do_fetch 失败,多为网络或代理问题,可检查 DL_DIR 中是否已有对应源码包;若出现 do_compile 失败,应查看 tmp/work/.../temp/log.do_compile,定位到具体配方与错误行。启动阶段若无串口输出,先确认启动模式与供电,再检查 imx-boot 是否与板型匹配;若内核启动后停在 Waiting for root device,通常是 rootfs 分区或 mmc 设备号与设备树不一致,需要核对 wic 分区布局与 U-Boot 的 mmcroot 参数。

完成最小镜像验证后,再逐步加入多媒体组件、Qt 或 GStreamer 应用,可以显著降低排障复杂度。整个流程的核心是把主机环境、BSP 层、机器配置、镜像配方与烧录介质五者对齐,任何一处不匹配都会在启动阶段暴露出来。