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