2. 瑞芯微RK平台Camera子系统架构:RK ISP、VICAP、MIPI D-PHY、CSI-2协议栈整体框架介绍
瑞芯微RK平台的Camera子系统是一个高度集成的硬件与软件协同体系,其核心目标是将来自Camera Sensor的原始光信号高效、低延迟地转换为可供CPU/GPU/NPU处理的数字图像数据。本章将深入剖析该子系统的四大核心模块:RK ISP(图像信号处理器)、VICAP(视频输入捕获单元)、MIPI D-PHY(物理层)以及CSI-2(协议层),并阐述它们如何构成一个完整的端到端数据通路。
2.1 整体架构概览
Camera子系统采用分层设计,从物理连接到应用层,每一层都承担着特定的职责。下图展示了RK平台Camera子系统的高层软件与硬件架构,清晰地描绘了数据流从Sensor到最终用户空间的路径。
2.2 核心模块详解
2.2.1 MIPI D-PHY (物理层)
MIPI D-PHY是Camera Sensor与SoC之间的物理传输接口。它采用差分信号对(Clock Lane + Data Lanes)进行高速数据传输,通常配置为1个Clock Lane和1~4个Data Lane。RK平台支持D-PHY v1.2/v2.0标准,单Lane速率最高可达2.5 Gbps。
| 参数 | 说明 |
|---|---|
| Lane配置 | 1 Clock + 1~4 Data |
| 工作模式 | HS (High-Speed) 模式 / LP (Low-Power) 模式 |
| HS速率 | 80 Mbps ~ 2.5 Gbps per Lane |
| LP速率 | ~10 Mbps,用于控制指令 |
| 电压摆幅 | HS: 200mV差分 / LP: 1.2V单端 |
2.2.2 CSI-2 (协议层)
CSI-2协议定义了在D-PHY物理层之上传输图像数据和控制信息的格式。它采用分层结构:像素/字节打包层、底层协议层和通道管理层。RK平台的CSI-2接收器支持最多4个虚拟通道(Virtual Channel),可同时接收来自多个Sensor的数据流。
2.2.3 VICAP (视频输入捕获单元)
VICAP是RK SoC内部的一个关键硬件模块,负责从CSI-2接收器获取数据,进行格式解析、裁剪、缩放,并通过DMA引擎将数据写入系统内存。VICAP支持多种输入格式,包括RAW8/10/12、YUV422等。它通常包含多个DMA通道,支持同时捕获多路视频流。
- 支持最大输入分辨率:通常为 8192 x 8192 (取决于具体芯片)
- 内嵌硬件裁剪器 (Crop) 和缩放器 (Scaler)
- 支持帧同步信号 (VSYNC/HSYNC) 检测
- 可编程中断触发条件 (帧开始、帧结束、错误等)
2.2.4 RK ISP (图像信号处理器)
RK ISP是Camera子系统的核心处理单元,它是一个可编程的硬件流水线,专门用于将RAW数据转换为高质量的RGB/YUV图像。RK ISP通常包含以下主要处理模块:
| ISP模块 | 功能描述 |
|---|---|
| BLC (Black Level Correction) | 校正传感器暗电流引起的黑电平偏移 |
| LSC (Lens Shading Correction) | 补偿镜头边缘亮度衰减和颜色偏差 |
| AWB (Auto White Balance) | 自动白平衡增益调整 |
| Demosaic | 将Bayer RAW数据插值重建为全彩色RGB |
| CCM (Color Correction Matrix) | 颜色校正矩阵,用于精确还原色彩 |
| Gamma / Tone Mapping | 伽马校正和色调映射,优化动态范围 |
| Sharpen / Denoise | 边缘增强和降噪处理 |
2.3 驱动框架与数据流
在软件层面,RK平台的Camera驱动遵循标准的Linux V4L2框架,并在此基础上扩展了Media Controller机制,用于管理复杂的pipeline拓扑。一个典型的驱动框架包含以下组件:
- Sensor驱动: 负责初始化Sensor寄存器、配置输出格式、控制上电时序。
- VICAP驱动: 管理DMA通道、配置裁剪/缩放参数、处理中断。
- ISP驱动: 加载ISP固件、配置处理参数、控制3A算法。
- Media Controller: 创建和管理media link,连接sensor -> vicap -> isp -> video节点。
2.4 关键数据结构与接口
驱动开发中,理解核心数据结构至关重要。以下是一个典型的V4L2 subdev和media pad配置示例:
// 定义sensor subdev
static struct v4l2_subdev sensor_subdev = {
.name = "imx258_subdev",
.grp_id = 0,
.flags = V4L2_SUBDEV_FL_HAS_DEVNODE,
};
// 定义media pad
static struct media_pad sensor_pads[] = {
{
.index = 0,
.flags = MEDIA_PAD_FL_SOURCE,
},
};
// 注册media link
media_create_pad_link(&sensor_subdev.entity, 0,
&vicap_subdev.entity, 0,
MEDIA_LNK_FL_ENABLED);
下表总结了各模块在驱动框架中的角色和关键接口:
| 模块 | 驱动角色 | 关键接口/函数 |
|---|---|---|
| Sensor | V4L2 Subdev | s_power, s_stream, enum_mbus_code, set_fmt |
| VICAP | V4L2 Video Device | vb2_ops, buf_prepare, start_streaming, stop_streaming |
| ISP | V4L2 Subdev + Video Device | s_ctrl, set_fmt, ioctl (RKISP_CMD_*) |
| Media Controller | Media Device | media_create_pad_link, media_device_register |