USB描述符
枚舉過程
USB設(shè)備枚舉一般會經(jīng)過插入、供電、初始化、分配地址,配置,獲取設(shè)備描述符、獲取配置描述符、獲取字符串和配置設(shè)備這么幾個過程。(第一次獲取設(shè)備描述符就是為了獲取最大包長,在設(shè)備描述符的第8字節(jié)(因此USB規(guī)定端點0的最大包長至少8字節(jié))。在復(fù)位之后,才會真正獲取完整的設(shè)備描述符)
枚舉過程基本上就是分配地址和獲取描述符的過程。那么什么是描述符呢?
?
?
描述符
描述符是USB設(shè)備用來描述自己屬性及用途的,因此設(shè)備端必須實現(xiàn)對應(yīng)的描述符。主機會在枚舉過程中根據(jù)描述符去確定這是一個什么設(shè)備,安裝相應(yīng)的驅(qū)動。
標(biāo)準(zhǔn)的描述符有5種,USB為這些描述符定義了編號:
? ? ? ? 0x01.設(shè)備描述符:USB設(shè)備至少有一個配置描述符,但是主機同一時間只能選擇一種配置。
? ? ? ? 0x02.配置描述符:USB配置至少有一個接口描述符。
? ? ? ? 0x03.接口描述符:USB接口可以至少有一個端點描述符,也可以沒有端點描述符。
? ? ? ? 0x04.端點描述符
? ? ? ? 0x05.字符串描述符
還有一些不太常用的描述符:
? ? ? ? 0x06.限定描述符
? ? ? ? 0x07.其它速率配置描述符
? ? ? ? 0x08.接口功率描述符
? ? ? ? 0x21.HID描述符
? ? ? ? 0x22.報表描述符
?
設(shè)備描述符
- bLength : 描述符大小。固定為0x12.
- bDescriptorType : 描述符類型。固定為0x01.
- bcdUSB : 本設(shè)備能適用于那種協(xié)議,如2.0=0200,1.1=0110等。
- bDeviceClass : 類型代碼。當(dāng)它的值是0時,表示所有接口在配置描述符里,并且所有接口是獨立的。當(dāng)它的值是1到FEH時,表示不同的接口關(guān)聯(lián)的。當(dāng)它的值是FFH時,它是廠商自己定義的。
- bDeviceSubClass : 子類型代碼。如果bDeviceClass值是0,一定要設(shè)置為0。其它情況就跟據(jù)USB-IF組織定義的編碼。
- bDeviceProtocol : 協(xié)議代碼。如果使用USB-IF組織定義的協(xié)議,就需要設(shè)置這里的值,否則直接設(shè)置為0。如果廠商自己定義的可以設(shè)置為FFH。
- bMaxPacketSize0 : 端點0最大包長(只有8,16,32,64有效)。
- idVendor : 供應(yīng)商ID。
- idProduct : 產(chǎn)品ID。由供應(yīng)商ID和產(chǎn)品ID,就可以讓操作系統(tǒng)加載不同的驅(qū)動程序。
- bcdDevice : 設(shè)備出產(chǎn)編碼。由廠家自行設(shè)置。
- iManufacturer : 廠商描述符字符串索引。索引到對應(yīng)的字符串描述符。 為0則表示沒有。
- iProduct : :產(chǎn)品描述符字符串索引。為0則表示沒有。
- iSerialNumber : 設(shè)備序列號字符串索引。為0則表示沒有。
- bNumConfigurations : 配置描述符個數(shù)。
?
配置描述符
- bLength : 描述符大小。固定為0x09。
- bDescriptorType : 描述符類型。固定為0x02。
- wTotalLength : 此配置返回的配置描述符,接口描述符以及端點描述符的全部大小。
- bNumInterfaces : 該配置下接口描述符數(shù)量。
- bConfigurationValue : 作為Set Configuration的一個參數(shù)選擇配置值。
- iConfiguration : 用于描述該配置字符串描述符的索引。
- bmAttributes : 供電模式選擇。Bit4-0保留,D7:總線供電,D6:自供電,D5:遠(yuǎn)程喚醒。
- MaxPower : 總線供電的USB設(shè)備的最大消耗電流。以2mA為單位。
?
接口描述符
- bLength : 描述符大小。固定為0x09。
- bDescriptorType : 描述符類型。固定為0x04。
- bInterfaceNumber: 該接口的編號。
- bAlternateSetting : 用于為上一個字段選擇可供替換的位置。即備用的接口描述符標(biāo)號。
- bNumEndpoint : 使用的端點數(shù)目。端點0除外。
- bInterfaceClass : 類型代碼(由USB分配)。
- bInterfaceSubClass : 子類型代碼(由USB分配)。
- bInterfaceProtocol : 協(xié)議代碼(由USB分配)。
- iInterface :?字符串描述符的索引
?
端點描述符
- bLength : 描述符大小。固定為0x07。
- bDescriptorType : 描述符類型。固定為0x05。
- bEndpointAddress : 端點地址。Bit7,方向,1/0:IN/OUT。Bit6-4,保留。BIt3-0:端點號。
-
bmAttributes : 端點屬性。同步傳輸時,bit3-2:00無同步,01異步,10適配,11同步。同步傳輸時,BIT5:4:00數(shù)據(jù)端點,01反饋端點,10隱式反饋數(shù)據(jù)端點,11保留。Bit1-0:00控制,01同步,02批量,03中斷。
-
wMaxPacketSize : 支持的最大數(shù)據(jù)包大小。
- bInterval : 輪訓(xùn)數(shù)據(jù)傳送端點的時間間隔。對于批量傳送和控制傳送的端點忽略。對于同步傳送的端點,必須為1。對于中斷傳送的端點,范圍為1-255。
?
字符串描述符
- bLength : 描述符大小。由整個字符串的長度加上bLength和bDescriptorType的長度決定。
- bDescriptorType : 描述符類型。固定為0x03。
- bString[1] : Unicode編碼字符串。
?
?
在USB標(biāo)準(zhǔn)類
| 00h | 設(shè)備描述符 | Use class information in the interface Descriptors |
| 01h | 接口描述符 | 音頻 |
| 02h | 設(shè)備描述符、接口描述符 | 通訊設(shè)備,如電話,moden等等 |
| 03h | 接口描述符 | HID設(shè)備 |
| 05h | 接口描述符 | Physical |
| 06h | 接口描述符 | Image |
| 07h | 接口描述符 | 打印機 |
| 08h | 接口描述符 | 大容量存儲 |
| 09h | 設(shè)備描述符 | Hub USB集線器 |
| 0Ah | 接口描述符 | CDC-Data |
| 0Bh | 接口描述符 | Smart Card |
| 0Dh | 接口描述符 | Content Security |
| 0Eh | 接口描述符 | 視頻 |
| 0Fh | 接口描述符 | Personal Healthcare |
| 10h | 接口描述符 | 音視頻設(shè)備 |
| 11h | 設(shè)備描述符 | Billboard Device Class |
| 12h | 接口描述符 | USB Type-C Bridge Class |
| DCh | 設(shè)備描述符、接口描述符 | Diagnostic Device |
| E0h | 接口描述符 | 無線控制器 |
| EFh | 設(shè)備描述符、接口描述符 | Miscellaneous |
| FEh | 接口描述符 | Application Specific |
| FFh | 設(shè)備描述符、接口描述符 | 廠商用自定義 |
?
總結(jié)
- 上一篇: STM32之内部FLASH例程
- 下一篇: 使用libcurl以Post方式向HTT