您的位置:首頁>正文

八個問答帶你瞭解USB(下)

問題五:標識碼有哪些?

答案五:如同前面所說的標識碼由四位元資料組成, 因此可以表示十六種標識碼, 在USB1.1規範裡面, 只用了十種標識碼, USB2.0使用了十六種標識碼, 標識碼的作用是用來說明包的屬性的, 標識碼是和包聯繫在一起的, 首先簡單介紹一下資料包的類型, 資料包分為權杖包、資料、握手包和特殊包四種(具體分類請看問題七), 標識碼分別有以下十六種:

權杖包 0x01 輸出(OUT)啟動一個方向為主機到設備的傳輸, 並包含了設備位址和標號

0x09 輸入 (IN) 啟動一個方向為設備到主機的傳輸, 並包含了設備位址和標號

0x05 幀起始(SOF)表示一個幀的開始, 並且包含了相應的幀號

0x0d 設置(SETUP)啟動一個控制傳輸, 用於主機對設備的初始化

資料包 0x03 偶數據包(DATA0),

0x0b 奇數據包(DATA1)

握手包 0x02 確認接收到無誤的資料包(ACK)

0x0a 無效, 接收(發送)端正在忙而無法接收(發送)資訊

0x0e 錯誤, 端點被禁止或不支持控制管道請求

特殊包 0xoc 前導, 用於啟動下行埠的低速設備的資料傳輸

問題六:USB主機是如何識別USB設備的?

答案六:當USB設備插上主機時, 主機就通過一系列的動作來對設備進行枚舉配置(這裡用枚舉, 我總覺得有點怪怪的, 但很多書上都是這樣說, 另外配置是屬於枚舉的一個態, 態表示暫時的狀態), 這這些態如下:

1、接入態(Attached):設備接入主機後, 主機通過檢測信號線上的電平變化來發現設備的接入;

2、供電態(Powered):就是給設備供電, 分為設備接入時的預設供電值, 配置階段後的供電值(按資料中要求的最大值, 可通過程式設計設置)

3、缺省態(Default):USB在被配置之前, 通過缺省位址0與主機進行通信;

4、地址態(Address):經過了配置, USB設備被重定後, 就可以按主機分配給它的唯一位址來與主機通信, 這種狀態就是位址態;

5、配置態(Configured):通過各種標準的USB請求命令來獲取設備的各種資訊, 並對設備的某此資訊進行改變或設置。

6、掛起態(Suspended):匯流排供電設備在3ms內沒有匯流排操作, 即USB匯流排處於空閒狀態的話, 該設備就要自動進入掛起狀態, 在進入掛起狀態後, 總的電流功耗不超過280UA。

問題七:剛才在答案四提到的標準的USB設備請求命令究竟是什麼?

答案七:標準的USB設備請求命令是用在控制傳輸中的“初始設置步驟”裡的資料包階段(即DATA0,

由八個位元組構成), 請看回問答四的內容。 標準USB設備請求命令共有11個, 大小都是8個位元組, 具有相同的結構, 由5個欄位構成(注這裡的欄位和域的本質都是一樣的, 都是由二進位串構成的, 這是為了將命令和包區分開來), 結構如下(括弧中的數位表示位元組數, 首字母bm,b,w分別表示點陣圖、位元組, 雙位元組):

bmRequestType(1)+bRequest(1)+wValue(2)+wIndex(2)+wLength(2)

各欄位的意義如下:

1、bmRequestType:D7D6D5D4D3D2D1D0

D7=0主機到設備

=1設備到主機;

D6D5=00標準請求命令

=01 類請求命令

=10用戶定義的命令

=11保留值

D4D3D2D1D0=00000 接收者為設備

=00001 接收者為設備

=00010 接收者為端點

=00011 接收者為其他接收者

=其他 其他值保留

2、bRequest:請求命令代碼, 在標準的USB命令中, 每一個命令都定義了編號,

編號的值就為欄位的值, 編號與命令名稱如下(要注意這裡的命令代碼要與其他欄位結合使用, 可以說命令代碼是標準請求命令代碼的核心, 正是因為這些命令代碼而決定了11個USB標準請求命令):

0) 0 GET_STATUS:用來返回特定接收者的狀態

1) 1 CLEAR_FEATURE:用來清除或禁止接收者的某些特性

2) 3 SET_FEATURE:用來啟用或啟動命令接收者的某些特性

3) 5 SET_ADDRESS:用來給設備分配位址

4) 6 GET_DESCRIPTOR:用於主機獲取設備的特定描述符

5) 7 SET_DESCRIPTOR:修改設備中有關的描述符, 或者增加新的描述符

6) 8 GET_CONFIGURATION:用於主機獲取設備當前設備的配置值(注同上面的不同)

7) 9 SET_CONFIGURATION:用於主機指示設備採用的要求的配置

8) 10 GET_INTERFACE:用於獲取當前某個介面描述符編號

9) 11 SET_INTERFACE:用於主機要求設備用某個描述符來描述介面

10) 12 SYNCH_FRAME:用於設備設置和報告一個端點的同步幀

以上的11個命令要說得明白真的有一匹布那麼長, 請各位去看書吧, 這裡就不多說了, 控制傳輸是USB的重心, 而這11個命令是控制傳輸的重心, 所以這11個命令是重中之重, 這個搞明白了, USB就算是入門了。

問題八:在標準的USB請求命令中, 經常會看到Descriptor, 這是什麼來的呢?

回答八:Descriptor即描述符, 是一個完整的資料結構, 可以通過C語言等程式設計實現, 並存儲在USB設備中, 用於描述一個USB設備的所有屬性, USB主機是通過一系列命令來要求設備發送這些資訊的。 它的作用就是通過如問答節中的命令操作來給主機傳遞資訊, 從而讓主機知道設備具有什麼功能、屬於哪一類設備、要佔用多少頻寬、使用哪類傳輸方式及資料量的大小, 只有主機確定了這些資訊之後,設備才能真正開始工作,所以描述符也是十分重要的部分,要好好掌握。標準的描述符有5種,USB為這些描述符定義了編號:

1——設備描述符

2——配置描述符

3——字元描述符

4——介面描述符

5——端點描述符

上面的描述符之間有一定的關係,一個設備只有一個設備描述符,而一個設備描述符可以包含多個配置描述符,而一個配置描述符可以包含多個介面描述符,一個介面使用了幾個端點,就有幾個端點描述符。這間描述符是用一定的欄位構成的,分別如下說明:

1、設備描述符

struct _DEVICE_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

WORD bcdUSB; //USB版本號

BYTE bDeviceClass; //USB分配的設備類代碼,0x01~0xfe為標準設備類,0xff為廠商自訂類型

//0x00不是在設備描述符中定義的,如HID

BYTE bDeviceSubClass; //usb分配的子類代碼,同上,值由USB規定和分配的

BYTE bDeviceProtocl; //USB分配的設備協定代碼,同上

BYTE bMaxPacketSize0; //端點0的最大包的大小

WORD idVendor; //廠商編號

WORD idProduct; //產品編號

WORD bcdDevice; //設備出廠編號

BYTE iManufacturer; //描述廠商字串的索引

BYTE iProduct; //描述產品字串的索引

BYTE iSerialNumber; //描述設備序號字串的索引

BYTE bNumConfiguration; //可能的配置數量

}

2、配置描述符

struct _CONFIGURATION_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

WORD wTotalLength; //配置所返回的所有數量的大小

BYTE bNumInterface; //此配置所支援的介面數量

BYTE bConfigurationVale; //Set_Configuration命令需要的參數值

BYTE iConfiguration; //描述該配置的字串的索引值

BYTE bmAttribute; //供電模式的選擇

BYTE MaxPower; //設備從匯流排提取的最大電流

}

3、字元描述符

struct _STRING_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

BYTE SomeDescriptor[36]; //UNICODE編碼的字串

}

4、介面描述符

struct _INTERFACE_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

BYTE bInterfaceNunber; //介面的編號

BYTE bAlternateSetting;//備用的介面描述符編號

BYTE bNumEndpoints; //該介面使用端點數,不包括端點0

BYTE bInterfaceClass; //介面類別型

BYTE bInterfaceSubClass;//介面子類型

BYTE bInterfaceProtocol;//介面所遵循的協定

BYTE iInterface; //描述該介面的字串索引值

}

5、端點描述符

struct _ENDPOIN_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

BYTE bEndpointAddress; //端點位址及輸入輸出屬性

BYTE bmAttribute; //端點的傳輸類型屬性

WORD wMaxPacketSize; //端點收、發的最大包的大小

BYTE bInterval; //主機查詢端點的時間間隔

}

只有主機確定了這些資訊之後,設備才能真正開始工作,所以描述符也是十分重要的部分,要好好掌握。標準的描述符有5種,USB為這些描述符定義了編號:

1——設備描述符

2——配置描述符

3——字元描述符

4——介面描述符

5——端點描述符

上面的描述符之間有一定的關係,一個設備只有一個設備描述符,而一個設備描述符可以包含多個配置描述符,而一個配置描述符可以包含多個介面描述符,一個介面使用了幾個端點,就有幾個端點描述符。這間描述符是用一定的欄位構成的,分別如下說明:

1、設備描述符

struct _DEVICE_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

WORD bcdUSB; //USB版本號

BYTE bDeviceClass; //USB分配的設備類代碼,0x01~0xfe為標準設備類,0xff為廠商自訂類型

//0x00不是在設備描述符中定義的,如HID

BYTE bDeviceSubClass; //usb分配的子類代碼,同上,值由USB規定和分配的

BYTE bDeviceProtocl; //USB分配的設備協定代碼,同上

BYTE bMaxPacketSize0; //端點0的最大包的大小

WORD idVendor; //廠商編號

WORD idProduct; //產品編號

WORD bcdDevice; //設備出廠編號

BYTE iManufacturer; //描述廠商字串的索引

BYTE iProduct; //描述產品字串的索引

BYTE iSerialNumber; //描述設備序號字串的索引

BYTE bNumConfiguration; //可能的配置數量

}

2、配置描述符

struct _CONFIGURATION_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

WORD wTotalLength; //配置所返回的所有數量的大小

BYTE bNumInterface; //此配置所支援的介面數量

BYTE bConfigurationVale; //Set_Configuration命令需要的參數值

BYTE iConfiguration; //描述該配置的字串的索引值

BYTE bmAttribute; //供電模式的選擇

BYTE MaxPower; //設備從匯流排提取的最大電流

}

3、字元描述符

struct _STRING_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

BYTE SomeDescriptor[36]; //UNICODE編碼的字串

}

4、介面描述符

struct _INTERFACE_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

BYTE bInterfaceNunber; //介面的編號

BYTE bAlternateSetting;//備用的介面描述符編號

BYTE bNumEndpoints; //該介面使用端點數,不包括端點0

BYTE bInterfaceClass; //介面類別型

BYTE bInterfaceSubClass;//介面子類型

BYTE bInterfaceProtocol;//介面所遵循的協定

BYTE iInterface; //描述該介面的字串索引值

}

5、端點描述符

struct _ENDPOIN_DESCRIPTOR_STRUCT

{

BYTE bLength; //設備描述符的位元組數大小,為0x12

BYTE bDescriptorType; //描述符類型編號,為0x01

BYTE bEndpointAddress; //端點位址及輸入輸出屬性

BYTE bmAttribute; //端點的傳輸類型屬性

WORD wMaxPacketSize; //端點收、發的最大包的大小

BYTE bInterval; //主機查詢端點的時間間隔

}

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示