攝像頭驅動之設定屬性 學習筆記

2021-07-26 06:33:58 字數 3443 閱讀 1154

1、引言

(1)之前的程式只實現了資料的傳輸,在pc linux環境下智慧型看到攝像 頭捕抓的資料,不能調節亮度等屬性。

解除安裝自己寫的驅動程式,安裝系統自帶的驅動,執行xawtv,可以檢視可以調節的屬性

2、設定屬性

(1)應用程式xawtv部分分析

xawtv.c:

grabber_scan

ng_vid_open

//對ng_vid_drivers鍊錶的每乙個成員都取出來,呼叫其open函式

v4l2_driver.open

//v4l2_driver結構體的 v4l2_open函式

get_device_capabilities(h);

// 呼叫vidioc_queryctrl ioctl確定是否支援某個屬性

/* controls */對於0~max_ctrl,先設定ctrl的id,呼叫ioctl看看驅動程式是否支援對應id的屬性,如果支援就把此屬性記錄下來,如果不支援吧id改為-1,

for (i = 0; i < max_ctrl; i++)

怎麼去獲得/設定屬性?

看drv0-v4l2.c

可見這2個函式:

v4l2_read_attr  : vidioc_g_ctrl

v4l2_write_attr : vidioc_s_ctrl

vidioc_queryctrl

//查詢是否支援此屬性

vidioc_g_ctrl

//獲得屬性

vidioc_s_ctrl

//設定屬性

(2)底層驅動分析

/* 查詢/獲得/設定屬性 */

.vidioc_queryctrl     = myuvc_vidioc_queryctrl,

.vidioc_g_ctrl        = myuvc_vidioc_g_ctrl,

.vidioc_s_ctrl        = myuvc_vidioc_s_ctrl,}

usb攝像頭的內部結構回顧

在uvc規範中(uvc1.5 class specification.pdf),找到processing uint descriptor,裡面的bmcontrols的每一位對應一種屬性

2. 硬體上怎麼設定屬性?

2.1

uvc規範

裡定義了哪些屬性(參考上面內容)

: uvc_ctrl.c裡陣列: static struct uvc_control_info uvc_ctrls

//每一項對應乙個屬性

,2.2 我們的裝置支援哪些屬性

這需要去看描述符, 比如 processing unit descriptor的bmcontrols的值為7f 14

可知bit0為1,表示支援brightness

在**裡:

uvc_drvier.c

uvc_ctrl_init_device    

// 對於每乙個entity(it,pu,su,ot等)

list_for_each_entry(entity, &dev->entities, list)

// 把uvc_control和uvc_control_info(陣列)掛構

uvc_ctrl_add_ctrl(dev, info);

ctrl->info = 某個uvc_control_info

陣列項(同屬於乙個entity, index相同)

2.3 怎麼去操作這些屬性

參考 uvc_query_v4l2_ctrl

uvc_find_control

,更加細緻

地描述屬性,和uvc_control_info基本一一對應。

uvc_query_ctrl

usb_control_msg(發起usb控制傳輸)

舉例說明: 要設定亮度,怎麼操作?

a. 根據pu的描述符的bmcontrols, 從它的bit0等於1知道它支援調節亮度

b. 在uvc_ctrls陣列中根據entity和index找到這一項:

,知道了:這個裝置支援set_cur, get_cur, get_min等

要設定時,可以向pu的selector發資料, 發的資料是2位元組

從而知道了更加細緻的資訊,

然後使用usb_control_msg讀寫資料

3. 怎麼寫**?

實現3個ioctl: vidioc_queryctrl/vidioc_g_ctrl/vidioc_s_ctrl

vidioc_queryctrl : 發起usb控制傳輸獲得亮度的最小值、最大值、預設值、步進值

vidioc_g_ctrl    : 發起usb傳輸獲得當前亮度值

要點:資料發給誰?發給usb_device的

videocontrol inte***ce

裡面的processing unit 

裡面的pu_brightness_control

3、函式實現

(1)查詢支援屬性

/* 參考:uvc_query_v4l2_ctrl */    

int myuvc_vidioc_queryctrl (struct file *file, void *fh,

struct v4l2_queryctrl *ctrl)

(2)獲得屬性

/* 參考 : uvc_ctrl_get */

int myuvc_vidioc_g_ctrl (struct file *file, void *fh,

struct v4l2_control *ctrl)

(3)設定屬性(把應用程式傳進來的值轉換成16位資料)

/* 參考: uvc_ctrl_set/uvc_ctrl_commit */

int myuvc_vidioc_s_ctrl (struct file *file, void *fh,

struct v4l2_control *ctrl)

USB攝像頭驅動之設定屬性

對於攝像頭的屬性有亮度,度等等 那怎麼去獲得 設定這些屬性呢,在應用層使用ioctl命令 vidioc queryctrl,vidioc g ctrl vidioc s ctrl來查詢,獲取,設定當前攝像頭的屬性,所以在底層驅動中中我們必須來實現這些函式的定義,該函式原型如下 我們之前說過usb攝像...

DirectShow驅動攝像頭

對於小攝像頭的驅動有幾種方法,通過使用directshow來驅動攝像頭靈活性比較好,有簡單的方法也有比較複雜但更有效的方法,本文只介紹簡單方法,希望與大家交流!用directshow來使用攝像頭,一般要求攝像頭的驅動是wdm格式的,當然,一些比較老的驅動格式directshow也可支援。direct...

andriod之攝像頭驅動流程

camera成像原理 景物通過鏡頭生產光學影象投射到sensor表面上,然後轉為模擬電訊號,經過數模變成數字影象訊號,在經過dsp加工出來,然後在通過io介面傳輸到cpu處理。由於攝像頭滿足匯流排 驅動 裝置模型,那麼看看andorid是怎麼去實現攝像頭的流程。1.註冊camera的platform...