v4l2驅動文件之 controls

2021-06-20 00:08:11 字數 2491 閱讀 5153

v4l2的控制介面試圖使事情盡可能地簡單,同時還能完全發揮硬體的功能。它開始於定義乙個標準控制名字 的集合,包括 v4l2_cid_brightness,v4l2_cid_contrast,v4l2_cid_saturation,還有許多其他的。對於白平衡、 水平,垂直映象等特性,還提供了一些布林型的控制。定義的控制id值的完整列表請見the v4l2 api spec 。還有乙個驅動程式特定的控制,但這些,顯然,一般只能由專用的應用程式使用。私有的控制從v4l2_cid_private_base開始往後都是。

1、列舉可控制操作

一種典型的做法,v4l2 api提供一種機制可以讓應用可以列舉可用的控制操作。為此,他們要發出最終要實現為驅動中的vidioc_queryctrl()方法的ioctl()呼叫。

int (*vidioc_queryctrl)(struct file *file, void *private_data, struct v4l2_queryctrl *qc);

驅動通常會用所關心的控制資訊來添充qc結構體,或是當控制操作不支援時返回einval,這個結構體有很多個字段:

struct v4l2_queryctrl

;被查詢的控制操作將會通過id傳送。作為乙個特殊的情況,應用可以通過設定 v4l2_ctrl_flag_next_ctrl位的方式傳遞控制id。當這種情況發生時,驅動會返回關於下乙個所支援的控制id的資訊,這比應用給出 的id要高。無論在何種情況下,id都應設為實際上被描述的控制操作的id。

其他所有欄位都由驅動設定,用來描述所選的控制操作。控制的資料型別在type欄位中給定。這可以是 v4l2_ctrl_type_integer、 v4l2_ctrl_type_boolean、v4l2_ctrl_type_menu (針對一組固定的擇項) 或v4l2_ctrl_type_button (針對一些設定時會忽略任何給出的值的控制操作)。

name欄位用來描述控制操作;它可以在展現給使用者的應用介面中使用。 對於整型的控制來說(僅針對這種控制),minimum和maximum 描述的是控制所實現的值的範圍,step 給出的是此範圍下的粒度大小。

default_value顧名思義就是預設值 – 僅管他只對整型,布林型和選單控制適用。驅動只應在初始化時將控制引數設為預設。至於其它裝置引數,他們應該從open()到close()保持不變。結 果,default_value 很可能不是現在的控制引數值。

不可避免地,還有一組值進一步描述控制操作(flags)。v4l2_ctrl_flag_disabled 意為控制操作不可用,應用應該忽略它。v4l2_ctrl_flag_grabbed 意為控制暫進不可變,可能會是因為另乙個應用正在使用它。v4l2_ctrl_flag_read_only 意為可以檢視,但不可以改變的控制操作。v4l2_ctrl_flag_update意為調整這個引數可以會對其他控制操作造成影響。 v4l2_ctrl_flag_inactive 意為與當前裝置配置無關的控制操作。v4l2_ctrl_flag_slider 意在暗示應用在表現這個操作的時候可以使用類似於滾動條的介面。

應用可以只是查詢幾個特別程式設計過的控制操作,或者他們也想列舉整個集合。對後而來講,他們會從開始 v4l2_cid_base 至v4l2_cid_lastp1結束,過程中可能會用到v4l2_ctrl_flag_next_ctrl標籤.

int (*vidioc_querymenu)(struct file *file, void *private_data,  struct v4l2_querymenu *qm);

v4l2_querymenu 結構體如下:

struct v4l2_querymenu

;在輸入中,id 是相關的選單控制操作的id值,index 某特定選單id值的索引值.索引值從0開始,依次遞增到vidioc_queryctrl()返回的最大值。驅動會填充選單項的name欄位。reserved欄位恆設為0.

3、設定控制操作

一旦應用知道了可用的控制操作,它就很可以開始查詢並改變其值。這種情況下相關的結構體是:

struct v4l2_control

;要查詢某一給定控制操作,應用應將id欄位設為對應的控制的id,並發出乙個呼叫,這個調最終實現為:

int (*vidioc_g_ctrl)(struct file *file, void *private_data, struct v4l2_control *ctrl);

驅動應將值設為當前控制的設定,還要保證它知道這個特定的控制操作並在應用試圖查詢不存在的控制操作時返回einval,試圖訪問按鍵控制時也應返回einval.

乙個試圖改變控制操作的請求實現為:

int (*vidioc_s_ctrl)(struct file *file, void *private_data, struct v4l2_control *ctrl);

驅動應該驗證id,保證其值在允許的區間。如果一切都沒有問題的話,就將新值寫入硬體。

最後, 值得注意的是,還有乙個單獨的擴充套件控制介面 也為v4l2所支援。這個api是一組相當複雜的控制操作。實際上,它的主要應用就是 mpeg編譯碼的引數。擴充套件控制可以分門歸類, 而且支援64位整型值。其介面與常規的控制介面類似。詳見api規範。

v4l2驅動文件之 streaming IO

v4l2驅動編寫篇第六b 流輸入輸出 使用read 和write 方法,每一幀都要通過i o操作在使用者和核心空間之間拷貝資料。然而,當使用流輸入輸出的方式時,這種情況就不會發生。替代的方案是使用者與核心空間之間交換緩衝區的指標,這些緩衝區將被對映到應用的位址空間,這也就使零幀複製數成為可能。有兩種...

九 v4l2驅動文件之 streaming IO

分類 v4l2 2013 03 30 21 29 681人閱讀收藏 舉報現在,我們將要探索一下支援流輸入輸出的眾多而邋遢的細節。任何video4linux2驅動的作者都要了解這部分api。然而值得指出的是,有乙個更高層次的api,它能夠幫助驅動作者寫流驅動。當底層裝置可以支援分散 聚集i o的時候,...

十 v4l2驅動文件之 controls

分類 v4l2 2013 03 30 21 35 492人閱讀收藏 舉報v4l2的控制介面試圖使事情盡可能地簡單,同時還能完全發揮硬體的功能。它開始於定義乙個標準控制名字 的集合,包括 v4l2 cid brightness,v4l2 cid contrast,v4l2 cid saturation...