9. OMAP 3 图像信号处理器 (ISP) 驱动程序

版权所有 © 2010 Nokia Corporation

版权所有 © 2009 Texas Instruments, Inc.

联系人:Laurent Pinchart <laurent.pinchart@ideasonboard.com>, Sakari Ailus <sakari.ailus@iki.fi>, David Cohen <dacohen@gmail.com>

9.1. 事件

OMAP 3 ISP 驱动程序支持 CCDC 和统计信息(AEWB、AF 和直方图)子设备上的 V4L2 事件接口。

CCDC 子设备在 HS_VS 中断上生成 V4L2_EVENT_FRAME_SYNC 类型事件,用于指示帧开始。该驱动程序的早期版本为此目的使用了 V4L2_EVENT_OMAP3ISP_HS_VS。当 CCDC 模块中开始接收帧的第一行时,会准确触发该事件。该事件可以在 CCDC 子设备上订阅。

(使用并行接口时,必须注意 VS 信号极性的正确配置。使用串行接收器时,这会自动更正。)

每个统计信息子设备都能够生成事件。每当用户空间应用程序可以使用 VIDIOC_OMAP3ISP_STAT_REQ IOCTL 将统计信息缓冲区出列时,就会生成一个事件。可用的事件有

  • V4L2_EVENT_OMAP3ISP_AEWB

  • V4L2_EVENT_OMAP3ISP_AF

  • V4L2_EVENT_OMAP3ISP_HIST

对于这些 ioctl,事件数据的类型为 struct omap3isp_stat_event_status。如果计算统计信息时出错,将像往常一样发生事件,但没有相关的统计信息缓冲区。在这种情况下,omap3isp_stat_event_status.buf_err 设置为非零。

9.2. 私有 IOCTL

OMAP 3 ISP 驱动程序在可能和实际的情况下支持标准 V4L2 IOCTL 和控件。然而,ISP 提供的大部分功能不属于标准 IOCTL 的范畴,例如伽玛表和统计信息收集的配置。

一般来说,有一个私有 ioctl 用于配置每个包含硬件相关功能的块。

支持以下私有 IOCTL

  • VIDIOC_OMAP3ISP_CCDC_CFG

  • VIDIOC_OMAP3ISP_PRV_CFG

  • VIDIOC_OMAP3ISP_AEWB_CFG

  • VIDIOC_OMAP3ISP_HIST_CFG

  • VIDIOC_OMAP3ISP_AF_CFG

  • VIDIOC_OMAP3ISP_STAT_REQ

  • VIDIOC_OMAP3ISP_STAT_EN

这些 ioctl 使用的参数结构在 include/linux/omap3isp.h 中描述。与给定 ISP 块相关的 ISP 本身的详细功能在技术参考手册 (TRM) 中描述,请参阅文档末尾。

虽然可以在不使用任何这些私有 IOCTL 的情况下使用 ISP 驱动程序,但无法以这种方式获得最佳图像质量。如果不使用适当的私有 IOCTL 配置 AEWB、AF 和直方图模块,则无法使用它们。

9.3. CCDC 和预览块 IOCTL

VIDIOC_OMAP3ISP_CCDC_CFG 和 VIDIOC_OMAP3ISP_PRV_CFG IOCTL 用于分别配置、启用和禁用 CCDC 和预览块中的功能。这两个 IOCTL 都控制它们控制的块中的多个功能。VIDIOC_OMAP3ISP_CCDC_CFG IOCTL 接受指向 struct omap3isp_ccdc_update_config 的指针作为其参数。类似地,VIDIOC_OMAP3ISP_PRV_CFG 接受指向 struct omap3isp_prev_update_config 的指针。两种结构的定义都可以在 [1] 中找到。

结构中的 update 字段指示是否更新特定功能的配置,flag 指示是否启用或禁用该功能。

update 和 flag 位掩码接受以下值。CCDC 和预览块中的每个单独功能都与一个标志(禁用或启用;结构中 flag 字段的一部分)和一个指向该功能配置数据的指针相关联。

此处列出了 VIDIOC_OMAP3ISP_CCDC_CFG 的 update 和 flag 字段的有效值。可以或运算这些值以在同一 IOCTL 调用中配置多个功能。

  • OMAP3ISP_CCDC_ALAW

  • OMAP3ISP_CCDC_LPF

  • OMAP3ISP_CCDC_BLCLAMP

  • OMAP3ISP_CCDC_BCOMP

  • OMAP3ISP_CCDC_FPC

  • OMAP3ISP_CCDC_CULL

  • OMAP3ISP_CCDC_CONFIG_LSC

  • OMAP3ISP_CCDC_TBL_LSC

VIDIOC_OMAP3ISP_PRV_CFG 的相应值在此处

  • OMAP3ISP_PREV_LUMAENH

  • OMAP3ISP_PREV_INVALAW

  • OMAP3ISP_PREV_HRZ_MED

  • OMAP3ISP_PREV_CFA

  • OMAP3ISP_PREV_CHROMA_SUPP

  • OMAP3ISP_PREV_WB

  • OMAP3ISP_PREV_BLKADJ

  • OMAP3ISP_PREV_RGB2RGB

  • OMAP3ISP_PREV_COLOR_CONV

  • OMAP3ISP_PREV_YC_LIMIT

  • OMAP3ISP_PREV_DEFECT_COR

  • OMAP3ISP_PREV_GAMMABYPASS

  • OMAP3ISP_PREV_DRK_FRM_CAPTURE

  • OMAP3ISP_PREV_DRK_FRM_SUBTRACT

  • OMAP3ISP_PREV_LENS_SHADING

  • OMAP3ISP_PREV_NF

  • OMAP3ISP_PREV_GAMMA

启用该功能时,该功能的关联配置指针可能不是 NULL。禁用该功能时,将忽略配置指针。

9.4. 统计信息块 IOCTL

与其他子设备相比,统计信息子设备提供更多动态配置选项。可以在流水线处于流式传输状态时启用、禁用和重新配置它们。

统计信息块始终从 CCDC 获取输入图像数据(因为直方图内存读取未实现)。用户可以使用私有 IOCTL 从统计信息子设备节点对统计信息进行出队操作。

AEWB、AF 和直方图子设备提供的私有 IOCTL 在很大程度上反映了 ISP 硬件提供的寄存器级别接口。有些方面纯粹与驱动程序实现相关,接下来将讨论这些方面。

9.5. VIDIOC_OMAP3ISP_STAT_EN

此私有 IOCTL 启用/禁用统计信息模块。如果在流式传输之前完成此请求,它将在流水线开始流式传输时立即生效。如果流水线已经在流式传输,它将在 CCDC 变为空闲时立即生效。

9.6. VIDIOC_OMAP3ISP_AEWB_CFG、VIDIOC_OMAP3ISP_HIST_CFG 和 VIDIOC_OMAP3ISP_AF_CFG

这些 IOCTL 用于配置模块。它们要求用户应用程序深入了解硬件。大多数字段解释可以在 OMAP 的 TRM 上找到。以下两个字段是所有上述配置私有 IOCTL 共有的,需要进行解释才能更好地理解,因为它们不是 TRM 的一部分。

omap3isp_[h3a_af/h3a_aewb/hist]_config.buf_size

模块在内部处理它们的缓冲区。模块的数据输出所需的缓冲区大小取决于所请求的配置。尽管驱动程序支持在流式传输时重新配置,但如果模块已启用,则不支持需要比内部已分配的缓冲区大小更大的重新配置。在这种情况下,它将返回 -EBUSY。为了避免这种情况,请禁用/重新配置/启用模块,或者在模块禁用期间的第一次配置期间请求必要的缓冲区大小。

内部缓冲区大小分配会考虑所请求配置的最小缓冲区大小和 buf_size 字段中设置的值。如果 buf_size 字段超出 [最小值,最大值] 缓冲区大小范围,则会将其钳制到该范围内。然后,驱动程序选择最大值。更正后的 buf_size 值将写回用户应用程序。

omap3isp_[h3a_af/h3a_aewb/hist]_config.config_counter

由于配置与请求不同步生效,驱动程序必须提供一种跟踪此信息的方法,以提供更准确的数据。请求配置后,返回到用户空间应用程序的 config_counter 将是一个与该请求关联的唯一值。当用户应用程序收到缓冲区可用性事件或请求新缓冲区时,此 config_counter 用于匹配缓冲区数据和配置。

9.7. VIDIOC_OMAP3ISP_STAT_REQ

将内部缓冲区队列中最旧的可用数据发送到用户空间,并在此后丢弃此类缓冲区。字段 omap3isp_stat_data.frame_number 与视频缓冲区的 field_count 匹配。

9.8. 参考