4. RK平台Camera驱动软件架构:DTS设备树配置、Sensor驱动、CIS驱动、ISP驱动分层
瑞芯微RK平台(RK3588/RK3568/RV1126)的Camera驱动软件架构采用严格的分层设计,从上到下依次为:应用层(V4L2/Media Controller API)、Sensor驱动层、CIS(Camera Interface Subsystem)驱动层、ISP(Image Signal Processor)驱动层,以及底层的硬件抽象层。各层通过标准接口进行解耦,使得驱动开发可以并行进行,且便于移植和性能调优。
4.1 DTS设备树配置
设备树(Device Tree Source, DTS)是RK平台驱动开发的起点。Camera相关的DTS配置主要分布在三个层级:SoC级dtsi(定义CIS和ISP硬件节点)、板级dts(定义Sensor连接关系、电源、时钟、复位等)、Sensor专用dtsi(定义Sensor的V4L2属性)。
| DTS层级 | 典型文件 | 配置内容 |
|---|---|---|
| SoC级 | rk3588.dtsi | csi2_dphy0、csi2_dphy1、rkisp0、rkisp1、mipi_csi2 等硬件节点 |
| 板级 | rk3588-evb1.dts | i2c总线、Sensor节点(如 imx415)、电源域、时钟频率、pinctrl |
| Sensor专用 | imx415.dtsi | port端点、data-lanes、remote-endpoint、link-frequencies |
// 典型 Sensor DTS 节点(imx415)
&i2c4 {
status = "okay";
imx415: imx415@1a {
compatible = "sony,imx415";
reg = <0x1a>;
clocks = <&cru CLK_MIPI_CAMARAOUT_M4>;
clock-names = "xvclk";
pinctrl-names = "default";
pinctrl-0 = <&mipim0_camera1_clk>;
power-domains = <&power RK3588_PD_VI>;
rockchip,camera-module-index = <0>;
rockchip,camera-module-facing = "back";
port {
imx415_out0: endpoint {
remote-endpoint = <&mipi_csi2_input>;
data-lanes = <1 2 3 4>;
link-frequencies = /bits/ 64 <480000000>;
};
};
};
};
4.2 Sensor驱动层
Sensor驱动是V4L2 Subdev的具体实现,负责与硬件Sensor芯片交互。RK平台通常使用I2C进行寄存器配置,GPIO控制电源和复位。Sensor驱动的核心回调函数包括:
- s_power:控制Sensor的上电/下电序列,包括DVDD、AVDD、IOVDD、复位时序。
- s_stream:启动/停止MIPI数据流输出。
- g/s_parm:获取/设置帧率、曝光模式等参数。
- enum_mbus_code / get_fmt / set_fmt:定义支持的图像格式(如SRGGB10、YUYV8_2X8)和分辨率。
s_power 回调必须实现电源引用计数,避免在多个上下文(如open/close、stream on/off)中重复上下电导致硬件异常。
// Sensor驱动核心结构体示例
static const struct v4l2_subdev_core_ops imx415_core_ops = {
.s_power = imx415_s_power,
};
static const struct v4l2_subdev_video_ops imx415_video_ops = {
.s_stream = imx415_s_stream,
.g_frame_interval = imx415_g_frame_interval,
.s_frame_interval = imx415_s_frame_interval,
};
static const struct v4l2_subdev_pad_ops imx415_pad_ops = {
.enum_mbus_code = imx415_enum_mbus_code,
.get_fmt = imx415_get_fmt,
.set_fmt = imx415_set_fmt,
};
static const struct v4l2_subdev_ops imx415_subdev_ops = {
.core = &imx415_core_ops,
.video = &imx415_video_ops,
.pad = &imx415_pad_ops,
};
4.3 CIS(Camera Interface Subsystem)驱动层
CIS驱动是RK平台Camera架构中的数据通路核心,负责将Sensor输出的MIPI CSI-2数据流转换为系统内存可识别的格式。CIS驱动通常包含以下功能模块:
- MIPI D-PHY 控制器:配置PHY的电压、摆率、时钟频率,支持1/2/4 Lane模式。
- CSI-2 协议解析器:解析长包(Long Packet)和短包(Short Packet),提取帧起始(FS)、帧结束(FE)、行有效(LINE)等同步信号。
- VC(Virtual Channel)路由:根据VC ID将不同Sensor的数据分发到不同的ISP或DMA通道。
- Split/Combine 模块:在RK3588等高性能平台上,支持将两个Sensor的数据拼接为更高分辨率或帧率的图像。
4.4 ISP驱动层
ISP驱动是RK平台Camera图像质量的核心引擎。RK平台通常集成自研ISP(如RKISP1、RKISP2),支持完整的3A算法和多种图像增强功能。ISP驱动层的主要职责包括:
- 3A 算法接口:自动曝光(AE)、自动白平衡(AWB)、自动对焦(AF)的参数配置与统计信息获取。
- 图像处理管线:包括Bayer去噪、去马赛克(Demosaic)、色彩校正矩阵(CCM)、伽马校正(Gamma)、HDR合成等。
- 统计信息输出:提供直方图、AE统计、AF统计等数据给用户空间的3A库(如Rockchip 3A Server)。
- V4L2 Subdev 接口:通过
VIDIOC_SUBDEV_S_FMT设置输入/输出格式,通过VIDIOC_SUBDEV_S_CTRL控制ISP参数。
// ISP驱动中注册V4L2 Subdev的典型流程
static int rkisp_register_subdev(struct rkisp_device *isp_dev)
{
struct v4l2_subdev *sd = &isp_dev->subdev;
v4l2_subdev_init(sd, &rkisp_subdev_ops);
sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
snprintf(sd->name, sizeof(sd->name), "rkisp%d", isp_dev->id);
// 初始化 pads:1个输入pad(来自CIS),1个输出pad(到DMA)
isp_dev->pads[RKISP_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
isp_dev->pads[RKISP_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
media_entity_pads_init(&sd->entity, RKISP_PAD_MAX, isp_dev->pads);
// 注册subdev
v4l2_device_register_subdev(&isp_dev->v4l2_dev, sd);
return 0;
}
4.5 各层之间的协作流程
当用户空间通过V4L2 API启动Camera流时,各层驱动的协作流程如下:
- Media Controller 路由建立:用户空间通过
media-ctl或 libcamera 设置从Sensor到ISP的Pipeline。 - Sensor s_power(1):Sensor驱动上电,初始化硬件寄存器。
- Sensor s_stream(1):Sensor驱动启动MIPI数据流输出。
- CIS 驱动接收数据:CIS驱动检测到MIPI时钟,开始解析CSI-2数据包,通过VC路由将数据发送到ISP。
- ISP 驱动处理数据:ISP驱动接收原始Bayer数据,执行3A统计和图像处理,输出YUV/RGB到DMA缓冲区。
- DMA 完成中断:ISP驱动触发DMA完成中断,通知V4L2视频节点数据已就绪。
| 步骤 | 驱动层 | 关键操作 | 耗时(典型值) |
|---|---|---|---|
| 1 | 应用层 | media_ctl 设置Pipeline | ~5ms |
| 2 | Sensor | s_power(1) + 寄存器初始化 | ~20ms |
| 3 | Sensor | s_stream(1) 启动MIPI | ~2ms |
| 4 | CIS | MIPI同步锁定 + CSI-2解析 | ~1ms |
| 5 | ISP | 3A统计 + 图像处理 | ~16ms(60fps场景) |
| 6 | ISP | DMA中断 + 数据推送 | ~0.5ms |
通过以上分层架构,RK平台实现了Camera驱动的模块化和可扩展性。开发者可以根据实际硬件配置,灵活选择Sensor、CIS和ISP的组合,而无需修改其他层的代码。这种架构也使得性能优化可以针对每一层独立进行,例如在CIS层优化MIPI Lane的时钟频率,在ISP层优化3A算法的收敛速度。