Linux的V4L2架構分析

V4L2全名爲Video For Linux 2,它是針對Linux系統的視頻設備處理架構。視頻設備主要包括輸入設備(攝像頭)及輸出設備(顯示設備)。html

1、 Linux的V4L2架構介紹linux

V4L2的初衷是想爲linux系統創建統一的視頻類設備處理模型,讓驅動開發者依靠其驅動模型輕鬆的完成video設備的驅動,讓視頻應用程序能夠輕鬆的使用其接口完成應用程序開發。V4L2的總體架構以下圖所示:編程

Linux的V4L2架構分析

Ø  video設備緩存

視頻設備按輸入輸出來看,輸入設備常見的就是攝像頭了,輸出設備常見的就是顯示器、電視機。數據結構

Ø  video設備接口架構

l  攝像頭接口通常有:框架

ITU-R BT601/656:國際電信聯盟針對數字電視演播室的視頻接口及數據流格式所作的標準,比較老一點的手機攝像頭通常都採用這種接口。ide

MIPI CSI:移動行業處理器接口聯盟定義的攝像頭數字串行接口,是當今主流的手機攝像頭接口。函數

USB:USB攝像頭通常常見在臺式機上,USB協議中有專門針對video設備的接口類(interfaceclass=0x0E)。優化

l  視頻顯示接口通常有:

HDMI:高清晰度多媒體接口,可同時傳輸音頻及視頻信號,普遍用於數字機頂盒、我的電腦、平板電腦、高清數字電視當中。

VGA:它是一種模擬信號視頻接口,普遍用於PC電腦與顯示器中,幾乎全部顯卡都支持該接口。數字電路中使用該類接口須要用到數模視頻編碼器,將視頻的數字信號轉化爲模擬信號進行傳輸。

TV-out:TV-out只是一個泛指,指電視中常見的視頻模擬接口,如AV接口,S端子,YPbPr接口等。同VGA同樣,數字電路中使用該類接口須要用到TV視頻編碼器,將視頻的數字信號轉化爲TV模擬信號進行傳輸。

Ø  video設備接口驅動

該部分須要驅動開發者針對不一樣的視頻設備接口,完成其接口驅動。

Ø  video設備驅動

該部分是驅動開發者在進行視頻設備驅動開發時,須要重點實現的對象。驅動開發者須要根據V4L2提供的驅動模型,完成對具體視頻設備硬件控制的底層實現。Linux爲開發者提供了V4L2驅動開發的示例源碼:「/drivers/media/video/vivi.c」。

Ø  V4L2核心

該部分是Linux視頻設備的架構核心,它對下爲驅動開發者提供統一的視頻設備驅動開發模型,對上爲應用開發者提供操做視頻設備的統一接口。其在linux中的核心源碼路徑爲:「/drivers/media/video/v4l2-dev.c」。

Ø  V4L2應用接口

應用程序經過V4L2提供read()、write()、ioctl()編程接口,來控制操做視頻設備,如:設置圖像分辨率、視頻數據格式、開始/結束視頻捕獲等等。

2、 V4L2設備驅動編寫

Linux的video設備驅動實現,驅動開發者須要按照V4L2的驅動模型進行設計,該驅動模型主要圍繞核心數據結構struct video_device來展開設計,經過該數據結構來完成視頻設備的分配、設置、註冊等工做。驅動程序須要重點實現兩個操做集:v4l2_file_operations和v4l2_ioctl_ops,V4L2架構最終會調用這兩個操做集中的函數接口,來完成對視頻設備硬件的控制。其實現流程以下圖所示:

Linux的V4L2架構分析
 

3、 V4L2_subdev與v4l2_device的出現

V4L2 驅動隨着硬件的變化也愈來愈複雜,如今大部分設備裏面包含了多個子設備IC,比較常見的子設備如編解碼的裝置、傳感器、攝像頭控制器等。一般這些IC經過 i2c 總線鏈接到主板,這些設備都統稱爲sub-devices。

在很長的一段時間裏 V4L2 被限制只能在 video_device 結構體裏面建立,而且用video_buf控制視頻緩存,這意味着全部的驅動建立本身的實例都將鏈接到本身的sub-devices,這些工做一般很複雜並常常引發錯誤,許多常見的代碼由於缺少一個框架而沒法重構。所以 V4L2  框架做了相應的優化:它有一個 v4l2_device 結構做爲設備實例,一個v4l2_subdev結構做爲子設備實例,video_device 結構包含了v4l2_device 節點,每一個視頻設備都採用 v4l2_device 結構來表示。爲了提供統一的接口給這些子設備,內核將涉及到子設備控制的那部分獨立了出來,用 struct v4l2_subdev 來表示以方便用戶實現 v4l2 驅動程序。現現在的V4L2設備關係用一個比較粗糙的圖來表示他們之間的關係,大體爲:

設備實例(v4l2_device)

           |______子設備實例(v4l2_subdev)

           |______視頻設備節點(video_device)

           |______文件訪問控制(v4l2_fh)

           |______視頻緩衝的處理(videobuf/videobuf2)

相關文章
相關標籤/搜索