2. i.MX平台Camera子系统架构

在 i.MX 系列应用处理器(如 i.MX 8M Plus、i.MX 8QuadMax、i.MX 93 等)中,Camera 子系统并不是单一外设,而是由多个硬件模块协同构成的采集与处理链路。理解这条链路上每个模块的职责边界,是后续做设备树配置、驱动调试和图像质量调优的前提。本节以 i.MX 8M Plus 的典型拓扑为参照,梳理从 Sensor 到内存、再到显示或编码输出的完整数据通路。

一、链路总览:从光信号到可消费的图像数据

一颗 MIPI CSI-2 接口的摄像头模组,其输出首先进入 SoC 的 MIPI-CSI2 接收控制器(在 i.MX 8M Plus 中通常称为 MIPI CSI-2 RX 或 CSI-2 Host Controller)。该控制器负责 D-PHY 物理层接收、Lane 对齐、数据包解析(包含长包/短包、虚拟通道 VC、数据类型 DT 的识别),并把还原后的像素流交给下游。它本身不做图像处理,只做协议层的接收与解包。

接收到的像素流有两条主要去向:一条是直接写入内存(通过 CSI 或 ISI 的 DMA 通道),另一条是送入 ISP 做实时处理。在 i.MX 8M Plus 上,ISI(Image Sensor Interface)承担了传统 CSI 的抓取与格式转换职责,支持多路输入、裁剪、缩放、色彩空间转换(如 YUV422 到 RGB),并可通过 DMA 把帧写入 DDR。而 ISP(Image Signal Processor)则负责更复杂的图像处理:去马赛克(Demosaic)、黑电平校正(BLC)、镜头阴影校正(LSC)、白平衡、Gamma、降噪、锐化等。ISP 的输入通常来自 CSI/ISI 的 RAW 数据,输出为 YUV 或 RGB,供后续显示、编码或算法使用。

i.MX Camera 子系统数据通路与模块职责 Camera Sensor MIPI CSI-2 TX RAW / YUV 输出 MIPI-CSI2 RX D-PHY / Lane 对齐 VC / DT 解析 ISI 裁剪 / 缩放 / CSC DMA 写帧 ISP Demosaic / BLC / LSC AWB / Gamma / NR 差分信号 像素流 RAW/YUV DDR 帧缓冲(Frame Buffer) NV12 / YUYV / RGB 格式,由 DMA 写入 DMA 写 ISP 输出 VPU H.264 / H.265 编码 JPEG 编码 读取 Display 控制器 DPU / LCDIF 显示输出 读取 旁路路径 CSI/ISI 直接写 DDR 不经 ISP 处理 图例 数据流方向 可选旁路

二、各模块职责的精确划分

MIPI-CSI2 RX 是协议接收端。它只关心电气层和协议层:D-PHY 的时钟 Lane 与数据 Lane 是否同步、数据包 CRC 是否正确、虚拟通道号是否匹配。它不解析像素格式,也不做任何图像处理。在设备树中,它对应的是 csi 或 mipi_csi 节点,需要配置 data-lanes、clock-lanes 和 remote-endpoint 指向 Sensor 的输出端点。

ISI 是抓取与轻量处理单元。它从 CSI 接收像素流,可以执行裁剪(Crop)、缩放(Scale)、色彩空间转换(CSC),并通过 DMA 把结果写入 DDR。ISI 支持多路输入(例如同时接 CSI 和并行接口),也支持直接输出到 ISP。在 i.MX 8M Plus 中,ISI 有多个通道,每个通道可以独立配置输入源、输出格式和目标地址。典型配置中,ISI 的输入格式为 Sensor 输出的 RAW10 或 RAW12,输出格式为 YUV422 或 RGB888。

ISP 是图像质量的核心处理单元。它接收 RAW 数据,依次执行黑电平校正、镜头阴影校正、去马赛克、白平衡、色彩校正矩阵、Gamma 校正、降噪和锐化,最终输出 YUV 或 RGB。ISP 的参数通常通过 I2C 或寄存器接口配置,部分参数(如曝光、增益)需要与 Sensor 联动。在 i.MX 8M Plus 上,ISP 是独立硬件模块,拥有自己的 DMA 通道,输出直接写入 DDR 或送给 VPU。

VPU 是视频编码单元。它从 DDR 读取 YUV 帧,执行 H.264/H.265 或 JPEG 编码,输出压缩码流。VPU 不参与图像质量处理,只做压缩。在 Camera 链路中,VPU 通常位于 ISP 之后,用于把处理好的图像压缩后存储或传输。

三、数据通路的两种典型模式

第一种是全处理模式:Sensor → MIPI-CSI2 RX → ISI → ISP → DDR → VPU/Display。这种模式适用于需要高质量图像输出的场景,如人脸识别、视频会议、工业检测。ISP 的引入会带来约 1~2 帧的延迟,但图像质量显著提升。

第二种是旁路模式:Sensor → MIPI-CSI2 RX → ISI → DDR → Display/VPU。这种模式跳过 ISP,直接使用 Sensor 输出的 YUV 数据。适用于对延迟敏感、对图像质量要求不高的场景,如简单的视频监控预览。旁路模式下,Sensor 需要直接输出 YUV 格式,而不是 RAW。

在实际项目中,选择哪种模式取决于三个因素:Sensor 输出格式(RAW 还是 YUV)、图像质量要求、以及延迟预算。如果 Sensor 输出 RAW 且需要高质量图像,必须走 ISP;如果 Sensor 输出 YUV 且延迟要求严格,可以走旁路。

四、设备树中的关键连接关系

在设备树中,这条链路通过 remote-endpoint 属性逐级连接。一个典型的片段如下:

&mipi_csi {
    status = "okay";
    ports {
        port@0 {
            reg = <0>;
            mipi_csi_in: endpoint {
                remote-endpoint = <&ov5640_out>;
                data-lanes = <1 2>;
            };
        };
        port@1 {
            reg = <1>;
            mipi_csi_out: endpoint {
                remote-endpoint = <&isi_in>;
            };
        };
    };
};

&isi {
    status = "okay";
    ports {
        port@0 {
            reg = <0>;
            isi_in: endpoint {
                remote-endpoint = <&mipi_csi_out>;
            };
        };
        port@1 {
            reg = <1>;
            isi_out: endpoint {
                remote-endpoint = <&isp_in>;
            };
        };
    };
};

这段配置表达了三个关键信息:Sensor 通过 data-lanes = <1 2> 使用两条数据 Lane;CSI 的输出连接到 ISI 的输入;ISI 的输出连接到 ISP 的输入。如果走旁路模式,则 ISI 的输出直接指向内存节点或显示节点,不经过 ISP。

五、调试时的观察点

当链路不通时,可以按以下顺序排查:首先确认 Sensor 是否正常输出(通过 I2C 读取 Sensor ID 和寄存器状态);其次检查 MIPI-CSI2 RX 是否收到数据包(查看 /sys/kernel/debug/mipi-csi2/ 下的统计信息);然后确认 ISI 是否产生 DMA 中断(查看 /proc/interrupts 中 ISI 的中断计数);最后检查 DDR 中是否有帧数据(用 v4l2-ctl --stream-mmap 抓取一帧并保存为文件)。每一步的观察点都对应链路上的一个模块,这样可以快速定位问题所在。