1、概述.
Video4Linux2是Linux內核中關於視頻設備的內核驅動框架,爲上層的訪問底層的視頻設備提供了統一的接口。
凡是內核中的子系統都有抽象底層硬件的差異,爲上層提供統一的接口和提取出公共代碼避免代碼冗餘等好處。
就像公司的老闆一般都不會直接找底層的員工談話,而是找部門經理了解情況,一個是因爲底層屌絲人數多,意見各有不同,措辭也不準,部門經理會把情況彙總後再向上彙報;二個是老闆時間寶貴。
V4L2支持三類設備:視頻輸入輸出設備、VBI 設備和radio設備(其實還支持更多類型的設備,暫不討論),分別會在 /dev目錄下產生 videoX、radioX和vbiX設備節點。
我們常見的視頻輸入設備主要是攝像頭,也是本文主要分析對象。下圖V4L2在Linux系統中的結構圖:
Linux系統中視頻輸入設備主要包括以下四個部分:
字符設備驅動程序核心: V4L2本身就是一個字符設備,具有字符設備所有的特性,暴露接口給用戶空間;
V4L2驅動核心: 主要是構建一個內核中標準視頻設備驅動的框架,爲視頻操作提供統一的接口函數;
平臺V4L2設備驅動: 在V4L2框架下,根據平臺自身的特性實現與平臺相關的V4L2驅動部分,包括註冊video_device和v4l2_dev 。
具體的sensor驅動: 主要 上電、提供工作時鐘、視頻圖像裁剪、流IO開啓等,實現各種設備控制方法供上層調用並 註冊v4l2_subdev 。
V4L2的核心源碼位於drivers/media/v4l2-core,源碼以實現的功能可以劃分爲四類:
核心模塊實現: 由 v4l2-dev.c 實現,主要作用 申請字符主設備號、註冊class和提供video device 註冊 註銷等相關函數;
V4L2框架: 由 v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c 等文件實現,構建V4L2框架;
Videobuf管理: 由 videobuf2-core.c、videobuf2-dma-contig.c、videobuf2-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c
等文件實現,完成videobuffer的分配、管理和註銷。
Ioctl框架: 由 v4l2-ioctl.c 文件實現,構建 V4L2ioctl 的框架。
2、V4L2框架
結構體 v4l2_device、video_device、v4l2_subdev 和 v4l2_fh 是搭建框架的主要元素。下圖是V4L2框架的結構圖:
從上圖V4L2框架是一個標準的樹形結構,v4l2_device 充當了父設備,通過鏈表把所有註冊到其下的子設備管理起來,這些設備可以是GRABBER、VBI或RADIO。
V4l2_subdev 是子設備,v4l2_subdev 結構體 包含了對設備操作的 ops和ctrls,這部分代碼和硬件相關,
需要驅動工程師根據硬件實現,像攝像頭設備需要實現控制上下電、讀取ID、飽和度、對比度和視頻數據流打開關閉的接口函數。
Video_device 用於創建子設備節點,把操作設備的接口暴露給用戶空間。 V4l2_fh 是每個子設備的文件句柄,在打開設備節點文件時設置,
方便上層索引到 v4l2_ctrl_handler,v4l2_ctrl_handler 管理設備的 ctrls,這些ctrls (攝像頭設備)包括調節飽和度、對比度和白平衡等。
V4L2框架分析學習一 http://www.techbulo.com/1193.html