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

欢迎来到RK ISP内核驱动的解析与实战系列的中篇。在上篇中,我们完成了驱动架构、Probe流程、ISP子设备和CSI接收等基础模块的解析。
本篇将在此基础上,进一步深入RKISP驱动的核心数据通路与硬件交互细节,覆盖 第六至第十章,包括Bridge桥接子设备、图像捕获通道、3A参数统计、ISP39新特性以及IOMMU内存管理。让我们继续探索RKISP驱动的精妙设计。
关注「触觉智能」公众号,回复关键词“客服”,联系客服即可获取瑞芯微RK开发板/核心板相关资料,可对接技术支持团队,咨询项目选型与项目需求。
前20位申领资料,可获赠开发板大额折扣。机会有限,先到先得!
六、Bridge桥接子设备:ISP与ISPP数据通道
Bridge子设备作为ISP输出与VPSS(ISPP图像后处理)输入的中间桥梁,实现图像帧数据无缝转发,源码位于bridge.c。
// bridge.h
struct 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 = <GIC_SPI 324 IRQ_TYPE_LEVEL_HIGH>;
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协处理器、介绍驱动调试接口、梳理完整业务调用链路,并给出全文总结。敬请关注下篇,为这场深度解析之旅画上圆满句号。
产品简介
