UVC裝置驅動之描述符分析

2021-08-04 10:39:32 字數 3425 閱讀 8381

**

1.一般的usb

裝置有裝置描述符、配置描述符、介面描述符、端點描述符四種描述符。特定的

usb裝置還有它自己獨特的描述符。

usb裝置、配置、介面、端點與驅動之間的關係。

乙個裝置可能有多個配置,乙個配置可以擁有多種介面(功能),每個介面(功能)對應一

個usb驅動。

例如:

頻或者**。那麼電視機就是乙個usb裝置。

2.驅動程式中先判斷id_tables

陣列,檢視插入的這個

usb裝置是否可以用當前這個驅動程式來驅動。在

uvc驅動中這個陣列定義為

:static struct usb_device_id myuvc_ids = , 

/* videocontrol inte***ce */

,  /* videostreaming inte***ce */{}

}; 構造一類裝置的巨集: usb_inte***ce_info(cl, sc, pr)

cl: blnte***ceclass value 類

sc: blnte***cesubclass value 子類

pr: blnte***ceprotocol value 所遵循的協議

參考usb規範

uvc 1.5 class specification.pdf

表示有兩個介面,分別為vc和vs

。如果符合陣列中的一項則會呼叫驅動中的

probe

函式。因此載入驅動後插入

usb命令可

dmesg

後發現probe

中的列印資訊列印了

2遍,說明的確執行了2遍

probe

,有兩個介面。

3.插入

usb後用

lsusb

命令可得到裝置資訊。如

id 1e4e:0102 

為裝置id

。用lsusb -h

檢視幫助;用

lsusb -v -d 1e4e

來檢視四個描述符的具體內容

。之後參考

lsusb

命令的原始碼來分析如何獲取這些描述符的具體內容。

-d用於指定廠家

id4.在

probe

函式中定義

struct usb_device *dev=inte***ce_to_usbdev(intf);

來獲得裝置結構體,定義

struct usb_device_descriptor *descriptor=&dev->descriptor;

來獲得裝置描述符結構體。而

inte***ce_to_usbdev(intf)

之所以能直接通過介面來獲得裝置結構體和裝置描述符結構體的資訊是因為

插上裝置後

usb匯流排驅動程式已經讀取裝置描述符資訊並儲存起來了。

5.配置描述符獲得是通過裝置描述符結構體的,

通過for

迴圈來獲取:

struct usb_host_config *hostconfig;

struct usb_config_descriptor *config;

for(i=0;ibnumconfigurations;i++)

//因為

dev中的

config

是乙個陣列,其中

config

陣列某一項的

desc

成員中存放著配置描述符的具體內容。 6.

iad介面聯合體描述符中描述的是

videocontrol inte***ce

介面和videostream inte***ce

介面的個數和序號等介面資訊

。使用方法

: struct usb_inte***ce_assoc_descriptor *assoc_desc;

assoc_desc=hostconfig->intf_assoc[0];//

從配置描述符結構體中取出介面描述符陣列的第一項。列印後發現

assoc_desc->

binte***cecount

=2;說明有

2個介面,驗證了

videocontrol inte***ce

和videostream inte***ce

這兩個介面。

7.至於介面描述符結構體,則可從

probe

函式傳入的引數

intf

中獲得。

乙個介面有多個設定

,用intf->num_altsetting

可以得到數目。

struct usb_inte***ce_descriptor *inte***ce;

for(j=0;jaltsetting[j];j++)

//inte***ce中存放的是具體的介面描述符資訊。列印

inte***ce

中的資訊就可以看見

videocontrol inte***ce

中的所有設定和

videostream inte***ce 

中的所有設定了。

8.以上這些描述符結構體都是uvc

規範所要求的必須新增的。至於每個

ioctl

所呼叫的不同命令則有相對應得其他描述符,在上乙個設定描述符中可得到

:unsigned char *buf;

buf=intf->cur_altsetting->extra;//都放在

buf中。

unsigned long buflen=intf->cur_altsetting->extralen;//長度

unsigned long desc_len;//乙個描述符的長度

int k=0;

while(k

} //注:每個描述符的第乙個資料都是這個描述符的長度。

最後我們能在videocontrol inte***ce

中的自定義描述符中找到

uvc的控制操作以及資料的處理流程等詳細資訊。

9.這些自定義的描述符在

buf中的存放先後位置是固定的第乙個是

head

描述符。

10.端點描述符:

struct usb_endpoint_desc *endpoint;

for(m=0;mbnumendpoints;m++) //

表示獲得

當前介面的第幾個設定的第幾個端點的描述符。

UVC裝置驅動之描述符分析

1.一般的usb 裝置有裝置描述符 配置描述符 介面描述符 端點描述符四種描述符。特定的 usb裝置還有它自己獨特的描述符。2.驅動程式中先判斷id tables 陣列,檢視插入的這個 usb裝置是否可以用當前這個驅動程式來驅動。在 uvc驅動中這個陣列定義為 static struct usb d...

USB裝置驅動6 usb HID 報告描述符

在網上看了許多前輩的文章,就是無法理解報告描述符中的那些數字字元所表達的含義,幾經周折,總算大致了解了。0x05,0x07,usage page keyboard 0x19,0xe0,usage minimum keyboard leftcontrol 0x29,0xe7,usage maximum...

DC裝置描述符表

dc device context 即 裝置描述符表 裝置環境 裝置上下文 這些都是它的名字。是乙個資訊結構體,包含物理輸出裝置及其驅動程式。在windows平台下,所有的的圖形操作都是通過它完成。在mfc中,乙個dc device context 是乙個結構體,它定義了圖形物件的引數設定以及它們的...