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. 參考