
清空记录
历史记录
取消
清空记录
历史记录

欢迎来到RK ISP内核驱动的解析与实战系列的中篇。在上篇中,我们完成了驱动架构、Probe流程、ISP子设备和CSI接收等基础模块的解析。
本篇将在此基础上,进一步深入RKISP驱动的核心数据通路与硬件交互细节,覆盖 第六至第十章,包括Bridge桥接子设备、图像捕获通道、3A参数统计、ISP39新特性以及IOMMU内存管理。让我们继续探索RKISP驱动的精妙设计。
关注「触觉智能」公众号,回复关键词“客服”,联系客服即可获取瑞芯微RK开发板/核心板相关资料,可对接技术支持团队,咨询项目选型与项目需求。
前20位申领资料,可获赠开发板大额折扣。机会有限,先到先得!
六、Bridge桥接子设备:ISP与ISPP数据通道
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; // 桥接缓存链表};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
capture_v39.c头部注释明确硬件数据流走向:
/* ISP39硬件数据流 * /M|--->|-->mainpath------------------->DDR内存 * ISP输出→|U| |-->selfpath------------------->DDR内存 * |X|------->ldc------------------------>DDR内存 */
•MainPath(MP主路):主输出通道,支持YUV、Bayer Raw全格式;
•SelfPath(SP自路):内置缩放器,输出小尺寸预览YUV图像;
•LDC Path畸变校正通道:硬件实时矫正镜头桶形/枕形畸变。
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);}每一路图像通道独立一套硬件操作函数,结构体定义于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),硬件行为完全隔离。
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停止但缓存未更新时上报异常。
•MP主路:YUV(UYVY、NV12/NV21/NV16)、Bayer RAW10/RAW12;
•SP自路:仅YUV格式,支持任意比例缩放放大/缩小。
八、Params参数下发&Stats统计上报(3A双通路)
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全部参数。
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原始图像直方图。
基于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 |
} 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通道默认关闭。
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);
时钟频率(MHz) | 参考最大宽度 | 适用业务场景 |
400 | 1920 | 1080P及以下低分辨率预览 |
400 | 2688 | 2.5K分辨率场景 |
500 | 3840 | 标准4K拍摄 |
600 | 4672 | ISP单路最大16MP分辨率 |
对比RK3588 ISP30 最低400MHz起步,无702MHz高频档位,功耗控制更优。 |
|
|
十、IOMMU内存管理与DMA缓存
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";}; dma-contig连续内存:
未开启IOMMU时使用分配连续物理内存;
由CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V39与is_dma_contig控制;
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);
中篇到此结束。在本篇中,我们详细解读了Bridge桥接、三路捕获通道、3A双通路、ISP39新增硬件特性以及IOMMU内存管理,这些构成了RKISP驱动运行时的高效数据管道。
下篇将是本系列的终章,我们将揭秘ISP39独有的AI ISP协处理器、介绍驱动调试接口、梳理完整业务调用链路,并给出全文总结。敬请关注下篇,为这场深度解析之旅画上圆满句号。
产品简介
