01@ V4L2框架分析學習一

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章