Linux 内核 Intel IPU3 成像驱动实战指南:CIO2 采集与 ImgU 图像处理管线配置 Linux 内核 Intel IPU3 成像驱动实战指南CIO2 采集与 ImgU 图像处理管线配置【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux导读本文以 Linux 内核文档 Documentation/admin-guide/media/ipu3.rst 为主体系统讲解 Intel 第三代图像处理单元IPU3在 Linux V4L2 框架下的两个驱动模块负责 MIPI CSI-2 原始数据接收的 CIO2ipu3-csi2与负责图像处理的 ImgUipu3-imgu。读完本文你将掌握如何在 Kaby Lake / Sky Lake 平台上通过 media-ctl、yavta、v4l2n 等工具完成传感器原始 Bayer 帧采集、ImgU 多节点管线配置、运行模式切换以及图像处理结果转换并理解 IPU3 图像处理管线各算法块的底层实现与对应的 uAPI 数据结构。IPU3 硬件与驱动总览Intel IPU3第三代图像处理单元存在于部分 Kaby Lake 及 Sky Lake 平台U/Y 处理器系列中由两大部件组成CIO2 设备MIPI CSI-2 接收器接收来自传感器的原始 Bayer 数据并以 IPU3 专用的打包格式输出帧供 ImgU 消费。成像单元 ImgUImaging Unit负责对 CIO2 捕获的图像进行处理输出 YUV 格式图像与 3A 统计数据。两个驱动模块分别位于内核源码的drivers/media/pci/intel/ipu3CIO2文件为ipu3-cio2.c/ipu3-cio2.h与drivers/staging/media/ipu3ImgU目录下模块名分别为ipu3_csi2和ipu3_imgu。二者均实现了 V4L2、Media Controller 与 V4L2 sub-device 接口CIO2 驱动通过 V4L2 sub-device 传感器驱动支持连接在 CIO2 MIPI CSI-2 接口上的相机传感器。两个驱动在内核配置中的使能选项如下见 drivers/media/pci/intel/ipu3/Kconfig 与 drivers/staging/media/ipu3/KconfigCONFIG_VIDEO_IPU3_CIO2Intel ipu3-cio2 驱动依赖VIDEO_DEV PCI X86自动选择MEDIA_CONTROLLER、VIDEO_V4L2_SUBDEV_API、V4L2_FWNODE与VIDEOBUF2_DMA_SG编译产物为ipu3-cio2模块。CONFIG_VIDEO_IPU3_IMGUIntel ipu3-imgu 驱动依赖PCI VIDEO_DEV X86自动选择MEDIA_CONTROLLER、VIDEO_V4L2_SUBDEV_API、IOMMU_IOVA与VIDEOBUF2_DMA_SG编译产物为ipu3-imgu模块。CIO2MIPI CSI-2 原始 Bayer 帧采集CIO2 设备模型CIO2 在 V4L2 框架中以单个 V4L2 subdev 呈现向用户空间提供 subdev 接口每个 CSI-2 接收器对应一个 video node整个设备共用一个 media controller 接口。CIO2 内部包含四个独立的捕获通道每个通道拥有独立的 MIPI CSI-2 接收器与 DMA 引擎每个通道以 V4L2 sub-device 节点暴露给用户空间并带有两个 padPad方向用途0sinkMIPI CSI-2 输入连接传感器 subdev1source原始视频捕获连接 V4L2 video 接口V4L2 video 接口对 DMA 引擎进行建模以 V4L2 video device 节点暴露给用户空间。从源码看CIO2 在探测时通过v4l2_async_nf_parse_fwnodeipu3-cio2.c 附近的 sensor 异步注册逻辑异步绑定挂在 CSI-2 端口上的传感器 subdev并在流启动/停止时调用v4l2_subdev_call(q-sensor, video, s_stream, ...)见 ipu3-cio2.c来联动传感器出流。使用 CIO2 捕获原始 Bayer 帧CIO2 MIPI CSI-2 接收器用于从连接在 CSI-2 端口上的原始传感器捕获打包格式的原始 Bayer 帧捕获结果作为 ImgU 驱动的输入。由于以下两点特殊性实际使用 IPU3 图像处理需要借助raw2pnm、yavta等工具CIO2 输出的是 IPU3 专用的打包原始 Bayer 格式使用过程中需要同时操作多个 video node。以下以 ov5670 传感器连接在 CSI-2 port 0、捕获 2592x1944 图像为例假设/dev/media0为 CIO2 media 设备ov5670 连接在 i2c bus 10 地址 0x36export MDEV/dev/media0 # 获取 ov5670 传感器的 subdev 实体 export SDEV$(media-ctl -d $MDEV -e ov5670 10-0036) # 建立传感器到 CSI2 接收器的 media link media-ctl -d $MDEV -l ov5670:0 - ipu3-csi2 0:0[1] # 设置 media 设备各 pad 的格式打包原始 Bayer10bit sGRBG media-ctl -d $MDEV -V ov5670:0 [fmt:SGRBG10/2592x1944] media-ctl -d $MDEV -V ipu3-csi2 0:0 [fmt:SGRBG10/2592x1944] media-ctl -d $MDEV -V ipu3-csi2 0:1 [fmt:SGRBG10/2592x1944]media 管线配置完成后可使用 yavta 设置传感器相关参数如曝光与增益这里通过 V4L2 user control ID 写入yavta -w 0x009e0903 444 $SDEV yavta -w 0x009e0913 1024 $SDEV yavta -w 0x009e0911 2046 $SDEV随后即可进行帧捕获。下面的命令以 2592x1944 分辨率、sGRBG10 格式捕获 10 帧并以IPU3_SGRBG10格式输出yavta --data-prefix -u -c10 -n5 -I -s2592x1944 --file/tmp/frame-#.bin \ -f IPU3_SGRBG10 $(media-ctl -d $MDEV -e ipu3-cio2 0)捕获的帧保存在/tmp/frame-#.bin文件中这些文件正是后续 ImgU 处理阶段的输入。IPU3 专用 Bayer 格式关于 CIO2 输出的打包原始 Bayer 格式内核文档 Documentation/userspace-api/media/v4l/pixfmt-srggb10-ipu3.rst 给出了精确定义V4L2_PIX_FMT_IPU3_SBGGR10ip3b、V4L2_PIX_FMT_IPU3_SGBRG10ip3g、V4L2_PIX_FMT_IPU3_SGRBG10ip3G、V4L2_PIX_FMT_IPU3_SRGGB10ip3r四种格式均为每样本 10 bit 的原始 sRGB/Bayer 格式每 25 个像素打包进 32 字节最后一个字节留 6 个最高有效位填充小端字节序其余方面与标准的V4L2_PIX_FMT_SRGGB10类似。该格式在文档中以逐字节的字节序表格完整描述了打包布局实际进行字节解析与帧处理时应严格参照该布局。ImgU图像处理单元驱动ImgU 设备模型与管道ImgU 以两个 V4L2 subdev 呈现对应两条独立管道每个 subdev 向用户空间提供 V4L2 subdev 接口。每个管道最多支持 2 条流从而支撑连续取景器Continuous View FinderCVF与视频中抓拍Snapshot During VideoSDV等高级相机功能。每条管道具有 2 个 sink pad 与 3 个 source padPad方向用途0sink输入原始视频流1sink处理参数2source输出处理后的视频流3source输出取景器视频流4source3A 统计每个 pad 连接一个对应的 V4L2 video 接口以 V4L2 video device 节点暴露给用户空间。这一模型在源码中与 drivers/staging/media/ipu3/ipu3.h 定义的节点枚举一一对应IMGU_NODE_IN输入 RAW 图像、IMGU_NODE_PARAMS输入参数、IMGU_NODE_OUT主输出、IMGU_NODE_VF预览、IMGU_NODE_STAT_3A3A 统计共 5 个节点IMGU_NODE_NUM 5并且每个imgu_media_pipe结构通过imgu_pipe[IMGU_MAX_PIPE_NUM]数组管理两条管道见 ipu3.h。设备操作流程使用 ImgU 时一旦输入 video nodeipu3-imgu 0/1:0即entity:pad-number格式入队了缓冲区打包原始 Bayer 格式ImgU 即开始处理该缓冲区并在对应输出节点上产生 YUV 格式视频输出与统计输出。驱动要求当输入 video node 入队缓冲区时参数、输出与统计节点都必须已备好缓冲区。至少需要同时使能输入、主输出、3A 统计与取景器 video nodeIPU3 才能启动图像处理。各 video node 的职责input、output 与 viewfinder video nodes输入 video node 接收的帧IPU3 专用的打包原始 Bayer 格式经 IPU3 成像单元处理后输出到两个 video node分别对应主输出与取景器输出。该驱动仅支持 V4L2 多平面multi-planarAPI并遵循 V4L2 Video Capture Interface 规范。Parameters video node参数 video node 接收用于配置 ImgU 各算法如何处理图像的参数。参数格式细节见 Documentation/userspace-api/media/v4l/metafmt-intel-ipu3.rst处理参数通过ipu3-imgu [01] parameters元数据输出 video node、以v4l2_meta_format接口传入格式由ipu3_uapi_params结构描述。该结构包含ipu3_uapi_flags use标识哪些设置将被应用、ipu3_uapi_acc_param acc_param加速器簇参数、ISP 向量地址空间参数lin_vmem_params、tnr3_vmem_params、xnr3_vmem_params、ISP 数据内存DMEM参数tnr3_dmem_params、xnr3_dmem_params以及光学黑电平补偿参数obgrid_param。uAPI 头文件位于 drivers/staging/media/ipu3/include/uapi/intel-ipu3.h。3A statistics video node3A 统计 video node 用于输出 ImgU 正在处理的帧的 3A自动对焦、自动曝光、自动白平衡统计数据给用户空间应用。用户空间应用可利用这些统计数据计算所需的 ImgU 算法参数。统计数据的格式同样定义在 metafmt-intel-ipu3.rst 中由ipu3_uapi_stats_3a结构描述包含 AWB RGBS 单元、AWB 滤波响应、AF 滤波响应与 AE 直方图以及可配置参数结构ipu3_uapi_4a_config统计数据从ipu3-imgu [01] 3a stat元数据捕获 video node 获取。配置 Intel IPU3IPU3 ImgU 管线可通过 Media Controller 接口配置。运行模式与固件二进制选择ImgU 基于固件运行目前固件支持以时间分片方式用单路输入帧数据运行 2 条管道。每条管道可运行于 VIDEO 或 STILL 模式VIDEO 模式常用于视频帧捕获也可以用它抓拍静态帧以获得较低的系统负载与功耗。STILL 模式用于静态帧捕获。ImgU 会使用更小的 BDSBayer Down Scaler因子、输出更大的 Bayer 帧供后续 YUV 处理从而获得高质量图像同时 STILL 模式需要 XNR3 做降噪因此功耗与内存带宽需求高于 VIDEO 模式。TNR时域降噪在 VIDEO 模式下启用、在 STILL 模式下被旁路。ImgU 默认运行于 VIDEO 模式用户可通过 V4L2 controlV4L2_CID_INTEL_IPU3_MODE查询和设置运行模式。该 control 定义于 drivers/staging/media/ipu3/include/uapi/intel-ipu3.hV4L2_CID_INTEL_IPU3_BASE 1。从 drivers/staging/media/ipu3/ipu3-v4l2.c 的源码实现可以看到它是一个菜单型 control菜单项为 Video mode / Still mode默认值为IPU3_RUNNING_MODE_VIDEOs_ctrl回调把选择值原子写入imgu_sd-running_modeipu3-v4l2.c。对用户而言两种模式在缓冲区入队方面没有区别必须使能输入与主输出节点并入队缓冲区统计与取景器队列则是可选的。固件二进制会按当前运行模式选择若开启 ImgU 动态调试可观察到 using binary if_to_osys_stripedVIDEO 模式或 using binary if_to_osys_primary_stripedSTILL 模式的日志。对应地源码中二进制选择逻辑在 drivers/staging/media/ipu3/ipu3-css.c 打印using binary %s id %u调试信息并根据输入/输出格式与分辨率逐一筛选满足条件的 ISP 二进制。原始 Bayer 图像处理配置配置 ImgU V4L2 subdevImgU V4L2 subdev 必须通过 media controller API 配置使所有 video node 正确就位。以 ipu3-imgu 0 subdev 为例media-ctl -d $MDEV -r media-ctl -d $MDEV -l ipu3-imgu 0 input:0 - ipu3-imgu 0:0[1] media-ctl -d $MDEV -l ipu3-imgu 0:2 - ipu3-imgu 0 output:0[1] media-ctl -d $MDEV -l ipu3-imgu 0:3 - ipu3-imgu 0 viewfinder:0[1] media-ctl -d $MDEV -l ipu3-imgu 0:4 - ipu3-imgu 0 3a stat:0[1]同时应通过 control id0x009819a1设置对应 V4L2 subdev 的管道模式0 为 video 模式1 为 still 模式yavta -w 0x009819A1 1 /dev/v4l-subdev7分辨率可变硬件块ImgU 管线中有若干硬件块可通过裁剪或缩放改变帧分辨率包括Input FeederIF从传感器获取 Bayer 帧数据可对帧的行、列进行裁剪然后将像素存入设备内部像素缓冲供后续块读出。Bayer Down ScalerBDS在 Bayer 域执行图像缩放每个轴的下采样因子可配置为 1X 到 1/4X配置步进为 0.031251/32。Geometric Distortion CorrectionGDC执行畸变校正与图像滤波。它需要额外的滤波与包围填充像素因此 GDC 的输入分辨率应大于输出分辨率。YUV Scaler与 BDS 类似主要在 YUV 域做下采样最多支持 1/12X 下采样但不能应用于主输出仅适用于次级输出。这些硬件块对应的示意图为 Documentation/admin-guide/media/ipu3_rcb.svgIPU3 分辨率改变硬件块。对于给定的输入分辨率ImgU V4L2 subdev 必须在上述所有硬件块上配置所支持的分辨率由于每个硬件块都有自己的对齐要求Input Feeder、BDS 与 GDC 块都需要按各自支持的分辨率配置。配置时应聪明地设置各硬件块的输出分辨率既满足硬件要求又尽量保留最大视场field of view。中间分辨率可由专用工具 intel-ipu3-pipecfg 生成仓库文档中指向https://github.com/intel/intel-ipu3-pipecfg与 Chromium OS 的 board-overlays 仓库baseboard-poppy/media-libs/cros-camera-hal-configs-poppy/files/gcss目录下的graph_settings_ov5670.xml作为参考示例。通过 V4L2 subdev ioctl 配置 ImgU 管线以下步骤准备 ImgU 管线以进行图像处理设置数据格式通过VIDIOC_SUBDEV_S_FMT在 pad 0 设置 ImgU V4L2 subdev 的数据格式使用上一步获得的GDC 宽高。设置裁剪通过VIDIOC_SUBDEV_S_SELECTION在 pad 0 设置裁剪目标为V4L2_SEL_TGT_CROP使用Input Feeder 的宽高。设置合成compose通过VIDIOC_SUBDEV_S_SELECTION在 pad 0 设置合成目标为V4L2_SEL_TGT_COMPOSE使用BDS 的宽高。以 ov5670 为例对于输入帧分辨率 2592x1944输入到 ImgU subdev pad 0对应的 Input Feeder、BDS 与 GDC 分辨率分别为2592x1944、2592x1944、2560x1920。使用 v4l2n 处理原始 Bayer 帧配置完成后即可将接收到的原始 Bayer 帧输入 ImgU V4L2 subdev。对于 2592x1944 分辨率捕获的图像期望主输出分辨率 2560x1920、取景器分辨率 2560x1920可用如下 v4l2n 命令处理原始 Bayer 帧在主输出与取景器输出上以 NV12 格式产出结果v4l2n --pipe4 --load/tmp/frame-#.bin --open/dev/video4 --fmttype:VIDEO_OUTPUT_MPLANE,width2592,height1944,pixelformat0X47337069 \ --reqbufstype:VIDEO_OUTPUT_MPLANE,count:1 --pipe1 \ --output/tmp/frames.out --open/dev/video5 \ --fmttype:VIDEO_CAPTURE_MPLANE,width2560,height1920,pixelformatNV12 \ --reqbufstype:VIDEO_CAPTURE_MPLANE,count:1 --pipe2 \ --output/tmp/frames.vf --open/dev/video6 \ --fmttype:VIDEO_CAPTURE_MPLANE,width2560,height1920,pixelformatNV12 \ --reqbufstype:VIDEO_CAPTURE_MPLANE,count:1 --pipe3 --open/dev/video7 \ --output/tmp/frames.3A --fmttype:META_CAPTURE,? \ --reqbufscount:1,type:META_CAPTURE --pipe1,2,3,4 --stream5其中0X47337069即小端字节序下 ip3GV4L2_PIX_FMT_IPU3_SGRBG10的 fourcc 数值。也可使用 yavta 完成同样操作yavta --data-prefix -Bcapture-mplane -c10 -n5 -I -s2592x1944 \ --fileframe-#.out-f NV12 /dev/video5 \ yavta --data-prefix -Bcapture-mplane -c10 -n5 -I -s2592x1944 \ --fileframe-#.vf -f NV12 /dev/video6 \ yavta --data-prefix -Bmeta-capture -c10 -n5 -I \ --fileframe-#.3a /dev/video7 \ yavta --data-prefix -Boutput-mplane -c10 -n5 -I -s2592x1944 \ --file/tmp/frame-in.cio2 -f IPU3_SGRBG10 /dev/video4这里/dev/video4、/dev/video5、/dev/video6、/dev/video7分别对应 input、output、viewfinder 与 3A statistics 四个 video node。注意 ImgU 有一个限制所有输入分辨率都需要额外的 16x16 边距。将原始 Bayer 图像转换到 YUV 域上述步骤处理后的图像可转换到 YUV 域使用raw2pnm工具主输出帧raw2pnm -x2560 -y1920 -fNV12 /tmp/frames.out /tmp/frames.out.ppm取景器输出帧raw2pnm -x2560 -y1920 -fNV12 /tmp/frames.vf /tmp/frames.vf.ppm命令格式为分辨率、视频格式NV12后跟输入帧文件与输出 PNM 文件。IPU3 图像处理管线概述IPU3 管线包含大量图像处理阶段每个阶段都以一组参数作为输入。管线的核心流程为Raw pixels - Bayer Downscaling - Optical Black Correction - Linearization - Lens Shading Correction - White Balance/Exposure/Focus Apply - Bayer Noise Reduction - ANR - Demosaicing - Color Correction Matrix - Gamma correction - Color Space Conversion - Chroma Down Scaling - Chromatic Noise Reduction - Total Color Correction - XNR3 - TNR - DDR输出次级输出路径在此基础上经 YUV Downscaling 后写入 DDR。各主要算法块的说明与对应 uAPI 结构如下表名称描述对应结构体Optical Black Correction从各像素减去预设值以获得更佳画质ipu3_uapi_obgrid_paramLinearization用查找表处理传感器非线性效应ipu3_uapi_isp_lin_vmem_paramsSHD镜头阴影校正对每个像素施加不同增益校正镜头阴影导致的空间不均匀性ipu3_uapi_shd_config_staticBNRBayer 噪声抑制通过双边滤波器去除图像噪声ipu3_uapi_bnr_static_configANR高级噪声抑制基于块的 Bayer 域降噪算法ipu3_uapi_anr_configDM去马赛克将 Bayer 格式原始传感器数据转为 RGB 表示并输出 Y 通道估计供固件后续流处理ipu3_uapi_dm_configColor Correction用 3x3 矩阵将传感器色彩空间转换到标准 sRGB 色彩空间ipu3_uapi_ccm_mat_configGamma correction逐像素、逐分量施加的基本非线性色调映射校正ipu3_uapi_gamma_configCSC色彩空间转换用 3x3 矩阵将 RGB 表示转为 YUV 表示ipu3_uapi_csc_mat_configCDS色度下采样CSC 之后对 UV 平面在每方向按因子 2 下采样为 YUV 4:2:0使用 4x2 可配置滤波器ipu3_uapi_cds_paramsCHNR色度降噪仅处理色度像素清除高频噪声ipu3_uapi_yuvp1_chnr_configTCC总色彩校正总色彩校正ipu3_uapi_yuvp2_tcc_static_configXNR3第三代极值降噪去除捕获图像中的低频噪声ipu3_uapi_isp_xnr3_paramsISP 数据内存、ipu3_uapi_isp_xnr3_vmem_params向量内存TNR时域降噪比较连续帧以去除像素值中的异常/噪声ipu3_uapi_isp_tnr3_vmem_params、ipu3_uapi_isp_tnr3_params其余常见缩略语ACC加速器簇、AWB_FR自动白平衡滤波响应统计、BDSBayer 下采样器参数、CCM色彩校正矩阵系数、IEFd定向图像增强滤波、Obgrid光学黑电平补偿、OSYS输出系统配置、ROI感兴趣区域、YDSY 下采样、YTMY 色调映射。从实现上看管线的部分阶段由运行在 ISP 处理器上的固件执行另有许多阶段使用一组固定硬件块即加速器簇 ACC来运算像素数据并产生统计。ACC 中各算法的参数由ipu3_uapi_acc_param结构定义用户空间可通过内嵌于ipu3_uapi_params结构中的ipu3_uapi_flags选择哪些参数生效未使能的参数对应结构会被驱动忽略相应算法的既有配置将保持不变。相关 uAPI 数据类型的完整 kernel-doc 定义见 drivers/staging/media/ipu3/include/uapi/intel-ipu3.h并可在 metafmt-intel-ipu3.rst 中查看ipu3_uapi_params与ipu3_uapi_stats_3a的结构骨架。用户空间参考实现配置与使用 IPU3 的用户空间参考代码位于 Chromium OS 的 arc-camera 平台仓库hal/intel目录文档中指向https://chromium.googlesource.com/chromiumos/platform/arc-camera//master/。此外生成 ImgU 管线中间分辨率的工具 intel-ipu3-pipecfg 与本文涉及的 raw2pnmIntel nvt 工具集、yavta 等用户空间工具是完成 IPU3 端到端图像采集与处理链路不可或缺的组成部分。小结本文完整梳理了 Linux 内核中 Intel IPU3 的两级驱动架构CIO2 负责从 MIPI CSI-2 传感器接收打包原始 Bayer 帧ImgU 负责将原始帧处理为 YUV 输出与 3A 统计。通过 media-ctl 建立管线、yavta 设置传感器与运行模式、v4l2n 驱动多节点抓取再到 raw2pnm 将结果转成可查看的 PNM 图像即可在 Kaby Lake / Sky Lake 平台上跑通完整的 IPU3 相机通路。深入理解管线中各算法块及其 uAPI 结构定义于 intel-ipu3.h则是编写相机 HAL 或进行 3A 调优的基础。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考