Linux 内核 Raspberry Pi PiSP Back End (pisp-be) 驱动详解内存到内存 ISP 的媒体拓扑、配置缓冲区与作业调度【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本文以内核文档 raspberrypi-pisp-be.rst 为主体结合 pisp_be.c、pisp_be_formats.h 与 UAPI 配置头文件 pisp_be_config.h 的源码实现完整讲解 Raspberry Pi PiSP Back Endpisp-be驱动的媒体拓扑结构、八个视频设备节点的职责划分、基于参数缓冲区的 ISP 配置模型以及内核侧作业job准备、硬件提交与中断完成的底层流程。读完本文你将掌握如何通过 V4L2 / Media Controller API 使用 pisp-be 节点并能对照源码理解其缓冲区校验、地址翻译与作业调度的实现细节。PiSP Back End一个读写 DRAM 的内存到内存 ISPPiSP Back End下称 PiSP BE是一个 memory-to-memory 图像信号处理器ISP它从 DRAM 中读取图像数据按照应用程序通过“配置缓冲区configuration buffer”中的参数所指定的方式执行图像处理最终把像素数据写回内存且写回时通过两个相互独立的输出通道output0 与 output1完成。与典型的 MIPI CSI-2 流式采集 ISP 不同PiSP BE 的输入输出都不挂在实时数据流上而是以 DRAM 中的缓冲区为介质应用先把待处理的图像通常是 RAW Bayer 数据放到 DRAM 的输入缓冲区再提交一个描述全部处理参数的配置缓冲区硬件完成后从两个输出通道读回处理结果。三个关键设计事实来自文档与源码分块tile处理PiSP BE 以 tile 为单位处理图像。文档指出图像的切块tessellation与底层配置参数的计算由一个名为 libpisp 的自由软件用户态库完成外部项目不在本仓库内完整管线由 libcamera 实现从图像传感器经 MIPI CSI-2 采集接口捕获 RAW Bayer 数据、存入 DRAM、再交给 PiSP BE 处理这条端到端管线在 libcamera 的 Raspberry Pi 平台支持中实现外部项目寄存器与编程模型ISP 寄存器和编程模型以《Raspberry Pi Image Signal Processor (PiSP) Specification》规格文档为准外部 PDF不在本仓库内。因此内核仓库中的 pisp-be 驱动承担的是“V4L2 接口层 硬件作业提交层”的角色它不替应用计算处理参数只负责把用户提交的配置与缓冲区组织成一次硬件作业job并驱动硬件执行。pisp-be 驱动的媒体拓扑驱动位于 drivers/media/platform/raspberrypi/pisp_be 目录编译产物模块名为pisp-be见 Makefile。它同时使用三套 APIV4L2 API注册一组视频采集/输出设备节点V4L2 subdev API注册一个代表 ISP 本身的子设备subdeviceMedia Controller (MC) API把上述视频设备节点连接进单一媒体图media graph。驱动注册的媒体拓扑在文档中用 raspberrypi-pisp-be.dot 图形化描述中心是 8 个 pad 的pispbe子设备实体7 个视频设备节点通过不可变且默认使能的媒体链路MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED见 pisp_be.c 中的pispbe_init_node与其相连。媒体图共注册 8 个视频设备节点名称、方向与职责如下/dev/videoN编号为文档拓扑图的默认标注节点名默认设备号方向职责pispbe-input/dev/video0输出output提交给 ISP 处理的图像pispbe-tdn_input/dev/video1输出时域降噪TDN回读输入pispbe-stitch_input/dev/video2输出图像拼接HDR输入pispbe-output0/dev/video3采集capture第一个处理结果输出pispbe-output1/dev/video4采集第二个处理结果输出pispbe-tdn_output/dev/video5采集时域降噪状态输出pispbe-stitch_output/dev/video6采集拼接状态输出pispbe-config/dev/video7输出metaISP 配置参数缓冲区这一节点枚举与源码中的node_desc[]表一一对应pisp_be.c前三个与config节点为V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANEconfig 为V4L2_BUF_TYPE_META_OUTPUT后四个为V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE。源码注释特别提醒“OUTPUT”一词存在歧义——在 V4L2 语境中它表示硬件的输入源图像或元数据在其他地方则指硬件的输出阅读驱动时需注意区分pisp_be.c。pispbe-input待 ISP 处理的图像排入pispbe-input输出设备节点。支持作为 ISP 输入的图像格式列表以 PiSP 规格文档为准从驱动源码看输入侧支持完整的 Bayer 格式族8/10/12/14/16 位 SRGGB/SBGGR/SGRBG/SGBRG 及其 PiSP 压缩格式 PISP_COMP1_*与 GREY/Y16 灰度格式见 pisp_be_formats.h也支持 YUV/RGB 直通处理路径。pispbe-tdn_input / pispbe-tdn_output时域降噪反馈环pispbe-tdn_input输出设备接收时域降噪Temporal DenoiseTDN块要处理的图像而pispbe-tdn_output采集设备输出 TDN 的中间结果。用户态负责在两个设备上同时维护队列并确保从 output 完成dqbuf的缓冲区随后被排队qbuf到 input形成 TDN 的帧间反馈环——这正是时域降噪需要引用上一帧降噪状态的原因。pispbe-stitch_input / pispbe-stitch_outputHDR 拼接与色调映射实现 HDR高动态范围图像处理时使用图像拼接stitch与色调映射tonemapping块。pispbe-stitch_output把图像写入内存pispbe-stitch_input读取之前写入的帧与当前输入图像一起进行拼接处理。与 TDN 一样用户态负责维护两个设备的队列把 output 上完成的缓冲区排到 input 上。从 UAPI 定义看stitch 块的配置结构 struct pisp_be_stitch_config 包含低阈值、阈值差幂、曝光比exposure_ratio最高位指示流式输入帧是否为长曝光帧、运动阈值及其倒数等字段与“当前帧 上一帧”两帧拼接的 HDR 语义一致。pispbe-output0 / pispbe-output1两个采集设备把 ISP 处理后的像素数据写入内存。两条输出通道可以独立配置不同的输出格式如一路高分辨率、另一路经 downscale/resample 后的小分辨率缩略图源码中对应的使能位为PISP_BE_RGB_ENABLE_OUTPUT00x040000与PISP_BE_RGB_ENABLE_OUTPUT10x080000pisp_be_config.h。pisp_be_formats.h 中的注释解释了双输出色彩空间策略SRGB、SMPTE170M、REC709 三种色彩空间在 YCbCr 编码层面本质上等价因此 ISP 主输出可产生 sRGB低分辨率输出可产生其余任一色彩空间应用同时使用两路输出时应将两路色彩空间配置为一致。pispbe-config配置参数通道pispbe-config是一个 meta 输出视频设备接收包含 ISP 配置参数的缓冲区用于定义 ISP 需要执行的图像处理。其缓冲区格式为V4L2_META_FMT_RPI_BE_CFGbuffersize固定为sizeof(struct pisp_be_tiles_config)pisp_be.c 中pispbe_node_try_fmt_meta_out的赋值逻辑。ISP 配置模型一切由参数缓冲区定义文档的核心结论是ISP 的配置完全且仅由参数缓冲区的内容描述。用户态唯一需要通过 V4L2 API 设置的东西是输出/采集视频设备上的图像格式——其目的仅是校验参数缓冲区内容的合法性例如输出 stride 是否小于等于 V4L2 格式声明的 bytesperline。pisp_be_tiles_config 结构配置参数的顶层结构定义在 include/uapi/linux/media/raspberrypi/pisp_be_config.hstruct pisp_be_tiles_config { struct pisp_be_config config; struct pisp_tile tiles[PISP_BACK_END_NUM_TILES]; /* 最多 64 个 tile */ __u32 num_tiles; } __attribute__((packed));其中configstruct pisp_be_config全部处理参数分为三段——I/O 配置输入/TDN/stitch/输出/HOG 各缓冲区地址见 pisp_be_config.h 的结构注释、各处理块的参数DPC、GEQ、TDN、SDN、BLC、stitch、LSC、WBG、CDN、CAC、debin、tonemap、demosaic、CCM、饱和度、锐化、gamma、CSC、downscale/resample、输出格式、HOG、AXI 总线配置等以及非寄存器字段crop、LSC/CAC 网格偏移、dirty flags。dirty flags 由 libpisp 用来标记哪些块参数自上次提交后发生过变化tiles[]每个 tile 描述符固定160 字节struct pisp_tilepisp_be_config.h描述该 tile 的输入/输出偏移像素与字节两种、TDN/stitch 偏移、LSC/CAC 网格偏移、裁剪边界、缩放相位、输出位置与尺寸、HOG 写偏移以及边缘 tile 标志PISP_LEFT_EDGE等num_tiles本次作业包含的 tile 数量取值范围受PISP_BACK_END_NUM_TILES64约束。tile 尺寸约束pisp_be_config.h最小 16×16最大 65536×65536输入对齐 4 字节压缩输入 8 字节输出最少 16 字节对齐、推荐 64 字节对齐。处理块使能位图配置的开关由pisp_be_global_config中的两张位图控制pisp_be_config.hbayer_enablesenum pisp_be_bayer_enableBayer 输入路径各块的使能覆盖INPUT、DECOMPRESS、DPC坏点校正、GEQ绿平衡、TDN_INPUT/DECOMPRESS/TDN/COMPRESS/OUTPUT时域降噪链、SDN空域降噪、BLC黑电平校正、STITCH_*拼接链、WBG白平衡增益、CDN彩色降噪、LSC镜头阴影校正、TONEMAP、CAC色差校正、DEBINbin 分解、DEMOSAIC去马赛克rgb_enablesenum pisp_be_rgb_enableRGB 输出路径各块使能覆盖INPUT、CCM色彩校正矩阵、SAT_CONTROL、YCBCR、FALSE_COLOUR、SHARPEN、YCBCR_INVERSE、GAMMA、CSC0/CSC1、DOWNSCALE0/1、RESAMPLE0/1、OUTPUT0/OUTPUT1、HOG。两张位图还各自携带对应的dirty_flags_bayer/dirty_flags_rgb字段供硬件判断哪些寄存器块需要更新。bayer_order字节则描述 Bayer 输入格式的色彩排布。驱动的校验逻辑提交配置缓冲区时驱动在vb2的 prepare 回调pisp_be.c中把用户缓冲区拷贝到内核 DMA 一致内存pispbe-config[index]随后调用pisp_be_validate_configpisp_be.c做如下校验失败则以-EINVAL/-EIO拒绝该缓冲区Bayer 输入与 RGB 输入必须有且只有一个被使能XOR 检查num_tiles必须在 1 到 64 之间若使能 TDN 输出/stitch 输出/输出通道 0/1则配置中的tdn_output_format.stride、stitch_output_format.stride、output_format[j].image.stride/stride2不得大于对应节点 V4L2 格式的bytesperline且stride × height4:2:0 采样时减半不得大于sizeimage——这正是文档所述“用 V4L2 格式校验参数缓冲区内容”的实现。驱动实现纵深作业模型、硬件提交与中断完成以下各节从源码结构看 pisp-be 驱动如何把一个“配置 图像”组合转化为一次硬件作业。模块、平台匹配与 probe 流程驱动由 Kconfig 选项CONFIG_VIDEO_RASPBERRYPI_PISP_BE“Raspberry Pi PiSP Backend (BE) ISP driver”控制依赖V4L_PLATFORM_DRIVERS、VIDEO_DEV、ARCH_BCM2835 || COMPILE_TEST与PM并选择VIDEO_V4L2_SUBDEV_API、MEDIA_CONTROLLER、VIDEOBUF2_DMA_CONTIGKconfig。父目录 Kconfig 还引用了同平台的rp1-cfe前端驱动drivers/media/platform/raspberrypi/Kconfig后者负责 MIPI CSI-2 侧的采集前端与本文的 BE 驱动共同构成完整采集管线。设备树匹配字符串为raspberrypi,pispbepisp_be.c。probe 流程pisp_be.c依次完成devm_platform_ioremap_resource(pdev, 0)映射寄存器基址申请中断devm_request_irq处理函数为pispbe_isrdma_set_mask_and_coherent设为 36 位获取默认时钟配置运行时电源管理自动挂起延迟 200 mspispbe_hw_init硬件初始化读版本寄存器仅接受主版本0x02252700低 4 位 minor 掩码pisp_be.c清除遗留中断位读批处理状态计数器done/started若硬件忙或卡死则返回-EBUSY随后配置 AXI 总线寄存器QoS/cache/prot 及使能子 64 字节突发与 AWID/BID 变化的“chicken bits”并使能两个中断标志。缓冲区就绪队列与作业组装每个节点维护一个ready_queuelist_headqbuf后缓冲区入队pispbe_node_buffer_queuepisp_be.c每次入队都尝试组装作业。pispbe_prepare_jobpisp_be.c的规则与文档中各节点职责严格对应必需streaming_map中CONFIG_NODE与MAIN_INPUT_NODE必须都在采集状态且各有一个就绪缓冲区——对应文档“pispbe-input 提交图像 pispbe-config 提交参数”的最小作业可选OUTPUT0/OUTPUT1/TDN_INPUT/TDN_OUTPUT/STITCH_INPUT/STITCH_OUTPUT的缓冲区只有在配置中对应rgb_enables/bayer_enables使能位被置位时才必需若块未使能但缓冲区已提供会被直接排回用户态随其他在用缓冲区一起完成任一必需缓冲区缺失时已取出的缓冲区全部放回ready_queue并返回-ENODEV等待后续 qbuf 再触发组装成功后生成pispbe_job_descriptor含 8 个节点的缓冲区指针、13 个硬件 DMA 地址、配置指针与使能位图追加到全局job_queue。地址翻译防止硬件锁死的防御性使能修正pispbe_xlate_addrspisp_be.c把 V4L2 缓冲区翻译为硬件所需的 13 个 64 位 DMA 地址并做关键的“使能位消毒”源码注释明确警告“输入使能必须与处理阶段的要求匹配否则硬件会锁死lock up”。具体策略主输入缺失 → 清空全部 Bayer/RGB 使能TDN input 地址为 0或TDN_INPUT/TDN使能位不一致或tdn.reset被置位 → 撤销TDN_INPUT/TDN_DECOMPRESS未 reset 时同时撤销TDN使能stitch input 缺失或使能位不一致 → 撤销整个 stitch 链使能TDN/stitch 输出或 output0/1 缓冲区缺失 → 撤销对应 COMPRESS/OUTPUT 使能位。即即便配置缓冲区声称要跑 TDN/stitch只要相应节点上没有流式缓冲区驱动会自动降级禁用该链保证硬件不会引用无效地址。硬件提交与完成中断作业真正下发由pispbe_queue_job完成pisp_be.c其写入顺序即一次完整的编程序列先检查STATUS_REG的 QUEUED 位确认没有未启动的排队作业写 13 组 32 位地址寄存器对PISP_BE_IO_ADDR_LOW/HIGH顺序对应输入3 plane、tdn input/output、stitch input/output、两个主输出各 3 plane与 HOG写GLOBAL_BAYER_ENABLE/GLOBAL_RGB_ENABLE两个使能寄存器注意写入的是经过消毒的job-hw_enables而非用户配置原值——因为“驱动需要对其消毒且不希望修改或暴露于修改mmap 缓冲区”从config中global.bayer_order的偏移开始把配置寄存器块逐 u32 写入CONFIG_BASE_REG区域读回 13 组地址并比对不一致则打印“check if ISP RAMs enabled?”并放弃本次提交注释指出此错误可能致命写 tile 数组指针TILE_ADDR_LO/HI指向 DMA 一致内存中tiles成员由config_dma_addr index × sizeof(config) offsetof(tiles)计算写控制寄存器COPY_CONFIG | QUEUE_JOB | NUM_TILES(num_tiles)触发硬件拷贝配置并开始处理。pispbe_schedulepisp_be.c负责在hw_busy清零时从job_queue取下一个作业下发实现一次硬件作业、至多一个排队作业的流水。中断侧pispbe_isrpisp_be.c读BATCH_STATUS_REG的低 8 位done与高 8 位started两个单调计数器probe 时已捕获初值以忽略残留逻辑为done变化且running_job有效 → 对该作业所有参与节点源、采集、元数据顺序固定的缓冲区盖时间戳与全局递增sequencevb2_buffer_done(DONE)started变化 → 若queued_job恰好同时完成则直接收尾否则提升为running_job并允许再下发一个作业计数器不匹配时打调试日志并强制对齐最后再次调用pispbe_schedule尝试“睡之前看还有没有活干”。stop_streamingpisp_be.c会先把该节点ready_queue中滞留的缓冲区以VB2_BUF_STATE_ERROR返回注释说明M2M 场景下部分缓冲区可能永远组不成作业可能乱序返回等待所有在途缓冲区完成后清位并放运行时电源。配置缓冲区的 DMA 一致内存驱动在pispbe_init_devices中用dma_alloc_coherent一次性分配PISP_BE_NUM_CONFIG_BUFFERSVB2_MAX_FRAME即 32份pisp_be_tiles_config大小的 DMA 一致缓冲区pisp_be.c使硬件既能经CONFIG_BASE_REG读寄存器参数又能经 tile 指针直接读 DMA 内存中的 tile 数组每份配置缓冲区按其 vb2 index 独立定位tiles起点pispbe_prepare_job中job-tiles的计算pisp_be.c从而支持多个配置在队列中并存。支持的像素格式节点默认格式为 YUV420 1920×1080pispbe_node_def_fmtpisp_be.c。格式表pisp_be_formats.h按类归纳类别格式关键属性单平面 YUVYUV420、YVU420、NV12、NV21、YUYV、UYVY、YVYU、VYUY8/16 位对齐 32~128 字节YUV420/YVU420 取 128 以保证 U/V 平面 64 字节对齐多平面 YUVYUV420M、YVU420M、NV12M、NV21M、YUV422M、YVU422M、YUV444M、YVU444M2~3 平面按plane_factor计算各平面尺寸RGBRGB24、BGR24、XBGR32、RGBX32、RGB48、BGR4824/32/48 位色彩空间默认 sRGBBayer RAWSRGGB/SBGGR/SGRBG/SGBRG 8/10/12/14/16 位10/12/14 位 unpacked 存于 16 位容器PiSP 压缩 BayerPISP_COMP1_RGGB/BGGR/GRBG/GBRG、PISP_COMP1_MONO8 位存储需 DECOMPRESS 块解码灰度GREY、Y16RAW 色彩空间S_FMT时驱动用pispbe_try_format归一化未识别的 fourcc 回落到 YUV420宽高 clamp 到 tile 尺寸范围色彩空间按格式掩码回落默认值YUV 默认 SMPTE170M、RGB 默认 sRGB、RAW 默认 RAW并按格式align重新计算bytesperlineALIGN(max(请求 bpl, width×bit_depth/8), align)与各平面sizeimagepisp_be.c。帧尺寸枚举为 stepwise32~65535步进 2pisp_be.c。缓冲区内存操作使用vb2_dma_contig_memops支持VB2_MMAP | VB2_DMABUF两种 IO 模式即输入图像可由生产者如 CFE 采集前端以 dma-buf 零拷贝共享。小结与延伸阅读pisp-be 驱动的设计要点可归纳为拓扑即接口8 个视频节点 1 个 subdev 构成媒体图TDN/stitch 的 input/output 节点对以“用户态自维持双向队列”的方式表达帧间状态反馈这是理解其用法的关键配置即参数缓冲区除输出/采集设备的 V4L2 格式用于校验外所有 ISP 行为都由pisp_be_tiles_config内容决定tile 切块与参数计算外包给 libpisp端到端管线由 libcamera 承担驱动即作业调度器内核侧只做缓冲区组装config 主输入必需、其余按使能位可选、使能位消毒、寄存器序列写入、地址读回校验与done/started计数中断处理硬件行为细节以 PiSP 规格文档为准。延伸阅读路径内容仓库相对路径本文主体文档Documentation/admin-guide/media/raspberrypi-pisp-be.rst媒体拓扑图Graphviz 源Documentation/admin-guide/media/raspberrypi-pisp-be.dot驱动主实现drivers/media/platform/raspberrypi/pisp_be/pisp_be.cKconfig / MakefileKconfig、Makefile像素格式表drivers/media/platform/raspberrypi/pisp_be/pisp_be_formats.hUAPI 配置结构include/uapi/linux/media/raspberrypi/pisp_be_config.h同平台 CSI-2 前端驱动drivers/media/platform/raspberrypi/rp1-cfe【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考