usb-descriptor(一 )
USB協議為USB裝置定義了一套描述裝置功能和屬性的有固定結構的描述符,包括標準的描述符:
1. 裝置描述符
2. 配置描述符
3. 介面描述符
4. 端點描述符
5. 字串描述符
6. 百標準描述符,如類描述符。
USB裝置通過這些描述符向USB主機彙報裝置的各種各樣屬性,主機通過對這些描述符的訪問對裝置進行型別識別、配置併為其提供相應的客戶端驅動程式。
USB裝置通過描述符反映自己的裝置特性。USB描述符是由特定格式排列的一組資料結構組成。
在USB裝置列舉過程中,主機端的協義軟體需要解析從USB裝置讀取的所有描述符資訊。在USB主向裝置傳送讀取描述符的請求後,USB裝置將所有的描述符以連續的資料流方式傳輸給USB主機。主機從第一個讀到的字元開始,根據雙方規定好的資料格式,順序地解析讀到的資料流。
USB描述符包含標準描述符、類描述符和廠商特定描述3種形式。任何一種裝置必須USB標準描述符(隊字串描述符可選外)。
在USB1.X中,規定了5種標準描述符:裝置描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、介面描述符(Interface Descriptor)、端點描述符(Endpoint Descriptor)和字串描述符(String Descriptor)。
每個USB裝置只有一個裝置描述符,而一個裝置中可包含一個或多個配置描述符,即USB裝置可以有多種配置。裝置的每一個配置中又可以包含一個或多個介面描述符,即USB裝置可以支援多種功能(介面),介面的特性通過描述符提供。
在USB主機訪問USB裝置的描述符時,USB裝置依照裝置描述符、配置描述符、介面描述符、端點描述符、字串描述符順序將所有描述符傳給主機。一裝置至少要包含裝置描述符、配置描述符和介面描述符,如果USB裝置沒有端點描述符,則它僅僅用預設管道與主機進行資料傳輸。
裝置描述符
裝置描述符給出了USB裝置的一般資訊,包括對裝置及在裝置配置中起全程作用的資訊,包括製造商標識號ID、產品序列號、所屬裝置類號、預設端點的最大包長度和配置描述符的個數等。一個USB裝置必須有且僅有一個裝置描述符。裝置描述符是裝置連線到匯流排上時USB主機所讀取的第一個描述符,它包含了14個欄位,結構如下:
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | 數字 | 此描述表的位元組數 |
1 | bDecriptorType | 1 | 常量 | 描述符的型別(此處應為0x01,即裝置描述符) |
2 | bcdUSB | 2 | BCD碼 | 此裝置與描述表相容的USB裝置說明版本號(BCD 碼) |
4 | bDeviceClass | 1 | 類 | 裝置類碼: 如果此域的值為0則一個設定下每個介面指出它自己的類,各個介面各自獨立工作。 如果此域的值處於1~FEH之間,則裝置在不同的介面上支援不同的類。並這些介面可能不能獨立工作。此值指出了這些介面集體的類定義。 如果此域設為FFH,則此裝置的類由廠商定義。 |
5 | bDeviceSubClass | 1 | 子類 | 子類挖碼 這些碼值的具體含義根據bDeviceClass 域來看。 如bDeviceClass 域為零,此域也須為零 如bDeviceClass 域為FFH,此域的所有值保留。 |
6 | bDevicePortocol | 1 | 協議 | 協議碼 這些碼的值視bDeviceClass 和 bDeviceSubClass 的值而定。 如果裝置支援裝置類相關的協議,此碼標誌了裝置類的值。如果此域的值為零,則此裝置不支援裝置類相關的協議,然而,可能它的介面支援裝置類相關的協議。如果此域的值為FFH,此裝置使用廠商定義的協議。 |
7 | bMaxPacketSize0 | 1 | 數字 | 端點0的最大包大小(僅8,16,32,64 為合法值) |
8 | idVendor | 2 | ID | 廠商標誌(由USB-IF組織賦值) |
10 | idProduct | 2 | ID | 產品標誌(由廠商賦值) |
12 | bcdDevice | 2 | BCD 碼 | 裝置發行號(BCD 碼) |
14 | iManufacturer | 1 | 索引 | 描述廠商資訊的字串描述符的索引值。 |
15 | iProduct | 1 | 索引 | 描述產品資訊的字串描述符的索引值。 |
16 | iSerialNumber | 1 | 索引 | 描述裝置序列號資訊的字串描述符的索引值。 |
17 | bNumConfigurations | 1 | 數字 | 可能的配置描述符數目 |
其中bDescriptorType為描述符的型別,其含義可查下表(此表也適用於標準命令Get_Descriptor中wValue域高位元組的取值含義):
表5、USB描述符的型別值
型別 | 描述符 | 描述符值 |
---|---|---|
標準描述符 | 裝置描述符(Device Descriptor) | 0x01 |
配置描述符(Configuration Descriptor) | 0x02 | |
字串描述符(String Descriptor) | 0x03 | |
介面描述符(Interface Descriptor) | 0x04 | |
端點描述符(EndPont Descriptor) | 0x05 | |
類描述符 | 集線器類描述符(Hub Descriptor) | 0x29 |
人機介面類描述符(HID) | 0x21 | |
廠商定義的描述符 | 0xFF |
裝置類程式碼bDeviceClass可查下表:
表6、裝置的類別(bDeviceClass)
值(十進位制) | 值(十六進位制) | 說明 |
---|---|---|
0 | 0x00 | 介面描述符中提供類的值 |
2 | 0x02 | 通訊類 |
9 | 0x09 | 集線器類 |
220 | 0xDC | 用於診斷用途的裝置類 |
224 | 0xE0 | 無線通訊裝置類 |
255 | 0xFF | 廠商定義的裝置類 |
下表列出了一個USB滑鼠的裝置描述符的例子,供大家分析一下:
表7、一種滑鼠的裝置描述符示例
欄位 | 描述符值(十六制) |
---|---|
bLength | 0x12 |
bDecriptorType | 0x01 |
bcdUSB | x0110 |
DeviceClass | 0x00 |
bDeviceSubClass | 0x00 |
bDevicePortocol | 0x00 |
bMaxPacketSize0 | 0x08 |
idVendor | 0x045E(Microsoft Corporation) |
idProduct | 0x0047 |
bcdDevice | 0x300 |
iManufacturer | 0x01 |
iProduct | 0x03 |
iSerialNumber | 0x00 |
bNumConfigurations | 0x01 |
2、配置描述符
配置描述符中包括了描述符的長度(屬於此描述符的所有介面描述符和端點描述符的長度的和)、供電方式(自供電/匯流排供電)、最大耗電量等。主果主機發出USB標準命令Get_Descriptor要求得到裝置的某個配置描述符,那麼除了此配置描述符以外,此配置包含的所有介面描述符與端點描述符都將提供給USB主機。
表8、USB配置描述符的結構
偏移量 | 域 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | bLength | 1 | 數字 | 此描述表的位元組數長度。 |
1 | bDescriptorType | 1 | 常量 | 配置描述表型別(此處為0x02) |
2 | wTotalLength | 2 | 數字 | 此配置資訊的總長(包括配置,介面,端點和裝置類及廠商定義的描述符) |
4 | bNumInterfaces | 1 | 數字 | 此配置所支援的介面個數 |
5 | bCongfigurationValue | 1 | 數字 | 在SetConfiguration()請求中用作引數來選定此配置。 |
6 | iConfiguration | 1 | 索引 | 描述此配置的字串描述表索引 |
7 | bmAttributes | 1 | 點陣圖 | 配置特性: D7: 保留(設為一) D6: 自給電源 D5: 遠端喚醒 D4..0:保留(設為一) |
8 | MaxPower | 1 | mA | 在此配置下的匯流排電源耗費量。以 2mA 為一個單位。 |
下面是一種硬碟的配置描述符示例:
表9、一種硬碟的配置描述符示例
欄位 | 描述符值(十六進位制) |
---|---|
bLength | 0x09 |
bDescriptorType | 0x02 |
wTotalLength | 0x01F |
bNumInterfaces | 0x01 |
bCongfigurationValue | 0x01 |
iConfiguration | 0x00 |
bmAttributes | 0x0C |
MaxPower | 0x32 |
相關文章
- usb-descriptor(二)
- usb-descriptor(三)
- 一筆一劃教你寫一簽名
- 一主一物一邏備庫
- 一步一步實現一個PromisePromise
- 一、JVM專欄之一JVM
- 冪的一個公式(一)公式
- mybatis 一對一關聯MyBatis
- 弘一法師語錄一
- 一對一直播原始碼助力一對一教育,進入直播3.0時代!原始碼
- MyBatis 使用resultMap 以及 一對一和一對多MyBatis
- 一步一步,實現自己的ButterKnife(一)
- 一步一步帶你實現virtualdom(一)
- 一杯茶,一支菸,一行程式碼寫一天 !行程
- 一比一還原axios原始碼(一)—— 發起第一個請求iOS原始碼
- 一起來看MyBatis(一)MyBatis
- 一週入門angularJS(一)AngularJS
- 一對一聊天ajax實現
- 一個蘿蔔一個坑
- JavaScriptFAQ(一)——常見問題(一)JavaScript
- 聊一聊Oracle的Tablespace(一)Oracle
- promise原理—一步一步實現一個promisePromise
- 一步一步帶你掌握webpack(一)——入門Web
- 一天一個設計模式(一) - 總體概述設計模式
- EF:Fluent API 把一對多對映為一對一API
- 什麼是一對一直播原始碼?一對一直播為何產生?原始碼
- JPA(3) 表關聯關係(多對一、一對多、多對多、一對一)
- SQLServer查詢最近一天,三天,一週,一月,一季度方法SQLServer
- excel表格複製貼上格式怎麼能一模一樣 表格怎麼複製一個一模一樣的Excel
- gorm 關係一對一,一對多,多對多查詢GoORM
- 花費一天一夜解決RAC故障(一)
- 循序漸進DIY一個react(一)React
- Cherry-Pick | 一日一 GitGit
- OPC UA 統一架構) (一)架構
- 自己寫一個mvc框架吧(一)MVC框架
- 【董天一】什麼是IPFS?(一)
- (一)你的第一個Socket程式
- 一個按鈕,一鍵傳功!