日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

USB描述符【整理】

發(fā)布時間:2023/12/2 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USB描述符【整理】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

USB描述符

USB描述符信息存儲在USB設(shè)備中,在枚舉過程中,USB主機(jī)會向USB設(shè)備發(fā)送GetDescriptor請求,USB設(shè)備在收到這個請求之后,會將USB描述符信息返回給USB主機(jī),USB主機(jī)分析返回來的數(shù)據(jù),判斷出該設(shè)備是哪一種USB設(shè)備,建立相應(yīng)的數(shù)據(jù)鏈接通道。那么USB描述符信息到底是一個什么樣的數(shù)據(jù)呢,USB協(xié)議中有詳細(xì)描述。

?

通用的USB描述符信息包括設(shè)備描述符、配置描述符、接口描述符和端點描述符,具體不同的USB設(shè)備還包括其它類型的描述符,例如,USB鼠標(biāo)、鍵盤還包括HID描述符和報告描述符,還有可能包括字符串描述符,USB協(xié)議中對描述符類型定義如下:

?

所有的描述符信息都是通過發(fā)送GetDescriptor請求得到的,但是USB設(shè)備也不知道你要獲取的是哪種描述符,所以還需要在GetDescriptor請求中指定描述符的類型以及描述符的長度,這樣USB設(shè)備才能正確的返回描述符信息。

?

?

1?設(shè)備描述符

Linux中對于設(shè)備描述符結(jié)構(gòu)體定義如下:

?

216 /* USB_DT_DEVICE: Device descriptor */
217 struct usb_device_descriptor {
218 ? ? ? ? __u8 ?bLength;
219 ? ? ? ? __u8 ?bDescriptorType;
220 ? ??
221 ? ? ? ? __le16 bcdUSB;
222 ? ? ? ? __u8 ?bDeviceClass;
223 ? ? ? ? __u8 ?bDeviceSubClass;
224 ? ? ? ? __u8 ?bDeviceProtocol;
225 ? ? ? ? __u8 ?bMaxPacketSize0;
226 ? ? ? ? __le16 idVendor;
227 ? ? ? ? __le16 idProduct;
228 ? ? ? ? __le16 bcdDevice;
229 ? ? ? ? __u8 ?iManufacturer;
230 ? ? ? ? __u8 ?iProduct;
231 ? ? ? ? __u8 ?iSerialNumber;
232 ? ? ? ? __u8 ?bNumConfigurations;
233 } __attribute__ ((packed));
234?
235 #define USB_DT_DEVICE_SIZE ? ? ? ? ? ? ?18

?

bLength:?描述符的長度,設(shè)備描述符的長度為18個字節(jié)。

bDescriptorType:?描述符的類型,設(shè)備描述符的類型為0x01。

bcdUSB: USB設(shè)備所遵循的協(xié)議版本號,例如2.0協(xié)議為0x0200。

bDeviceClass: USB設(shè)備類代碼,由USB-IF分配,如果該字段為0x00,表示由接口描述符來指定(有可能該USB設(shè)備是一個復(fù)合設(shè)備,USB設(shè)備的各個接口相互獨(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的定義。

bDeviceProtocol:?協(xié)議代碼,由USB-IF分配,如果bDeviceClass和bDeviceSubClass定義為0x00,那么該字段也必須為0x00。

bMaxPacketSize0:?端點0最大數(shù)據(jù)包長度,必須為8、16、32和64。

idVendor:?廠商ID,由USB-IF分配,需要向USB-IF組織申請。

idProduct:?產(chǎn)品ID,由廠商指定。

bcdDevice:?設(shè)備序列號,由廠商自行設(shè)置。

iManufacturer:?用于描述廠商的字符串描述符索引。

iProduct:?用于描述產(chǎn)品的字符串描述符索引。

iSerialNumber:?用于描述產(chǎn)品序列號的字符串描述符索引,注意,所有的字符串描述符是可選的,如果沒有字符串描述符,指定這些索引為0x00。

bNumConfigurations:配置描述符數(shù)量。

例如,我的USB鼠標(biāo)設(shè)備描述符信息如下:

?

從中可以看出該USB設(shè)備符合USB1.1協(xié)議,在設(shè)備描述中并沒有指定該USB設(shè)備類型,端點0最大數(shù)據(jù)包長度為8個字節(jié),也就是說一次還不能獲取完全設(shè)備描述符,需要三次才能獲取完全。再看bMaxPacketSize0在設(shè)備描述符中的偏移,剛好是第8個字節(jié),也就是說傳輸一次就能知道端點0一次能夠傳輸多長的數(shù)據(jù),根據(jù)這個值才能判斷出是否繼續(xù)傳輸,來完整的獲取描述符信息。該USB設(shè)備的idVendor為0x80ee,idProduct為0x0021,有一個配置等等信息。

?

?

2?配置描述符

一個USB設(shè)備只有一個USB設(shè)備描述符,可以有多個配置描述符,配置描述符定義如下:

?

265 /* USB_DT_CONFIG: Configuration descriptor information.
266 ?*
267 ?* USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the
268 ?* descriptor type is different. ?Highspeed-capable devices can look
269 ?* different depending on what speed they're currently running. ?Only
270 ?* devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG
271 ?* descriptors.
272 ?*/
273 struct usb_config_descriptor {
274 ? ? ? ? __u8 ?bLength;
275 ? ? ? ? __u8 ?bDescriptorType;
276?
277 ? ? ? ? __le16 wTotalLength;
278 ? ? ? ? __u8 ?bNumInterfaces;
279 ? ? ? ? __u8 ?bConfigurationValue;
280 ? ? ? ? __u8 ?iConfiguration;
281 ? ? ? ? __u8 ?bmAttributes;
282 ? ? ? ? __u8 ?bMaxPower;
283 } __attribute__ ((packed));
284?
285 #define USB_DT_CONFIG_SIZE ? ? ? ? ? ? ?9

?

bLength:?配置描述符長度,配置描述符長度為9字節(jié)大小。

bDescriptorType:?描述符類型,配置描述符類型為0x02。

wTotalLength:?配置描述符信息總的大小,包括接口描述符、端點描述符等等。

bNumInterfaces: USB接口數(shù)量。

bConfigurationValue:?當(dāng)使用SetConfiguration和GetConfiguration請求時所指定的配置索引值。

iConfiguration:?描述配置的字符串描述符索引。

bmAttributes:?供電配置,位詳細(xì)定義如下:

? ? ? ? ? ? ? ? ? ? ? ? ? D7 ? ? ? ? ? ? ?保留,必須置1

? ? ? ? ? ? ? ? ? ? ? ? ? D6 ? ? ? ? ? ? ?自供電模式

? ? ? ? ? ? ? ? ? ? ? ? ? D5 ? ? ? ? ? ? ?遠(yuǎn)程喚醒

? ? ? ? ? ? ? ? ? ? ? ? ? D4~D0 ? ? ?保留

bMaxPower:?最大功耗,以2mA為單位,例如0x32為50*2=100mA。

我的USB鼠標(biāo)配置描述符信息如下:

?

從中可以看出該設(shè)備配置信息總大小為0x22=34字節(jié)大小,有一個接口,最大功耗為100mA等信息。

?

?

3?接口描述符

一個配置中可以有一個或多個接口,一個接口中有0個或多個端點,接口描述符和端點描述符不能直接通過GetDescriptor請求返回,必須連同配置描述符一起返回,Linux中接口描述符定義如下:

?

309 /* USB_DT_INTERFACE: Interface descriptor */
310 struct usb_interface_descriptor {
311 ? ? ? ? __u8 ?bLength;
312 ? ? ? ? __u8 ?bDescriptorType;
313?
314 ? ? ? ? __u8 ?bInterfaceNumber;
315 ? ? ? ? __u8 ?bAlternateSetting;
316 ? ? ? ? __u8 ?bNumEndpoints;
317 ? ? ? ? __u8 ?bInterfaceClass;
318 ? ? ? ? __u8 ?bInterfaceSubClass;
319 ? ? ? ? __u8 ?bInterfaceProtocol;
320 ? ? ? ? __u8 ?iInterface;
321 } __attribute__ ((packed));
322?
323 #define USB_DT_INTERFACE_SIZE ? ? ? ? ? 9

?

bLength:?描述符長度,接口描述符長度為9個字節(jié)。

bDescriptorType:?描述符類型,接口描述符的類型為0x04。

bInterfaceNumber:?該接口編號,接口編號從0開始分配,當(dāng)一個配置有多個接口時,就用該字段來區(qū)分不同的接口。

bAlternateSetting:

bNumEndpoints: ?端點數(shù)量,不包括端點0。

bInterfaceClass

bInterfaceSubClass

bInterfaceProtocol: ?和設(shè)備描述符中的bDeviceClass、bDeviceSubClass、bDeviceProtocol類似。

iInterface:?描述該接口的字符串描述符索引。

接口描述符實例如下:

?

前面9個字節(jié)是配置描述符,從中可以看出端點數(shù)量為1,bInterfaceClass為0x03,即為HID設(shè)備。

?

?

4?端點描述符

注意,端點0沒有端點描述符,Linux中端點描述符結(jié)構(gòu)定義如下:

?

327 /* USB_DT_ENDPOINT: Endpoint descriptor */
328 struct usb_endpoint_descriptor {
329 ? ? ? ? __u8 ?bLength;
330 ? ? ? ? __u8 ?bDescriptorType;
331?
332 ? ? ? ? __u8 ?bEndpointAddress;
333 ? ? ? ? __u8 ?bmAttributes;
334 ? ? ? ? __le16 wMaxPacketSize;
335 ? ? ? ? __u8 ?bInterval;
336?
337 ? ? ? ? /* NOTE: ?these two are _only_ in audio endpoints. */
338 ? ? ? ? /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
339 ? ? ? ? __u8 ?bRefresh;
340 ? ? ? ? __u8 ?bSynchAddress;
341 } __attribute__ ((packed));
342?
343 #define USB_DT_ENDPOINT_SIZE ? ? ? ? ? ?7
344 #define USB_DT_ENDPOINT_AUDIO_SIZE ? ? ?9 ? ? ? /* Audio extension */

?

bLength:?描述符長度,這里有兩個值如果是audio設(shè)備的端點,那么端點描述符長度就為9個字節(jié),對于其它設(shè)備端點,端點描述符長度就為7個字節(jié)。

bDescriptorType:?描述符類型,端點描述符類型為0x05。

bEndpointAddress:?端點地址,詳細(xì)定義如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D7?端點方向

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ?OUT端點

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ?IN端點

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D6~D4 ? ? ??保留?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D3~D0 ? ? ??端點編號

bmAttributes:?端點類型,詳細(xì)定義如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D5~D4?用途

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 00 ? ??數(shù)據(jù)端點

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01 ? ??反饋端點

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 10 ? ??隱式反饋數(shù)據(jù)端點

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 11 ? ??保留

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D3~D2?同步類型

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 00 ? ??非同步

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01 ? ??異步

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 10 ? ??自適應(yīng)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 11 ? ??同步

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D1~D0?傳輸類型

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 00 ? ??控制傳輸

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01 ? ??同步傳輸

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 10 ? ??塊傳輸

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 11 ? ??中斷傳輸

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果該端點不是同步端點,D5~D2保留且必須置0。

wMaxPacketSize:?端點所支持最大數(shù)據(jù)包的長度,詳細(xì)定義如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D10~D0?最大數(shù)據(jù)包長度

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? D12~D11

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 其余位保留且必須置0。

bInterval:端點數(shù)據(jù)傳輸?shù)脑L問時間間隔。對于全速/低速的中斷端點,取值范圍為?1~255,對于高速中斷端點,取值范圍為1~16,詳細(xì)定義可以參考USB協(xié)議。

端點描述符實例如下:

?

因為不能單獨(dú)的獲取接口和端點描述符,所以我將設(shè)備配置信息全獲取下來了,端點描述符從0x07處開始,0x07為端點描述符長度,該端點是一個IN端點,端點地址為1,該端點是一個中斷端點,最大數(shù)據(jù)包長度為6個字節(jié),時間間隔為10ms。

?

?

5 HID描述符

從上圖可以看出,除了配置描述符、接口描述符、端點描述符之外、還有一個描述符,它就是HID描述符,HID描述符專用于HID類設(shè)備。Linux關(guān)于HID描述符結(jié)構(gòu)定義如下:

?

537 struct hid_class_descriptor {
538 ? ? ? ? __u8 ?bDescriptorType;
539 ? ? ? ? __le16 wDescriptorLength;
540 } __attribute__ ((packed));
541?
542 struct hid_descriptor {
543 ? ? ? ? __u8 ?bLength;
544 ? ? ? ? __u8 ?bDescriptorType;
545 ? ? ? ? __le16 bcdHID;
546 ? ? ? ? __u8 ?bCountryCode;
547 ? ? ? ? __u8 ?bNumDescriptors;
548?
549 ? ? ? ? struct hid_class_descriptor desc[1];
550 } __attribute__ ((packed));

?

bLength:?描述符長度。

bDescriptorType:描述符類型,HID描述符的類型為0x21。

bcdHID:?所遵循的HID協(xié)議版本。

bCountryCode:?國家代碼。

bNumDescriptors:?下級描述符數(shù)量,通常至少需要一個報告描述符。

bDescriptorType:?下級描述符類型,例如報告描述符。

wDescriptorLength:?下級描述符長度。

從上面USB鼠標(biāo)配置描述符中可以看出,該鼠標(biāo)所遵循的HID協(xié)議版本為1.1,有一個HIDclass描述符,描述符類型為0x22,即報告描述符,描述符長度為0x46。

原文地址:http://blog.csdn.net/mcgrady_tracy/

轉(zhuǎn)載于:https://www.cnblogs.com/Daniel-G/p/3993904.html

總結(jié)

以上是生活随笔為你收集整理的USB描述符【整理】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。