1.一般的usb
裝置有裝置描述符、配置描述符、介面描述符、端點描述符四種描述符。特定的
usb裝置還有它自己獨特的描述符。
2.驅動程式中先判斷id_tables
陣列,檢視插入的這個
usb裝置是否可以用當前這個驅動程式來驅動。在
uvc驅動中這個陣列定義為:
static struct usb_device_id myuvc_ids = , /* videocontrol inte***ce */
, /* videostreaming inte***ce */
表示有兩個介面,分別為vc和vs
。如果符合陣列中的一項則會呼叫驅動中的
probe
函式。因此載入驅動後插入
usb命令可
dmesg
後發現probe
中的列印資訊列印了
2遍,說明的確執行了2遍
probe
,有兩個介面。
3.插入usb
後用lsusb
命令可得到裝置資訊。如
id 1e4e:0102
為裝置id
。用lsusb -h
檢視幫助;用
lsusb -v -d 1e4e
來檢視四個描述符的具體內容。之後參考
lsusb
命令的原始碼來分析如何獲取這些描述符的具體內容。
4.在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++)
hostconfig=&dev->config[i];
config=&hostconfig->desc;
//因為
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=intf->altsetting[j].desc;
//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(kdesc_len=buffer[k];
for(l=0;lprintf(「%02x」,buffer[k+l]);
//注:每個描述符的第乙個資料都是這個描述符的長度。
最後我們能在videocontrol inte***ce
中的自定義描述符中找到
uvc的控制操作以及資料的處理流程等詳細資訊。
9.這些自定義的描述符在
buf中的存放先後位置是固定的第乙個是
head
描述符。
10.端點描述符:
struct usb_endpoint_desc *endpoint;
for(m=0;mbnumendpoints;m++)
//inte***ce由上面所得
endpoint=intf->altsetting[m].endpoint[m].desc;
}//表示獲得當前介面的第幾個設定的第幾個端點的描述符。
UVC裝置驅動之描述符分析
1.一般的usb 裝置有裝置描述符 配置描述符 介面描述符 端點描述符四種描述符。特定的 usb裝置還有它自己獨特的描述符。usb裝置 配置 介面 端點與驅動之間的關係。乙個裝置可能有多個配置,乙個配置可以擁有多種介面 功能 每個介面 功能 對應一 個usb驅動。例如 頻或者 那麼電視機就是乙個us...
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 是乙個結構體,它定義了圖形物件的引數設定以及它們的...