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...