6. i.MX 影片捕獲驅動¶
6.1. 事件¶
6.1.1. ipuX_csiY¶
當啟用第二個 IDMAC 源埠時,此子裝置可以生成以下事件
V4L2_EVENT_IMX_FRAME_INTERVAL_ERROR
使用者應用程式可以從 ipuX_csiY 子裝置節點訂閱此事件。此事件由幀間隔監視器生成(有關 FIM 的更多資訊,請參見下文)。
6.2. 控制¶
6.2.1. ipuX_csiY 中的幀間隔監視器¶
adv718x 解碼器在 NTSC/PAL 訊號重同步期間可能會偶爾傳送損壞的場(影片行過少或過多)。發生這種情況時,IPU 會觸發一種機制,透過每幀新增 1 條虛擬行來重新建立垂直同步,這會導致影像之間出現滾動效果,並且可能需要很長時間才能恢復穩定影像。或者有時該機制根本不起作用,導致永久性分屏影像(一幀包含來自兩個連續捕獲影像的行)。
透過實驗發現,在影像滾動期間,幀間隔(兩個 EOF 之間的時間)會下降到低於當前標準的名義值,大約一個幀時間(60 微秒),並保持在該值直到滾動停止。
雖然這種現象的原因尚不清楚(IPU 虛擬行機制應該顯示每幀間隔增加 1 行時間,而不是固定值),但我們可以使用幀間隔監視器來檢測損壞的場。如果 FIM 檢測到錯誤的幀間隔,ipuX_csiY 子裝置將傳送事件 V4L2_EVENT_IMX_FRAME_INTERVAL_ERROR。使用者空間可以在 ipuX_csiY 子裝置節點上註冊 FIM 事件通知。當收到此事件時,使用者空間可以發起流重啟以校正滾動/分屏影像。
ipuX_csiY 子裝置包含自定義控制元件,用於調整 FIM 的一些引數。如果在流傳輸期間更改其中一個控制元件,FIM 將被重置並以新設定繼續執行。
V4L2_CID_IMX_FIM_ENABLE
啟用/停用 FIM。
V4L2_CID_IMX_FIM_NUM
在與感測器報告的名義幀間隔進行比較之前,需要對多少幀間隔測量值進行平均。這可以減少中斷延遲引起的噪聲。
V4L2_CID_IMX_FIM_TOLERANCE_MIN
如果平均間隔超出名義值達到此量(以微秒計),則會發送 V4L2_EVENT_IMX_FRAME_INTERVAL_ERROR 事件。
V4L2_CID_IMX_FIM_TOLERANCE_MAX
如果任何間隔高於此值,則這些樣本將被丟棄,不參與平均。這可用於丟棄可能由於高系統負載引起的中斷延遲導致的極高間隔錯誤。
V4L2_CID_IMX_FIM_NUM_SKIP
在 FIM 重置或流重啟後,FIM 開始平均間隔之前要跳過多少幀。
V4L2_CID_IMX_FIM_ICAP_CHANNEL / V4L2_CID_IMX_FIM_ICAP_EDGE
這些控制將配置一個輸入捕獲通道作為測量幀間隔的方法。這優於透過 EOF 中斷測量幀間隔的預設方法,因為它不受中斷延遲引入的不確定性誤差的影響。
輸入捕獲需要硬體支援。VSYNC 訊號必須路由到 i.MX6 輸入捕獲通道引腳之一。
V4L2_CID_IMX_FIM_ICAP_CHANNEL 配置要使用的 i.MX6 輸入捕獲通道。此值必須為 0 或 1。
V4L2_CID_IMX_FIM_ICAP_EDGE 配置哪個訊號邊沿將觸發輸入捕獲事件。預設情況下,輸入捕獲方法被停用,值為 IRQ_TYPE_NONE。將此控制設定為 IRQ_TYPE_EDGE_RISING、IRQ_TYPE_EDGE_FALLING 或 IRQ_TYPE_EDGE_BOTH,以啟用輸入捕獲,並在給定訊號邊沿觸發。
當輸入捕獲被停用時,幀間隔將透過 EOF 中斷測量。
6.2.2. 檔案列表¶
drivers/staging/media/imx/ include/media/imx.h include/linux/imx-media.h