RKISP内核驱动深度解析|Rockchip ISP39图像信号处理流水线 电子说
RKISP驱动是瑞芯微Camera系统的核心内核模块,全权负责ISP硬件、MIPI CSI-2数据接收、多路图像采集通道、3A统计运算与图像参数配置管理。本文基于RK3576(ISP39)+ Kernel 6.1完整源码,从驱动分层架构、设备初始化Probe流程、Media子设备拓扑、中断处理、ISP39专属硬件特性、DTS设备树配置等维度,全方位拆解RKISP整套驱动逻辑。

适用平台:RK3576 / ISP39
内核版本:Kernel 6.1(源码路径:drivers/media/platform/rockchip/isp/)
配套代码目录:kernel-6.1/drivers/media/platform/rockchip/isp/
驱动版本:v2.6.0+(该版本首次完整支持ISP39硬件)
一、驱动架构全景
1.1 整体分层结构
RKISP驱动遵循V4L2标准分层设计,从用户态到硬件寄存器分为五层,层级清晰解耦:
┌──────────────────────────────────────────────────────────┐│ 用户态层 (Camera HAL3) │├──────────────────────────────────────────────────────────┤│ /dev/video* /dev/v4l2-subdev* 设备节点 │├──────────────────────────────────────────────────────────┤│ V4L2 / Media Controller 媒体框架层 │├──────────────────────────────────────────────────────────┤│ rkisp 驱动总入口层 ││ (dev.c / rkisp.c / hw.c / regs.c) │├─────────────┬────────────── ┬─────────────────────────────┤│ rkisp.ko │ 捕获通道 │ 3A / 参数管理 ││ 主驱动模块 │ capture.c │ isp_params.c / stats.c ││ │ capture_v39.c │ isp_params_v39.c ││ │ │ isp_stats_v39.c │├─────────────┴────────────── ┴─────────────────────────────┤│ CSI-2 接收 │ Bridge桥接 │ IOMMU │ DMA Rx ││ csi.c │ bridge.c │ rkisp_mmu │ dmarx.c │├───────────── ┴──────────────┴────────────┴──────────┤│ ISP39 硬件寄存器底层 ││ (regs.c / regs_v3x.h) │└─────────────────────────────────────────────────────┘
1.2 ISP硬件版本枚举定义
在驱动头文件common.h中定义了全系列ISP硬件版本枚举,RK3576平台专属ISP39对应宏ISP_V39 = 0xa0:
// common.henum rkisp_isp_ver { ISP_V10 = 0x00, ISP_V12 = 0x20, ISP_V13 = 0x30, ISP_V20 = 0x40, ISP_V21 = 0x50, ISP_V30 = 0x60, ISP_V32 = 0x70, ISP_V32_L= 0x80, ISP_V33 = 0x90, ISP_V39 = 0xa0, // RK3576平台专用ISP ISP_V35 = 0xb0,};
1.3 Media Controller媒体拓扑图
RKISP完全基于V4L2 Media Controller框架实现,注册大量v4l2_subdev子设备与video输出节点,完整数据流链路如下:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐│ Sensor │ │ MIPI D-PHY │ │ CSI Subdev ││ 图像传感器 │────MIPI物理层────── rkisp-csi子设备 │└──────────────┘ └──────────────┘ └──────┬───────┘ │ ▼┌───────────────────────────────────────────────────────┐│ ISP Subdev (rkisp-isp-subdev) ││ 端口:SINK(0)输入 | SINK_PARAMS(1)参数 | SOURCE_PATH(2)图像输出│ │ SOURCE_STATS(3)3A统计输出└──┬──────────────┬──────────────┬──────────┴───────────┘ │ │ │ ▼ ▼ ▼┌────────┐ ┌──────────┐ ┌───────────┐│ MP │ │ SP │ │ LDC ││ mainpath│ │ selfpath │ │ ldcpath ││ /dev/ │ │ /dev/ │ │ /dev/ ││ video0 │ │ video1 │ │ video2 │└────────┘ └──────────┘ └───────────┘┌──────────┐ ┌───────────┐│ params │ │ stats ││ 参数下发 │ │ 3A统计上报 │└──────────┘ └───────────┘
各video设备节点功能对照表(定义于capture.h):
| 宏定义 | 设备节点名称 | 核心用途 |
| MP_VDEV_NAME | rkisp_mainpath | 主输出通道,支持YUV/Raw原始图像输出 |
| SP_VDEV_NAME | rkisp_selfpath | 自缩放通道,输出小尺寸预览图 |
| LDC_VDEV_NAME | rkisp_ldcpath | 镜头畸变校正专用输出通道 |
| FBC_VDEV_NAME | rkisp_fbcpath | ISP39新增,图像压缩输出通道 |
| BP_VDEV_NAME | rkisp_bypasspath | Bypass直通通道,输出未经ISP处理原始数据 |
| DMATRX0_VDEV_NAME | rkisp_rawwr0~3 | HDR多路DMA原始数据写入通道 |
设备节点可在系统路径/sys/class/video4linux/下查看,全部挂载至media graph媒体拓扑链路中。
二、Probe设备上电初始化全流程
2.1 平台设备匹配与DTS节点配置
驱动入口函数为dev.c内rkisp_plat_probe(),通过DTS中compatible字符串匹配硬件平台:
// hw.c{ .compatible = "rockchip,rk3576-rkisp", .data = &rk3576_isp_match_data },
RK3576完整ISP设备树节点(rk3576.dtsi:3302):
rkisp: isp@27c00000 { compatible = "rockchip,rk3576-rkisp"; reg = <0x0 0x27c00000 0x0 0x7f00>; interrupts = , // mipi_irq , // mi_irq ; // isp_irq interrupt-names = "mipi_irq", "mi_irq", "isp_irq"; clocks = <&cru ACLK_ISP>, <&cru HCLK_ISP>, <&cru CLK_ISP_CORE>, <&cru CLK_ISP_CORE_MARVIN>, <&cru CLK_ISP_CORE_VICAP>; clock-names = "aclk_isp", "hclk_isp", "clk_isp_core", "clk_isp_core_marvin", "clk_isp_core_vicap"; power-domains = <&power RK3576_PD_VI>; iommus = <&rkisp_mmu>; status = "disabled";};
2.2 Probe主函数执行顺序
rkisp_plat_probe()(dev.c:911)从上电到注册完整子设备执行链路:
rkisp_plat_probe├── rkisp_attach_hw() // 绑定物理硬件设备(hw.c)│ ├── of_find_device_by_node(hw_node)│ └── rkisp_hw_probe() // 硬件底层初始化├── devm_kzalloc(sw_base) // 分配软件影子寄存器缓存├── rkisp_vs_irq_parse() // 解析VSYNC帧同步中断├── media_device_init() // 初始化Media设备框架├── v4l2_device_register() // 注册标准V4L2设备├── pm_runtime_enable() // 开启电源管理 runtime├── rkisp_register_platform_subdevs() // 核心:批量注册所有子设备│ ├── rkisp_register_isp_subdev() // ISP核心子设备│ ├── rkisp_register_csi_subdev() // CSI MIPI接收子设备│ ├── rkisp_register_bridge_subdev() // ISP与ISPP桥接子设备│ ├── rkisp_register_stream_vdevs() // MP/SP/LDC图像捕获通道│ │ └── (版本分发) rkisp_register_stream_v39()│ ├── rkisp_register_dmarx_vdev() // DMA原始数据写入节点│ ├── rkisp_register_stats_vdev() // 3A统计上报节点│ ├── rkisp_register_params_vdev() // 3A参数下发节点│ ├── rkisp_register_luma_vdev() // 亮度统计通道│ └── rkisp_register_pdaf_vdev() // PDAF对焦数据通道(可选)├── isp_subdev_notifier() // 异步探测Sensor图像传感器└── media_device_register() // 完成Media设备注册
2.3 硬件绑定 rkisp_attach_hw
该函数建立逻辑驱动与物理ISP硬件的绑定关系,核心硬件结构体rkisp_hw_dev:
// hw.cstruct rkisp_hw_dev { const struct isp_match_data *match_data; struct platform_device *pdev; void __iomem *base_addr; struct clk *clks[RKISP_MAX_BUS_CLK]; enum rkisp_isp_ver isp_ver; struct rkisp_device *isp[DEV_MAX]; // 最多DEV_MAX个虚拟ISP设备 int dev_num; u32 unite; // 图像拼接模式:无拼接/双ISP拼接/单通道拼接 bool is_mmu; struct rkisp_monitor monitor; // 硬件看门狗监控 // ...};
RK3576 ISP硬件匹配时钟配置(hw.c:929):
static const struct isp_match_data rk3576_isp_match_data = { .clks = rk3576_isp_clks, .num_clks = ARRAY_SIZE(rk3576_isp_clks), .isp_ver = ISP_V39, .clk_rate_tbl = rk3576_isp_clk_rate, .num_clk_rate_tbl = ARRAY_SIZE(rk3576_isp_clk_rate),};static const char * const rk3576_isp_clks[] = { "clk_isp_core", "aclk_isp", "hclk_isp", "clk_isp_core_marvin", "clk_isp_core_vicap",};
RK3576 ISP共5路独立时钟域,对比RK3588精简冗余拼接时钟;其中clk_isp_core_marvin、clk_isp_core_vicap为ISP39全新硬件时钟。
2.4 多虚拟ISP拓扑(Multi Virtual ISP)
RK3576 DTS定义rkisp_vir0 ~ rkisp_vir5共6路虚拟ISP,全部共享同一块物理ISP硬件,通过rockchip,hw = <&rkisp>绑定物理节点:
物理ISP硬件 ──→ rkisp_vir0 ──→ rkisp_vir0_sditf ──→ vpss0_in (ISPP后处理) │ rkisp_vir1 ──→ rkisp_vir1_sditf ──→ vpss1_in │ rkisp_vir2 ──→ rkisp_vir2_sditf ──→ vpss2_in │ ... └ rkisp_vir5 ──→ rkisp_vir5_sditf ──→ vpss5_in
每一路rkisp_virN通过sditf(子设备接口)桥接对应VPSS图像后处理单元。
多虚拟ISP核心作用:支持多路Sensor、多规格图像流分时复用单块ISP硬件,由上层AIQ 3A算法做时间片调度,是双摄、多摄方案的核心底层支撑。
三、ISP核心Subdev子设备详解
3.1 核心数据结构 rkisp_isp_subdev
该结构体是ISP图像处理管线的逻辑抽象,定义于rkisp.h:136:
struct rkisp_isp_subdev { struct v4l2_subdev sd; // 标准V4L2子设备实例 struct media_pad pads[RKISP_ISP_PAD_MAX]; // 4个媒体端口 struct v4l2_mbus_framefmt in_frm; // Sensor原始输入图像尺寸 struct ispsd_in_fmt in_fmt; // 输入图像格式 struct v4l2_rect in_crop; // ISP_ACQ输入裁剪区域 struct ispsd_out_fmt out_fmt; // ISP输出图像格式 struct v4l2_rect out_crop; // ISP_IS输出稳定裁剪区域 atomic_t frm_sync_seq; // 帧同步序列号};
3.2 媒体端口Pad布局与两级裁剪
端口定义
enum rkisp_isp_pad { RKISP_ISP_PAD_SINK, // Pad 0:图像输入(CSI/DVP数据源) RKISP_ISP_PAD_SINK_PARAMS, // Pad 1:3A参数下发输入口 RKISP_ISP_PAD_SOURCE_PATH, // Pad 2:处理后图像输出(MP/SP/LDC) RKISP_ISP_PAD_SOURCE_STATS, // Pad 3:3A统计数据输出口 RKISP_ISP_PAD_MAX};
ISP内部两级裁剪逻辑
+---------------------------------------------------------+| Sensor原始图像 in_frm || +---------------------------------------------------+ || | ISP_ACQ (黑电平校正专用裁剪) | || | in_crop 裁剪有效像素区域 | || | +--------------------------------------------+ | || | | ISP_IS (图像防抖稳定裁剪) | | || | | out_crop 最终输出分辨率裁剪 | | || | | | | || | | ──→ MP (mainpath) 输出YUV/Raw原图 | | || | | ──→ SP (selfpath) 缩放预览图 | | || | | ──→ LDC (ldcpath) 畸变校正图 | | || | +--------------------------------------------+ | || +---------------------------------------------------+ |+---------------------------------------------------------+
1.ISP_ACQ(in_crop):从Sensor原始画面截取有效像素,用于黑电平校正BLS、坏点修复DPCC;
2.ISP_IS(out_crop):图像防抖裁剪,裁剪后分辨率直接输出至三路捕获通道。
3.3 ISP39输入分辨率硬件上限
// rkisp.h#define CIF_ISP_INPUT_W_MAX_V39 4672#define CIF_ISP_INPUT_H_MAX_V39 3504#define CIF_ISP_INPUT_W_MAX_V39_UNITE 8192 // 双ISP拼接模式宽#define CIF_ISP_INPUT_H_MAX_V39_UNITE 6144 // 双ISP拼接模式高
规格总结:单ISP最大支持4672×3504(约1600万像素);开启Unite双ISP拼接模式最高支持8192×6144(约5000万像素)。
四、CSI-2接收子设备(csi.c)
4.1 CSI Subdev核心职责
CSI子设备专门管理MIPI CSI-2接收端硬件,核心工作:
1.D-PHY物理层初始化、MIPI Lane通道数量配置;
2.MIPI数据类型(DT)解析(RAW10/RAW12/YUV422等);
3.虚拟通道VC路由分配;
4.MIPI数据包错误检测、异常硬件复位恢复。
CSI设备结构体:
// csi.hstruct rkisp_csi_device { struct v4l2_subdev sd; struct media_pad pads[CSI_PAD_MAX]; int lanes; // MIPI通道数量 u32 datatype; // MIPI数据类型 u32 channel; // MIPI虚拟通道VC bool is_csi3; // CSI-3协议标识 // ...};
4.2 Sensor与CSI链路解析
rkisp_fwnode_parse()(dev.c:690)解析DTS端点MIPI总线配置:
static int rkisp_fwnode_parse(struct device *dev, struct v4l2_fwnode_endpoint *vep, struct v4l2_async_subdev *asd){ struct rkisp_async_subdev *rk_asd = container_of(asd, struct rkisp_async_subdev, asd); // MIPI sensor总线配置由D-PHY层单独处理,此处仅处理并行/BT656 if (vep->bus_type != V4L2_MBUS_BT656 && vep->bus_type != V4L2_MBUS_PARALLEL) return 0; rk_asd->mbus.type = vep->bus_type; return 0;}
4.3 MIPI中断处理逻辑
中断入口rkisp_mipi_v3x_isr():
1.解析phy锁失、溢出、数据包校验错误等状态位;
2.错误计数累计超过RKISP_CONTI_ERR_MAX (50)自动复位MIPI硬件;
3.向上层上报V4L2_EVENT_FRAME_SYNC帧同步事件,供给3A算法使用。
五、Bridge桥接子设备:ISP与ISPP数据通道
5.1 Bridge核心作用
Bridge子设备作为ISP输出与VPSS(ISPP图像后处理)输入的中间桥梁,实现图像帧数据无缝转发,源码位于bridge.c。
// bridge.hstruct rkisp_bridge_device { struct v4l2_subdev sd; struct media_pad pads[BRIDGE_PAD_MAX]; struct rkisp_device *ispdev; struct list_head list; // 桥接缓存链表};
5.2 共享DMA Buffer缓存机制
Bridge预分配BRIDGE_BUF_MAX组DMA缓存,实现ISP与ISPP零拷贝共享:
free_bridge_buf(struct rkisp_bridge_device *dev){ struct rkisp_hw_dev *hw = dev->ispdev->hw_dev; for (i = 0; i < BRIDGE_BUF_MAX; i++) { buf = &hw->bufs[i]; for (j = 0; j < GROUP_BUF_MAX; j++) rkisp_free_buffer(dev->ispdev, &buf->dummy[j]); }}
ISP39架构通过sditf子设备接口解耦ISP与VPSS,标准数据流:
Sensor → CSI → ISP subdev → [sditf桥接] → VPSS (ISPP后处理)
六、三路图像捕获通道:MainPath / SelfPath / LDC
6.1 ISP39通道数据流
capture_v39.c头部注释明确硬件数据流走向:
/* ISP39硬件数据流 * /M|--->|-->mainpath------------------->DDR内存 * ISP输出→|U| |-->selfpath------------------->DDR内存 * |X|------->ldc------------------------>DDR内存 */
•MainPath(MP主路):主输出通道,支持YUV、Bayer Raw全格式;
•SelfPath(SP自路):内置缩放器,输出小尺寸预览YUV图像;
•LDC Path畸变校正通道:硬件实时矫正镜头桶形/枕形畸变。
6.2 版本差异化注册接口
ISP39专属通道注册接口声明(capture_v3x.h):
#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V39)int rkisp_register_stream_v39(struct rkisp_device *dev);void rkisp_unregister_stream_v39(struct rkisp_device *dev);void rkisp_mi_v39_isr(u32 mis_val, struct rkisp_device *dev);void rkisp_stream_ldc_end_v39(struct rkisp_device *dev);#endif
驱动通过ISP硬件版本号自动分发对应接口(capture.c:1939):
} else if (dev->isp_ver == ISP_V39) { ret = rkisp_register_stream_v39(dev);}
6.3 Stream硬件操作集 streams_ops
每一路图像通道独立一套硬件操作函数,结构体定义于capture.h:234:
struct streams_ops { int (*config_mi)(struct rkisp_stream *stream); // 配置内存接口MI寄存器 void (*stop_mi)(struct rkisp_stream *stream); // 关闭MI输出 void (*enable_mi)(struct rkisp_stream *stream); // 开启MI输出 bool (*is_stream_stopped)(struct rkisp_stream *stream); // 判断通道停止状态 void (*update_mi)(struct rkisp_stream *stream); // 动态更新MI寄存器 int (*frame_end)(struct rkisp_stream *stream, u32 state); // 帧结束回调 int (*frame_start)(struct rkisp_stream *stream, u32 mis); // 帧开始回调 int (*set_wrap)(struct rkisp_stream *stream, int line); // 行循环模式配置};
ISP39分别为MP/SP/LDC实现独立ops实例(capture_v39.c:930-961),硬件行为完全隔离。
6.4 帧中断完整处理链路
VSYNC帧同步中断 │ ├── rkisp_isp_isr() // ISP全局中断(dev.c) │ ├── ISP_FRAME_IN // 新帧数据进入ISP │ ├── ISP_FRAME_END // ISP图像处理完成 │ └── ISP_3A_MEAS_DONE // 3A统计数据采集完成 │ ├── rkisp_mi_isr() // MI内存接口中断 │ ├── rkisp_register_stream_v39 → rkisp_mi_v39_isr() │ ├── mi_frame_start() // 帧开始:填充下一块DMA缓存 │ └── mi_frame_end() // 帧结束:缓存出队,上报用户态 │ └── rkisp_mipi_isr() // MIPI错误中断处理
mi_frame_start()核心逻辑(capture_v39.c:963):
1.判断通道是否处于推流状态;
2.动态裁剪/缩放场景更新dcrop、rsz寄存器;
3.从缓存队列取出空闲buffer赋值给当前帧、下一帧;
4.调用update_mi刷新硬件寄存器;
5.检测丢帧,MI停止但缓存未更新时上报异常。
6.5 支持图像格式
•MP主路:YUV(UYVY、NV12/NV21/NV16)、Bayer RAW10/RAW12;
•SP自路:仅YUV格式,支持任意比例缩放放大/缩小。
七、Params参数下发 & Stats统计上报(3A双通路)
7.1 isp_params:用户态AIQ参数下发通道
isp_params_v39.c是ISP39驱动体量最大文件(8275行),接收上层AIQ算法下发全部ISP图像处理参数,完整流程:
用户态AIQ算法库 │ 通过ioctl入队参数buffer ▼rkisp_params_v39: params_vb2_ops ├── buf_prepare: 参数合法性校验 ├── start_streaming: ISP硬件默认参数初始化 ├── stop_streaming: 关闭参数通道 └── buf_queue: 批量下发3A参数写入硬件寄存器 ├── isp3_param_write() // 底层寄存器单次写入 ├── config_isp_v39() // 分模块批量配置ISP硬件 │ ├── config_dpcc // 坏点修复 │ ├── config_bls // 黑电平校正 │ ├── config_lsc // 镜头阴影校正(LUT查表) │ ├── config_awb // 自动白平衡 │ ├── config_ae // 自动曝光、HDR动态曝光 │ ├── config_af // 自动对焦 │ ├── config_baynr // Bayer域降噪 │ ├── config_ynr // 亮度通道降噪 │ ├── config_cnr // 色度降噪 │ ├── config_sharp // 图像锐化 │ ├── config_dehaze // 硬件去雾DHZ │ ├── config_drc // 动态范围压缩 │ ├── config_3dlut // 3D LUT色彩映射 │ └── config_cgc // 色彩增益校正 └── update_params_v39() // 触发硬件寄存器同步更新
上层AIQ v6.x版本通过RKISP_CMD_SET_PARAMS_V39专用ioctl下发ISP39全部参数。
7.2 isp_stats:硬件3A统计数据上报
isp_stats_v39.c负责读取ISP硬件统计数据回传给AIQ算法,核心标识:
// ISP39 3A统计完成中断标志#define ISP39_3A_MEAS_DONE BIT(31)
支持读取的统计数据类型:
1.AE自动曝光:亮度直方图、分区权重统计;
2.AWB自动白平衡:色温估算分区RGB统计;
3.AF自动对焦:对比度统计、PDAF相位对焦数据;
4.DHZ去雾:IIR滤波直方图;
5.RAW原始图像直方图。
八、ISP39对比前代ISP核心新增特性
基于version.h版本记录,ISP_V39(驱动v2.6.0)新增硬件能力对照表:
| 特性名称 | 功能说明 |
| AIISP AI图像引擎 | 内置RISC-V协处理器,硬件运行AI降噪、画质增强神经网络 |
| Unite双ISP拼接模式 | 支持超大分辨率拼接,最高8192×6144输出 |
| 多Sensor虚拟ISP调度 | 6路虚拟ISP分时复用硬件,多摄场景优化 |
| DPCC PDAF兼容 | 坏点修复逻辑保护PDAF相位对焦像素 |
| GIC全局光照补偿 | 均匀画面整体光照,改善明暗不均 |
| W3A并行3A运算 | AE/AWB/AF三路统计硬件并行计算,降低延迟 |
| ADRC自适应动态范围压缩 | 智能优化亮部过曝、暗部噪点 |
| LDC独立硬件通道 | 专用畸变校正通道,不占用主路带宽 |
| 双新增独立时钟域 | clk_isp_core_marvin、clk_isp_core_vicap |
8.1 ISP39硬件上电默认初始化(hw.c:1111)
} else if (dev->isp_ver == ISP_V39) { writel(0, dev->base_addr + ISP32_BLS_ISP_OB_PREDGAIN); writel(ISP39_ADRC_CMPS_BYP_EN, dev->base_addr + ISP3X_DRC_CTRL0); writel(ISP39_W3A_PDAF2DDR_HOLD_DIS | ISP39_W3A_3A_HOLD_DIS, dev->base_addr + ISP39_W3A_CTRL0); writel(0, dev->base_addr + ISP39_VI3A_CTRL0);}
初始化逻辑:
1.BLS黑电平预增益清零,默认关闭;
2.ADRC动态范围压缩默认旁路Bypass;
3.W3A 3A统计数据持续写入DDR,不锁存;
4.VI视频输入3A通道默认关闭。
8.2 Debayer去马赛克增强配置
ISP39搭载优化版插值滤波器,上电预设专用滤波参数(hw.c:1135):
writel(0x00014001, dev->base_addr + ISP39_DEBAYER_G_FILTER_MODE_OFFSET);writel(0x000a1018, dev->base_addr + ISP39_DEBAYER_G_FILTER_FILTER);writel(0x08000800, dev->base_addr + ISP39_DEBAYER_G_FILTER_VSIGMA0);writel(0x02000400, dev->base_addr + ISP39_DEBAYER_G_FILTER_VSIGMA1);writel(0x00cd0155, dev->base_addr + ISP39_DEBAYER_G_FILTER_VSIGMA2);writel(0x00800092, dev->base_addr + ISP39_DEBAYER_G_FILTER_VSIGMA3);
8.3 ISP时钟频率档位(hw.c:761)
| 时钟频率(MHz) | 参考最大宽度 | 适用业务场景 |
| 400 | 1920 | 1080P及以下低分辨率预览 |
| 400 | 2688 | 2.5K分辨率场景 |
| 500 | 3840 | 标准4K拍摄 |
| 600 | 4672 | ISP单路最大16MP分辨率 |
| 对比RK3588 ISP30,RK3576 ISP39时钟策略更保守,最低400MHz起步,无702MHz高频档位,功耗控制更优。 |
九、IOMMU内存管理与DMA缓存
9.1 ISP独立IOMMU设备树节点(rk3576.dtsi:3320)
rkisp_mmu: iommu@27c07f00 { compatible = "rockchip,iommu-v2"; reg = <0x0 0x27c07f00 0x0 0x100>; interrupts = ; interrupt-names = "isp_mmu"; clocks = <&cru ACLK_ISP>, <&cru HCLK_ISP>; clock-names = "aclk", "iface"; power-domains = <&power RK3576_PD_VI>; #iommu-cells = <0>; rockchip,disable-mmu-reset; // MMU复位不销毁页表,防止帧传输异常 status = "disabled";};
9.2 DMA两种工作模式
1.dma-contig连续内存:未开启IOMMU时使用,分配连续物理内存;由CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V39与is_dma_contig控制;
2.dma-sg分散聚集DMA:开启IOMMU后启用,虚拟地址连续、物理地址离散,节省大块连续内存。
缓存操作统一封装在common.c:
int rkisp_alloc_buffer(struct rkisp_device *dev, struct rkisp_dummy_buffer *buf);void rkisp_free_buffer(struct rkisp_device *dev, struct rkisp_dummy_buffer *buf);void rkisp_prepare_buffer(struct rkisp_device *dev, struct rkisp_dummy_buffer *buf);void rkisp_finish_buffer(struct rkisp_device *dev, struct rkisp_dummy_buffer *buf);
十、完整中断系统架构
RK3576 ISP硬件挂载3路独立GIC中断,分工明确:
| 中断名称 | 触发方式 | 中断处理函数 | 核心职责 |
| mipi_irq | 高电平触发 | rkisp_mipi_isr() / rkisp_mipi_v3x_isr() | MIPI数据包错误检测、VSYNC帧同步事件上报 |
| mi_irq | 高电平触发 | rkisp_mi_isr() → rkisp_mi_v39_isr() | MI内存接口帧开始/帧结束、DMA缓存管理 |
| isp_irq | 高电平触发 | rkisp_isp_isr() | ISP管线状态、3A统计完成中断 |
三路中断协同工作逻辑:
1.mipi_irq:上报Sensor VSYNC帧同步信号;
2.isp_irq:通知ISP图像处理完成、3A统计就绪;
3.mi_irq:图像数据写入DDR内存完成,推送缓存至用户态。
配套硬件看门狗rkisp_monitor:持续检测帧中断丢失,连续丢帧达到阈值自动复位ISP硬件,解决卡死、死机问题。
十一、ISP39专属AIISP协处理器
AIISP是ISP39标志性新增硬件单元,内置独立RISC-V协处理器,用于本地运行AI降噪、图像增强神经网络,配套代码分布:
1.hw.c:isp39_aiisp系列硬件寄存器配置;
2.isp_params_v39.c:config_aiisp() AI模型参数下发;
3.version.h:标注aiisp双缓存、离线模式默认开启特性。
两种工作模式:
1.Online在线模式:ISP处理完成后直接送入AIISP运算,不落地DDR;
2.Offline离线模式(ISP39默认):ISP图像写入DDR,AIISP从内存读取图像推理,兼容性更强。
十二、驱动调试接口
12.1 procfs调试节点
驱动注册/proc/rkisp虚拟文件系统,可读取信息:
•驱动版本、ISP硬件版本;
•实时寄存器dump;
•帧率、丢帧、中断统计;
•各图像通道运行状态。
12.2 全局调试开关(common.h)
// common.hextern int rkisp_debug; // 日志打印等级extern bool rkisp_monitor; // 硬件看门狗总开关extern bool rkisp_irq_dbg; // 中断日志调试extern bool rkisp_buf_dbg; // DMA缓存日志调试extern u64 rkisp_debug_reg; // 指定寄存器单独打印调试
可通过/sys/module/video_rkisp/parameters/动态修改参数,无需重新编译内核。
十三、完整业务调用链路(上电→出帧→停止)
1. 上电初始化链路
rkisp_plat_probe() └→ rkisp_register_platform_subdevs() └→ isp_subdev_notifier() └→ subdev_notifier_complete() // Sensor异步探测完成 ├→ rkisp_create_links() // 构建media graph媒体链路 ├→ _set_pipeline_default_fmt() // 设置默认图像格式 └→ schedule_work(fast_work) // Thunderboot相机快速启动
2. 用户态开启推流Stream ON
rkisp_pipeline_open() ├→ pm_runtime_get_sync() // ISP硬件上电、打开电源域 ├→ rkisp_hw_enum_isp_size() // 读取ISP硬件最大分辨率规格 ├→ v4l2_subdev_call(s_s_power, 1) // Sensor图像传感器上电 └→ media_pipeline_start() // 启动整条媒体管线rkisp_pipeline_set_stream(1) ├→ v4l2_subdev_call(s_stream, 1) // Sensor输出图像数据流 ├→ rkisp_config_isp() // 写入ISP基础硬件参数 └→ rkisp_set_stream() // 使能MI内存输出通道
3. 运行时中断循环
硬件中断触发→ 对应ISR处理
1.rkisp_isp_isr():采集3A统计数据;
2.rkisp_mi_isr():帧结束,缓存出队,用户态dequeue取图;
3.rkisp_mipi_isr():MIPI异常处理。
4. 关闭推流Stream OFF
rkisp_pipeline_set_stream(0) // 关闭图像输出通道rkisp_pipeline_close() // 释放管线资源、下电ISP硬件
十四、全文总结
| 技术维度 | RK3576 ISP39核心关键特征 |
| 硬件版本标识 | ISP_V39 (0xa0) |
| 最大输出分辨率 | 单ISP:4672×3504;Unite拼接:8192×6144 |
| 时钟域 | 5路独立时钟(core/marvin/vicap/aclk/hclk) |
| 图像拓扑 | 6路虚拟ISP + sditf桥接 → VPSS后处理 |
| 输出捕获通道 | MP主路 / SP自路 / LDC畸变校正 / FBC压缩 / BP直通 / DMATX HDR原始通道 |
| 3A系统 | W3A并行AE/AWB/AF + PDAF相位对焦支持 |
| 独有硬件 | AIISP RISC-V AI协处理器 |
| 特色能力 | 多虚拟ISP硬件分时复用、超大图拼接、Thunderboot快速启动 |
ISP39驱动是瑞芯微新一代高性能Camera解决方案,对比前代ISP30/ISP32在AI图像处理、多路摄像头调度、超大分辨率拍摄实现全面升级,搭配RK3576 VI电源域、独立IOMMU内存管理,构成一套完整稳定、低功耗的嵌入式图像信号处理系统。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !