2. i.MX8硬件架构基础
i.MX8 不是一颗单一芯片,而是 NXP 面向不同算力与功耗档位构建的处理器家族。做 BSP 开发时,第一步不是急着改设备树,而是先确认“我手上这颗 i.MX8 到底属于哪个子系列、内部有哪些异构子系统、内存和外设如何映射”。这些信息直接决定 U-Boot 的 DDR 初始化参数、Linux 设备树的内存节点、GPU/VPU/NPU 的驱动加载方式,以及最终能支撑的应用场景。
一、i.MX8 系列型号差异
i.MX8 家族按定位大致分为三条主线:面向高性能应用的 i.MX8QuadMax/QuadPlus、面向主流应用的 i.MX8QuadXPlus/DualXPlus、面向低功耗与实时控制的 i.MX8M 系列,以及带独立实时核的 i.MX8X 与 i.MX8M Nano/Mini 等衍生型号。它们的核心差异体现在 CPU 集群结构、是否集成 VPU/NPU、内存位宽和封装引脚上。
| 子系列 | 典型 CPU 结构 | GPU/VPU/NPU | 典型场景 |
|---|---|---|---|
| i.MX8QuadMax | 2×A72 + 4×A53 + 2×M4F | GC7000XSVX / VPU / 无独立 NPU | 车载座舱、工业 HMI |
| i.MX8QuadXPlus | 4×A35 + 1×M4F | GC7000Lite / VPU / 无 NPU | 中端显示、网关 |
| i.MX8M Plus | 4×A53 + 1×M7 | GC7000UL / VPU / 2.3 TOPS NPU | 边缘 AI、机器视觉 |
| i.MX8M Mini | 4×A53 + 1×M4 | GC NanoUltra / 无 VPU / 无 NPU | 低成本 HMI、IoT |
从 BSP 角度看,型号差异最直接的体现是设备树源文件不同:i.MX8M Plus 使用 imx8mp-evk.dts,i.MX8QuadMax 使用 imx8qm-mek.dts。交叉编译时若选错 defconfig,内核可能启动到一半就因缺少对应时钟或电源域而挂起。
二、CPU/GPU/VPU/NPU 子系统
i.MX8 的典型特征是“异构多核 + 专用加速器”。CPU 侧通常由 Cortex-A 应用核和 Cortex-M 实时核组成,A 核跑 Linux,M 核跑 RTOS 或裸机固件,两者通过 MU(Messaging Unit)或 RPMsg 通信。GPU 负责 2D/3D 图形渲染,VPU 负责 H.264/H.265 编解码,NPU 则承担神经网络推理。它们各自有独立的时钟域、电源域和复位线,BSP 中需要分别配置。
status = "okay" 往往不够,还要确认对应 power-domain 节点已引用。
三、内存映射与外设接口
i.MX8 采用统一编址,CPU 通过 AXI/AHB 总线访问 DDR、OCRAM、外设寄存器和 PCIe 空间。以 i.MX8M Plus 为例,DDR 通常起始于 0x4000_0000,外设寄存器集中在 0x3000_0000 附近,而 Cortex-M7 的 TCM 位于 0x8000_0000 区域。U-Boot 的 board_init 阶段会打印内存映射,Linux 启动后可通过 /proc/iomem 查看实际布局。
# 查看 Linux 下的内存映射
cat /proc/iomem | head -20
# 查看设备树中的内存节点
dtc -I fs /sys/firmware/devicetree/base | grep -A3 memory
# 典型 DDR 节点
memory@40000000 {
device_type = "memory";
reg = <0x0 0x40000000 0x0 0x80000000>;
};
外设接口方面,i.MX8 常见的有 ENET、USDHC、I2C、SPI、UART、USB、PCIe、MIPI-CSI/DSI 和 CAN-FD。不同子系列的接口数量和复用关系差异很大,例如 i.MX8M Plus 有 2 路千兆以太网和 2 路 CAN-FD,而 i.MX8M Mini 只有 1 路以太网。引脚复用通过 IOMUXC 配置,BSP 中体现为 pinctrl 节点。
四、典型应用场景与选型对照
选型时可以把“算力需求、显示需求、AI 需求、实时需求”四个维度作为判断依据。工业 HMI 通常选 i.MX8M Mini 或 Plus;车载座舱需要多屏和虚拟化,倾向 i.MX8QuadMax;边缘 AI 盒子需要 NPU 和 VPU,i.MX8M Plus 是当前最常用的选择;而需要硬实时控制的场景,则利用 i.MX8X 或 i.MX8M 系列中的 Cortex-M 核跑 RTOS。
五、常见误区与复盘
误区二:忽略 SCFW 固件版本。i.MX8QuadMax 的电源域和隔离配置由 SCFW 管理,U-Boot 与 SCFW 版本不匹配时,GPU/VPU 可能无法上电。
误区三:只改设备树不改 defconfig。NPU 驱动需要
CONFIG_DRM_ETNAVIV 或对应 NPU 内核模块支持,否则 /dev/ethosu 不会出现。
复盘建议:拿到一块 i.MX8 板子后,先执行 cat /proc/device-tree/model 确认型号,再查看 dmesg | grep -i "gpu\|vpu\|npu\|scfw" 确认加速器初始化状态,最后对照 /proc/iomem 核对内存映射是否与参考手册一致。这三步能快速判断 BSP 是否移植正确,也能为后续驱动调试提供基线。