2. i.MX硬件开发环境搭建
i.MX工业网关平台的开发起点不是写代码,而是把“板子能上电、串口能出字、调试器能连上、主机能编出目标程序”这条链路打通。这一节围绕硬件连接与主机环境两条主线展开:硬件侧包括开发板、电源、串口、JTAG/SWD;主机侧包括Yocto/Buildroot环境与交叉编译工具链。任何一环没打通,后续的U-Boot移植、内核裁剪、驱动调试都会变成盲调。
一、硬件连接:先建立最小可用系统
以常见的i.MX6ULL/i.MX8M Mini工业网关评估板为例,最小系统只需要三样东西:稳定电源、调试串口、启动介质(eMMC/SD)。JTAG/SWD属于“按需接入”,用于U-Boot阶段或裸机/早期内核调试,不是每次上电都必须连接。
电源。i.MX6ULL典型核心电压为1.375V~1.5V(VDD_ARM),DDR3L为1.35V,外设I/O多为3.3V。评估板通常通过DC 5V/2A或USB Type-C供电,板上PMIC(如PCA9450、PF3000)再分路输出。上电前先用万用表确认各电源轨对地无短路,上电后测量VDD_ARM、VDD_SOC、DDR电压是否在标称值±5%以内。若板子反复重启或串口乱码,优先怀疑电源纹波与电流能力不足,而不是先怀疑软件。
串口。i.MX的调试串口一般由UART1引出,默认参数为115200-8-N-1,无流控。连接方式有两种:板载USB转串口芯片(如CP2102、CH340)直接出USB;或通过3.3V TTL电平的UART引脚接外部USB-TTL模块。注意TTL侧必须是3.3V,接5V可能损坏SoC引脚。接线只需三根:TX、RX、GND,TX/RX交叉连接。上电后若终端无输出,先确认串口线序、波特率、是否选对了COM端口,再检查板子是否真的在运行。
JTAG/SWD。i.MX6ULL常用20针JTAG(ARM标准)或10针SWD。JTAG需要连接TCK、TMS、TDI、TDO、TRST、SRST及GND,部分板子还需提供VTREF参考电压。SWD只需SWCLK、SWDIO、GND、VTREF。调试器可选J-Link、CMSIS-DAP、OpenOCD兼容的FT2232。连接时注意:JTAG/SWD的复位信号(SRST)与板级复位要一致,否则会出现“能识别ID但无法halt”的现象。实际调试中,若U-Boot已启动并关闭了调试时钟,JTAG可能无法直接接管,此时需在U-Boot启动早期暂停或使用“等待复位后立即连接”的方式。
二、主机环境:Yocto与Buildroot的取舍
主机推荐Ubuntu 20.04 LTS或22.04 LTS,磁盘至少预留120GB,内存建议16GB以上。Yocto与Buildroot不是二选一的对立关系,而是两种构建哲学:Yocto适合产品化、需要长期维护BSP和SDK的场景;Buildroot轻量、上手快,适合功能相对固定的网关固件。
Yocto环境准备。以i.MX Yocto BSP(如imx-5.15.71-2.2.0)为例,先安装依赖包:
sudo apt install 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
然后获取BSP并初始化构建目录:
repo init -u https://source.codeaurora.org/external/imx/imx-manifest \
-b imx-linux-kirkstone -m imx-5.15.71-2.2.0.xml
repo sync -j8
DISTRO=fsl-imx-xwayland MACHINE=imx6ull14x14evk source imx-setup-release.sh -b build
首次构建core-image-minimal通常需要2~4小时(取决于CPU和网络)。构建完成后,在tmp/deploy/images/imx6ull14x14evk/下可找到U-Boot、内核、设备树和根文件系统镜像。
Buildroot环境准备。Buildroot更直接:
git clone https://gitlab.com/buildroot.org/buildroot.git -b 2023.02.x
cd buildroot
make imx6ull14x14evk_defconfig
make menuconfig # 按需裁剪
make -j$(nproc)
Buildroot的输出集中在output/images/,包含rootfs.tar、zImage、imx6ull-14x14-evk.dtb等。相比Yocto,Buildroot的配置项更少、构建更快,但软件包版本和补丁管理需要自行维护。
三、交叉编译工具链:安装与验证
交叉编译工具链是主机与目标板之间的“翻译器”。i.MX6ULL是ARM Cortex-A7,使用32位ARM EABI硬浮点工具链;i.MX8M Mini是Cortex-A53,使用AArch64工具链。工具链来源有三种:Yocto SDK、Buildroot生成的工具链、Linaro/ARM官方工具链。推荐优先使用与BSP匹配的Yocto SDK,避免glibc版本和内核头文件不一致。
以Yocto SDK为例,安装后执行:
./fsl-imx-xwayland-glibc-x86_64-meta-toolchain-armv7at2hf-neon-toolchain-5.15.71.sh
source /opt/fsl-imx-xwayland/5.15.71/environment-setup-armv7at2hf-neon-poky-linux-gnueabi
echo $CC
# 输出示例:arm-poky-linux-gnueabi-gcc -march=armv7-a -mfpu=neon ...
验证工具链是否可用,写一个最小测试程序:
cat > hello.c <<'EOF'
#include <stdio.h>
int main(void){ printf("i.MX gateway toolchain OK\n"); return 0; }
EOF
$CC hello.c -o hello
file hello
# 应显示:ELF 32-bit LSB executable, ARM, EABI5
把hello通过SCP或NFS拷贝到板子上运行,若输出i.MX gateway toolchain OK,说明工具链、动态库、内核ABI三者匹配。若运行时报No such file or directory,通常是动态链接器路径不对,可用readelf -l hello | grep interpreter查看,确认板子根文件系统中存在对应的ld-linux-armhf.so.3。
gcc --version,必须完成“编译→传输→目标板运行”闭环。只编译不运行,无法暴露glibc版本、浮点ABI、动态链接器路径等真实问题。四、串口终端与调试器联调
主机侧串口工具推荐picocom或minicom:
sudo picocom -b 115200 /dev/ttyUSB0
# 退出:Ctrl-A 然后 Ctrl-X
若使用J-Link,可先用JLinkExe确认连接:
JLinkExe -device MCIMX6Y2 -if JTAG -speed 4000
J-Link> connect
J-Link> halt
J-Link> regs
能读到PC、SP、LR等寄存器,说明JTAG链路正常。若connect失败,依次检查:VTREF是否有3.3V、SRST是否被板级复位拉低、TCK频率是否过高(可降到1000kHz再试)、SoC是否处于低功耗或时钟关闭状态。
五、常见问题与判断依据
| 现象 | 优先排查 | 判断依据 |
|---|---|---|
| 串口无输出 | 线序、波特率、电源 | TX/RX是否交叉;115200-8-N-1;VDD_ARM是否正常 |
| 串口乱码 | 波特率偏差、地线 | 换USB-TTL模块;确认GND已连接 |
| JTAG无法halt | SRST、时钟、调试时钟 | 读ID是否成功;降低TCK;检查U-Boot是否已关调试时钟 |
| 交叉编译报错 | 环境变量、SDK路径 | echo $CC是否有输出;是否source了environment-setup |
| 目标板运行报错 | 动态链接器、ABI | readelf -l查看interpreter;确认根文件系统glibc版本 |
把上述硬件连接、主机环境、工具链验证三件事做完,i.MX工业网关平台就具备了“可编译、可下载、可观察”的基本开发条件。后续的U-Boot移植、内核配置、设备树修改和驱动开发,都建立在这条已经打通的链路上。