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 匹配。