2.1. 引言

由於硬體的複雜性,V4L2驅動程式往往非常複雜:大多數裝置有多個IC,在/dev中匯出多個裝置節點,並且還建立非V4L2裝置,如DVB、ALSA、FB、I2C和輸入(IR)裝置。

特別是V4L2驅動程式必須設定支援IC以進行音訊/影片混合/編碼/解碼,這使得它比大多數驅動程式更復雜。通常,這些IC透過一個或多個I2C匯流排連線到主橋驅動程式,但也可以使用其他匯流排。這些裝置稱為“子裝置”。

長期以來,該框架僅限於video_device結構來建立V4L裝置節點,以及video_buf來處理影片緩衝區(請注意,本文件不討論video_buf框架)。

這意味著所有驅動程式都必須自行設定裝置例項並連線到子裝置。其中一些操作非常複雜,難以正確完成,許多驅動程式從未正確完成。

由於缺乏框架,許多通用程式碼也無法重構。

因此,該框架設定了所有驅動程式都需要的基本構建塊,並且該框架應該更容易將通用程式碼重構為所有驅動程式共享的實用程式函式。

一個很好的參考例子是samples/v4l/中的v4l2-pci-skeleton.c原始碼。它是一個PCI採集卡的框架驅動程式,演示瞭如何使用V4L2驅動程式框架。它可以作為真正的PCI影片採集驅動程式的模板。

2.2. V4L驅動程式的結構

所有驅動程式都具有以下結構

  1. 每個裝置例項的結構,包含裝置狀態。

  2. 初始化和命令子裝置(如果有)的方法。

  3. 建立V4L2裝置節點(/dev/videoX、/dev/vbiX和/dev/radioX)並跟蹤裝置節點特定資料。

  4. 包含每個檔案控制代碼資料的特定於檔案控制代碼的結構;

  5. 影片緩衝區處理。

這是一個大致的示意圖,說明了它們之間的關係

device instances
  |
  +-sub-device instances
  |
  \-V4L2 device nodes
      |
      \-filehandle instances

2.3. V4L2框架的結構

該框架與驅動程式結構非常相似:它具有用於裝置例項資料的v4l2_device結構,用於引用子裝置例項的v4l2_subdev結構,video_device結構儲存V4L2裝置節點資料,而v4l2_fh結構跟蹤檔案控制代碼例項。

V4L2框架還可以選擇與媒體框架整合。 如果驅動程式設定了 struct v4l2_device mdev欄位,子裝置和影片節點將自動出現在媒體框架中作為實體。