天天看點

usb setup請求結構體分析

在USB通訊裡,從主要器發出來的第一個配置包就是裝置描述符配置包,目的隻有一個,就是擷取插入的USB屬性,以便加載合适的驅動程式。現在就來詳細地分析一下裝置描述符包的定義。

在USB2.0的協定裡找到9.3 USB Device Requests裡就找到這個結構的定義,這裡我使用C的定義結構如下:

typedef
 struct _USB_SETUP_PACKET
 
{
 
REQUEST_TYPE bmRequestType;
 
BYTE         bRequest;
 
WORD_BYTE    wValue;
 
WORD_BYTE    wIndex;
 
WORD         wLength;
 
} USB_SETUP_PACKET;      

bmRequestType是包含有下面幾方面的内容:

D7 D6 D5 D4 D3 D2 D1 D0

在這一個位元組裡,又按位分為:

D7位是表示後面傳送資料的方向位。

當D7等于0時,表示

後面的資料

從主要器發送到USB裝置

。在PC裡,就是從PC機發送到USB的裝置。

當D7等于1時,表示

後面的資料

是從

USB裝置發送到主要器

。在PC裡,就是從USB裝置發送到USB裝置。在上次裡,我收到并顯示出來的資料是80,就表示從USB裝置裡發送資料給PC。在這裡再次給出上一次的包資料:

80 06 00 01 00 00 40 00

這裡的80,就是D7位為1。

D6-D5位是請求主分類型

0 是表示标準的請求。

1 是表示類别的請求。

2 是表示廠商的請求。

3 是保留。

D4-D0位是表求接收這個包的接口。

0 是表示USB裝置接收。

1 是表示接口接收。

2 是表示端點接收。

3 是表示其它接收,不知道的。

4-31是保留。

bRequest

是本描述符的請求類型,也就是

後面發送的資料是什麼樣的東西

。由于USB裡有很多配置資訊,比如擷取裝置描述符,又有設定USB位址等等,就是通過這個位元組來區分的。

從USB協定裡查找表9-4,就可看到如下的編碼:

GET_STATUS              0

CLEAR_FEATURE          1

Reserved for future use      2

SET_FEATURE             3

Reserved for future use      4

SET_ADDRESS             5

GET_DESCRIPTOR         6

SET_DESCRIPTOR          7

GET_CONFIGURATION      8

SET_CONFIGURATION      9

GET_INTERFACE           10

SET_INTERFACE            11

SYNCH_FRAME              12

在上面的資料包裡,

看到它的内容是06,那麼它就是GET_DESCRIPTOR類型。也就是主要器想讀取USB裝置的描述符

,到這裡就已經分析出來的意思,

就是主要器想讀取USB描述符

,但還不知道是什麼描述符的内容。

wValue是根據不同的請求而設定不同的值。

一般就是傳送參數給裝置标明這是什麼請求。在上面

GET_DESCRIPTOR擷取裝置描述符裡,

它的值是00 01。在

GET_DESCRIPTOR裡這個字段的

低位元組表示描述符的索引,

高位元組表示描述符的類型。高位元組的類型如下:

DEVICE                  

CONFIGURATION         

STRING                  

INTERFACE               

ENDPOINT                5

DEVICE_QUALIFIER         6

OTHER_SPEED_CONFIGURATION             7

INTERFACE_POWER

1                  

8

wValue值在這裡的高位元組是01,那麼它就是裝置描述符了

低位元組是00,那麼它就是表示從偏移位址0開始讀取裝置描述符

由于在配置描述符裡有很多配置,是以低位元組在那裡就可以用來識别擷取同樣類型的描述符不同的配置。