USB基础---设备、配置、接口、端点和字符串描述符
USB設備用描述符報告他們的屬性,一個描述符是一個已定義格式的數據結構體。每個描述符以一個表示描述符長度的字節和一個表示描述符類型的字節開始。
USB描述符信息存儲在USB設備中,在枚舉過程中,USB主機會向USB設備發送GetDescriptor請求,USB設備在收到這個請求之后,會將USB描述符信息返回給USB主機,USB主機分析返回來的數據,判斷出該設備是哪一種USB設備,建立相應的數據鏈接通道。那么USB描述符信息到底是一個什么樣的數據呢,USB協議中有詳細描述。
USB設備的邏輯組織中,包含設備、配置、接口和端點4個層次。每個USB設備的都提供不同級別的配置信息,可以包含一個或多個配置,不同的配置使設備表現出不同的功能組合(在探測/連接期間需要從其中選定一個),配置由多個接口組成。
在USB協議中,接口由多個端點組成,代表一個基本的功能,是USB設備驅動程序控制的對象,一個功能復雜的USB設備可以具有多個接口。設備接口是端點的匯集(Collection)。例如,USB揚聲器可以包含一個音頻接口以及對旋鈕和按鈕的接口。一個配置中的所有接口可以同時有效,并可被不同的驅動程序連接。每個接口可以有備用接口,以提供不同質量的服務參數。
?
端點是USB通信的最基本形式,每一個USB設備接口在主機看來就是一個端點的集合。主機只能通過端點與設備進行通信,以使用設備的功能。在USB系統中每一個端點都有唯一的地址,這是由設備地址和端點號給出的。每個端點都有一定的屬性,其中包括傳輸方式、總線訪問頻率、帶寬、端點號和數據包的最大容量等。一個USB端點只能在一個方向上承載數據,從主機到設備(輸出端點)或者從設備到主機(輸入端點),因此端點可看作是一個單向的管道。端點0通常為控制端點,用于設備初始化參數等。只要設備連接到USB上并且上電,端點0就可以被訪問。端點1、2等一般用作數據端點,存放主機與設備間往來的數據。
?
這種層次化配置信息在設備中通過一組標準的描述符來描述。
kernel\msm-3.18\include\uapi\linux\usb\ch9.h定義了這些描述符
kernel\msm-3.18\include\uapi\linux\usb\ch11.h----有usb hub相關的定義
設備描述符描述USB設備的通用信息,它包括適用于設備的全局信息和所有的設備配置。一個USB設備只有一個設備描述符。
bLength:表示描述符長度。
bDescriptorType:描述符類型
USB HUB描述符類型值為29H。
bcdUSB:
BCD(Binary-Coded Decimal二進制碼十進制數)版本號(USB總線版本號),bcdUSB的值是0xJJMN (JJ – major version number, M – minor version number, N – sub-minor version number)。比如版本2.13用0x0213表示,版本2.0用0x0200表示。
bDeviceClass:
由USB-IF(USB Implementers Forum)分配的設備類代碼,比如USB HUB為HUB_CLASSCODE (09H)。
如果該字段為0x00,表示由接口描述符來指定(有可能該USB設備是一個復合設備,USB設備的各個接口相互獨立,分別屬于不同的設備類)。如果是0x01~0xfe,表示為USB-IF定義的設備類,例如0x03為HID設備,0x09為HUB設備。如果是0xff,表示由廠商自定義設備類型。
bDeviceSubClass:
USB子類代碼,由USB-IF分配,如果bDeviceClass為0x00,那么該字段也必須為 0x00,其它情況可以參考USB關于對于USB Device Class的定義。如果bDeviceClass,則bDeviceSubClass的值由USB-IF分配;如果bDeviceClass為0xFF,則bDeviceSubClass的值的值由廠家自定義。
bDeviceProtocol
協議代碼,由USB-IF分配,如果bDeviceClass和bDeviceSubClass定義為0x00,那么該字段也必須為0x00。如果該字段為0xFF,則設備使用廠家自定義的值。
bMaxPacketSize0
端點0最大包大小,只有8、16、32或64有效。
idVendor
USB-IF分配的廠商ID
IdProduct
廠商自行指定的產品ID
BcdDevice
設備編號。
iManufacturer
用于描述廠商的字符串描述符索引
iProduct
用于描述產品的字符串描述符索引
iSerialNumber
用于描述產品序列號的字符串描述符索引,注意,所有的字符串描述符是可選的,如果沒有字符串描述符,指定這些索引為0x00
bNumConfigurations
配置描述符數量
比如我們主板上USB設備描述符信息如下,具體每項的意義后面再深入去對應起來學習
?
2. 配置描述符
配置描述符描述關于特定設備的配置信息。當host請求配置描述符,它下面所有相關的接口和端點描述符也一起返回。
?
bLength: 配置描述符長度,配置描述符長度為9字節大小。
bDescriptorType: 描述符類型,配置描述符類型為0x02。
wTotalLength: 配置描述符信息總的大小,包括接口描述符、端點描述符等等。
bNumInterfaces: 此配置支持的USB接口數量。
bConfigurationValue: 當使用SetConfiguration和GetConfiguration請求時所指定的配置索引值。
iConfiguration: 描述配置的字符串描述符索引。
bmAttributes: 供電配置,位詳細定義如下:
????????????????????????? D7????????????? 保留,必須置1
????????????????????????? D6????????????? 自供電模式
?????????????????????? ???D5????????????? 遠程喚醒
????????????????????????? D4~D0????? 保留
如果設備描述符支持遠程喚醒,D5要設置為1
bMaxPower: 最大功耗,以2mA為單位,例如0x32為50*2=100mA。
?
3. 接口描述符
接口描述符描述一個配置下的特定接口,當一個配置支持多個接口,那一個接口下的所有端點描述符經常是作為一個配置描述符下的一部分返回。接口描述符不能使用GetDescriptor() 或SetDescriptor()請求直接訪問。
bLength: 描述符長度,接口描述符長度為9個字節。
bDescriptorType: 描述符類型,接口描述符的類型為0x04。
bInterfaceNumber: 該接口編號,接口編號從0開始分配,當一個配置有多個接口時,就用該字段來區分不同的接口。
bAlternateSetting: USB設備配置與USB配置描述符是一一對應的, 即一個配置只能有一個配置描述符。雖然由bInterfaceNumber字段可知, 每一個接口都有一個惟一確定的接口編號, 但是一個接口卻可以由不只一個接口描述符來描述它。USB 允許多個接口描述符來描述同一個接口, 且這些描述符都可通過命令切換。此字段就是每一個這類描述符惟一的編號。USB可通過調用這個字段來切換描述同一個接口的不同描述符。控制傳輸中的Get_Inter face 命令可以用來得到目前正在使用的描述一個確定接口的接口描述符的編號, 即此字段。而Set_Inte rface 命令則以此字段值為參數, 用來使相應的接口描述符描述某個確定的接口
bNumEndpoints:? 端點數量,不包括端點0。
bInterfaceClass:USB-IF分配的類代碼,0預覽未來使用,0xFF表示接口類是廠家自定義,其他值由USB-IF指定。
bInterfaceSubClass:USB-IF分配的子類代碼,由bInterfaceClass字段限制。
bInterfaceProtocol:? 如果一個接口支持特定類請求,此代碼標識由特定設備類定義的協議,如果該字段為0,設備部在此接口不使特定類的協議,如果該字段為0xFF,設備為此接口使用廠家自定義協議。
iInterface: 描述該接口的字符串描述符索引。
?
4. 端點
端點描述符包含的信息被host用來決定每個端點所需帶寬,一個端點描述符經常作為通過GetDescriptor(Configuration)請求配置信息的一部分被獲取。一個端點描述用GetDescriptor() or SetDescriptor()請求直接訪問。端點0沒有描述符。
bLength:?描述符長度,這里有兩個值如果是audio設備的端點,那么端點描述符長度就為9個字節,對于其它設備端點,端點描述符長度就為7個字節。
bDescriptorType:?描述符類型,端點描述符類型為0x05。
bEndpointAddress:?端點地址,詳細定義如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D7?端點方向
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ?OUT端點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ?IN端點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D6~D4 ? ? ??保留?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D3~D0 ? ? ??端點編號
bmAttributes:?端點類型,詳細定義如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D5~D4?用途
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 00 ? ??數據端點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01 ? ??反饋端點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 10 ? ??隱式反饋數據端點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 11 ? ??保留
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D3~D2?同步類型
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 00 ? ??非同步
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01 ? ??異步
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 10 ? ??自適應
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 11 ? ??同步
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D1~D0?傳輸類型
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 00 ? ??控制傳輸
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01 ? ??同步傳輸
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 10 ? ??塊傳輸
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 11 ? ??中斷傳輸
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果該端點不是同步端點,D5~D2保留且必須置0。
wMaxPacketSize:?端點所支持最大數據包的長度,詳細定義如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D10~D0?最大數據包長度
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D12~D11
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 其余位保留且必須置0。
bInterval:端點數據傳輸的訪問時間間隔。對于全速/低速的中斷端點,取值范圍為?1~255,對于高速中斷端點,取值范圍為1~16,詳細定義可以參考USB協議。
?
5. 字符串描述符
字符描述符是可選的,如果一個設備不支持字符串描述符,設備描述符、配置描述符和接口描述符中對字符串描述符的引用必須設置為0.
下圖是我們產品/sys/kernel/debug/usb/devices的內容
?
?
參考鏈接:
USB2.0協議標準描述符
https://blog.csdn.net/hushiganghu/article/details/54929066
USB描述符【整理】
https://www.cnblogs.com/Daniel-G/p/3993904.html
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的USB基础---设备、配置、接口、端点和字符串描述符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android/WINCE驱动、系统(f
- 下一篇: Android 用adb 打印linux