RKISP内核驱动深度解析|Rockchip ISP39图像信号处理流水线

电子说

1.4w人已加入

描述

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

Rockchip

适用平台: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内存管理,构成一套完整稳定、低功耗的嵌入式图像信号处理系统。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分