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. 参考文献