USB描述符解析-->枚举.

枚举可以理解为主机按不定的顺序向USB设备讨要设备信息,好给它分配资源,若枚举不成功,就放弃分配资源,免得浪费资源。一般都是使用中断传输方式通信。

常用的描述符有以下几种:01H、设备描述符  02H、配置描述符  03H、字符串描述符  04H、接口描述符  05H、端点描述符

21H:HID描述符 22H:HID报告

一个设备只能有一个设备描述符,而一个设备描述符可以包含多个配置描述符(bNumConfigurations  ),一个配置描述符又可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。

以下为HID描述符:(一个USB设备同时包含键盘和鼠标,使用2个接口)

一、设备描述符:Device descriptor

hid_device_descriptor =
{

0x12 ,                       // bLength   该段描述符总长18个,不可变
   0x01,                        // bDescriptorType:常用的如下0x01:设备  0x02配置 0x03字符 0x04接口 0x05端点 0x21HID
   0x0200,                    // bcdUSB  USB版本号: 1.1--0x0110   2.0--0x0200  3.0--0x0300
   0x00,                        // bDeviceClass  HID 不使用接口联合描述字与下面一起设置为00H
   0x00,                        // bDeviceSubClass
   0x00,                        // bDeviceProtocol
   8,                              // bMaxPacketSize0 端点0最大包的大小  USB2.0:低速--8  全速:8、16、32、64  高速:64
   0x1223,                    // idVendor     VID
   0x3F07,                    // idProduct     PID
   0x1110,                     // bcdDevice   厂商指定的设备版本号
   0x01,                         // iManufacturer  指向描述制造商字符串的索引
   0x02,                         // iProduct           指向描述产品的字符串索引
   0x00,                         // iSerialNumber  指向设备序列号的字符串索引
   0x01                          // bNumConfigurations  定义配置描述符的数量
};

二、配置描述符

hid_configuration_descriptor =

{
   0x09,                         // bLength  长度9个,不可变
   0x02,                         // bDescriptorType 配置描述符
   0x3b00,                     // wTotallength= 9+(9+9+7)+(9+9+7)  配置描述符+(接口描述符+HID描述符+端点描述符)*接口数
   0x02,                         // bNumInterfaces   接口数量=2(键盘+鼠标)
   0x01,                         // bConfigurationValue  Set_Configuration命令需要的参数值
   0x00,                         // iConfiguration 配置字符串索引
   0xa0,                         // bmAttributes bit7=1 bit6:1--自供电 0--总线供电 bit5:1--远程唤起 0--不支持 bit[4:0]=0
   0x32                          // MaxPower (in 2mA units) 50*2mA=100mA
};

三、接口配置符

keyboard_interface_descriptor =
{  
   0x09,                               // bLength                长度9个,不可变
   0x04,                               // bDescriptorType   接口描述符
   0x00,                               // bInterfaceNumber  接口0  (接口从0开始,键盘定义0,鼠标定义1)
   0x00,                               // bAlternateSetting   接口索引值
   0x01,                               // bNumEndpoints     端点个数1(端点0不可用,比如EP1)
   0x03,                               // bInterfaceClass     (3 = HID)
   0x01,                               // bInterfaceSubClass  接口子类型:01为Boot Device,键鼠在BIOS下就启动
   0x01,                               // bInterfaceProcotol    接口协议:00--None  01--Keyboard  02--Mouse
   0x00                                // iInterface                  描述该接口的字符串索引
};

mouse_interface_descriptor =
{  
   0x09,                               // bLength   长度9个,不可变
   0x04,                               // bDescriptorType   接口描述符
   0x01,                               // bInterfaceNumber  接口1   不同接口
   0x00,                               // bAlternateSetting   接口索引值
   0x01,                               // bNumEndpoints     端点个数1(端点0不可用,比如EP2)
   0x03,                               // bInterfaceClass     (3 = HID)
   0x01,                               // bInterfaceSubClass  接口子类型:01为Boot Device,键鼠在BIOS下就启动
   0x02,                               // bInterfaceProcotol    接口协议:00--None  01--Keyboard  02--Mouse
   0x00                                // iInterface                  描述该接口的字符串索引
};

四、HID描述符

keyboard_hid_descriptor =
{   
   0x09,                               // bLength                 长度9个,不可变
   0x21,                               // bDescriptorType    HID描述符
   0x0110,                           // bcdHID                   HID专属版本号
   0x00,                               // bCountryCode       国家代码
   0x01,                               // bNumDescriptors   附属类描述字的数目1个
   0x22,                               // bDescriptorType    描述字类型:报告   
   HID_KEYBOARD_REPORT_DESCRIPTOR_SIZE  // 键盘HID报告描述字总字节数,比如:0x75,0x00,低字节在前      
};

mouse_hid_descriptor =
{   
   0x09,                               // bLength                 长度9个,不可变
   0x21,                               // bDescriptorType    HID描述符
   0x0110,                           // bcdHID                   HID专属版本号
   0x00,                               // bCountryCode       国家代码
   0x01,                               // bNumDescriptors   附属类描述字的数目1个
   0x22,                               // bDescriptorType    描述字类型:报告   
   HID_MOUSE_REPORT_DESCRIPTOR_SIZE  // 鼠标HID报告描述字总字节数,比如0x34, 0x00,低字节在前       
};

五、端点描述符

hid_keyboard_endpoint1_in_descriptor  = 
{   
   0x07,                               // bLength                   长度7个,不可变
   0x05,                               // bDescriptorType      端点描述符
   0x81,                               // bEndpointAddress   bit[7]:1--IN  0--OUT  地址为EP1,输入
   0x03,                               // bmAttributes            传输类型(中断--03H)
   0x08,                               // MaxPacketSize_LSB   端点1最大信息包尺寸
   0x00,                               // MaxPacketSize_MSB               
   0x08,                               // bInterval                   轮询间隔 一帧为8个中断间隔
};

hid_mouse_endpoint2_in_descriptor  = 
{   
   0x07,                               // bLength                   长度7个,不可变
   0x05,                               // bDescriptorType      端点描述符
   0x82,                               // bEndpointAddress   bit[7]:1--IN  0--OUT  地址为EP2,输入
   0x03,                               // bmAttributes            传输类型(中断--03H)
   0x08,                               // MaxPacketSize_LSB   端点1最大信息包尺寸
   0x00,                               // MaxPacketSize_MSB               
   0x08,                               // bInterval                   轮询间隔 一帧为8个中断间隔
};

主机通过标准请求命令来获得以上HID描述符和HID报告:

标准USB设备请求命令共有11个,大小都是8个字节,具有相同的结构,由5 个字段构成(字段是标准请求命令的数据部分),结构如下(括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节):
bmRequestType(1) +bRequest(1) +wvalue(2) +wIndex(2) +wLength(2)
一、bmRequestType:

bit[7]: 说明请求的传输方向  1--主机到设备(OUT)   0--设备到主机(IN)

bit[6:5]:00--标准请求命令    01--专门类请求   10--用户定义的请求    11--保留

bit[4:0]:00000--接收者为设备   00001--接收者为接口   00010--接收者为端点  00011--接收者为其他元件 其他设置保留

二、bRequest:

请求命令代码,在标准的USB命令中,每一个命令都定义了编号,编号的值就为字段的值,编号与命令名称如下(要注意这里的命令代码要与其他字段结合使用,可以说命令代码是标准请求命令代码的核心,正是因为这些命令代码而决定了11个USB标准请求命令):
    1、Get Status (00H)  获取状态

wValue:0000H    wIndex:0000H(设备)、接口号或端点号  wLength:0002H
       A:[To Device]获取设备的状态:
          位0:自供电(0表示总线供电;1表示自供电).
          位1:远程唤醒(0表示不支持远程唤醒;1表示远程唤醒).
          位2~15:保留.
          一般选择总线供电,不支持远程唤醒,所以返回数据就是0x0000.
       B:[To Interface]获取接口的状态:
          接口状态的16位字节全部保留,所以返回数据就是0x0000.
       C:[To Endpoint]获取端点的状态:
          位0:Halt(0表示端点允许;1表示端点禁止).
          位1~15:保留(复位为0).

2、Clear Feature (01H) 清除特性

wValue:所要禁用的特征   wIndex:0000H(设备)、接口号或端点号  wLength:0000H
       A:[To Device]清除设备的远程唤醒功能,并返回一个空包.
       B:[To Endpoint]解禁端点.
   
    3、Set Feature (03H) 设置特性

wValue:所要使能的特征   wIndex:0000H(设备)、接口号或端点号  wLength:0000H

A:[To Device]设置设备的远程唤醒功能,并返回一个空包.
       B:[To Endpoint]禁止端点.

4、Set Address (05H) 设置地址

wValue:新的设备地址,范围0001H到007FH   wIndex:0000H  wLength:0000H
       A:设置设备地址.

5、Get Descriptor (06H) 获取描述符

wValue:高字节--描述符类型  低字节--描述符索引   wIndex:0000H或ID  wLength:需返回的字节数
       A:[To Device]获取设备描述符:
          描述当前USB协议的版本号.设备端点0的FIFO大小.USB设备的ID号等.
       B:[To Configuration]获取配置描述符:
          描述USB设备接口个数及是否有自供电能力等.
       C:[To Interface]获取接口描述符:
          描述端点0以外的物理端点个数等信息.
       D:[To Endpoint]获取端点描述符:
          描述端点0各端点的传输类型和最大信息包大小和端点的传输方向(IN/OUT).

6、Set Descriptor (07H) 设置描述符(可选,无法更新)

wValue:高字节--描述符类型  低字节--描述符索引   wIndex:0000H或ID  wLength:需传输给设备的字节数

7、Get Configuration (08H) 获取配置信息

wValue:0000H   wIndex:0000H   wLength:0001H

8、Set Configuration (09H) 设置配置

wValue:低字节规定了一个配置,若此值与设备支持的配置匹配,设备将实现所请求配置   wIndex:0000H  wLength:0000H
       A:[To Configuration]设置配置描述符.
       B:[To Interface]设置接口描述符.
       C:[To Endpoint]设置端点描述符.

9、Get Interface (0AH) 获取接口信息    
    wValue:0000H   wIndex:接口号(bInterfaceNumber)  wLength:0001H

10、Set Interface (0BH) 设置接口

wValue:要选择的替代设置(bAlternateSetting)   wIndex:接口号(bInterfaceNumber)  wLength:0000H

11、SYNCH_FRAME(0CH)

wValue:0000H   wIndex:0000H  wLength:0006H
        用于设备设置和报告一个端点的同步帧.

一个描述设备描述符和描述配置描述符过程如下图:

可以看到80  06  00  01  00  00  12  00主机发给设备的请求:

bmRequestType=80H说明这是主机发给设备的标准请求;

bRequest=06H说明这句的作用是Get Descriptor

wValue=0100H(注意这是小端模式,高字节在图片里显示在后)说明需要设备上传设备描述符(01)

wLength=0012H(注意这是小端模式,高字节在图片里显示在后)说明设备必须上传12H个字节长度的数据

于是设备上传了0012H长的设备描述符:12  01  00  02  00  00  00  08  23  12  07  3f  10  11  01  02  00  01

第四行80  06  00  02  00  00  09  00主机发给设备请求:

按上面的解释,说明这是主机要求设备上传配置描述符(02H),因为主机无法得知配置描述符里的wTotallength多大,所以先发个标准长度0009H来试探。

于是设备上传了09H长的配置描述符:09  02  3b  00  02  01  00  a0  32

主机得知配置总的含有003bH个字节,于是再次发给设备上传配置描述符的请求:80  06 00 02 00 00 3b  00,要求的总字节长度为003bH

之后设备上传了003bH的数据:9个配置描述符+9个接口0描述符+9个HID描述符+7个端点1描述符+9个接口1描述符+9个HID描述符+7个端点1描述符

之后主机进行设置配置:00  09  01  00  00  00  00  00 设置了配置描述符,使能端点1和端点2

因为有2个接口,所以分2次分别设置:

EP1:读取设备描述符,试探性配置描述符,返回键盘的配置描述符长度0022H,再次以0022H长度读取配置描述符。设置配置描述符,挂起等配置完成。

配置完成后读取HID报告:81  06  00  22  00  00  b5  00

81代表主机发给设备的接口   06代表Get Descriptor   22H为HID报告  wIndex:00为接口0  长度为75H+40H=b5H(?)

设备上传接口0的0075H长度字节HID报告。

开始设置接口1,仍然继续读取设备描述符试探性配置描述符,返回键盘的配置描述符长度0022H,再次以0022H长度读取配置描述符。设置配置描述符,挂起等配置完成。

配置完成后读取HID报告:不同的是wIndex:0001H 配置接口1,长度为34H+40H=74H(?)

设备上传接口1的0034H长度字节HID报告。结束后SET REPORT,结束,等待设备上传端点键盘鼠标数据。

USB描述符解析-->枚举.,布布扣,bubuko.com

时间: 2024-11-05 22:45:23

USB描述符解析-->枚举.的相关文章

USB描述符【转载】

USB描述符 USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主机分析返回来的数据,判断出该设备是哪一种USB设备,建立相应的数据链接通道.那么USB描述符信息到底是一个什么样的数据呢,USB协议中有详细描述. 通用的USB描述符信息包括设备描述符.配置描述符.接口描述符和端点描述符,具体不同的USB设备还包括其它类型的描述符,例如,USB鼠标.键盘还包括HID

USB 描述符

标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符. 1 // Standard Device Descriptor 2 typedef struct 3 { 4 u8 bLength; 5 u8 bDescriptorType; 6 u16 bcdUSB; 7 u8 bDeviceClass; 8 u8 bDeviceSubClass; 9 u8 bDeviceProtocol; 10 u8 bMaxPacketSize0; 11 u16 idVe

USB学习笔记连载(十二):USB描述符

USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.HID描述符,这里主要讲解USB描述符. USB标准设备描述符包括:设备描述符,端点描述符,接口描述符,配置描述符,设备限定描述符,其他描述符.这些所有的描述符都在 官方固件中的 dscr.a51 文件中,注意!!!!!   1.设备描述符 一共18个字节,14个字段.在官方给的固件程序中的描述如下图

USB描述符概述

在USB总线接口协议中,规定了一些标准的USB描述符,如表所示. 对于USB设备来说,有些USB描述符是必需的,例如: 设备描述符 配置描述符 字符串描述符 接口描述符 端点描述符 其余一些描述符并非必需,只在特定USB设备中使用,例如:设备限定描述符.其他速率配置描述符用于高速USB设备:OTG设备描述符用于USB OTG外设:超高速端点伴侣描述符用于超高速USB设备. USB描述符其实就是一个数据集合,用来表征USB设备某一方面的功能.USB协议中严格规定了每一种描述符的数据格式.各个USB

usb命令格式、描述符详解

一.USB命令 在USB规范里,对命令一词提供的单词为“Request”,但这里为了更好的理解主机与设备之间的主从关系,将它定义成“命令”. 所有的USB设备都要求对主机发给自己的控制命令作出响应,USB规范定义了11个标准命令,它们分别是:Clear_Feature. Get_Configuration.Get_Descriptor.Get_Interface.Get_Status.Set_Address. Set_Configuration.Set_Descriptor.Set_Interf

usb协议分析-设备描述符配置包-描述符

/* usb协议分析仅供大家参考---设备描述符配置包,设备描述符, 地址设置, 配置描述符, 字符串描述符 */ /* -1- usb设备描述符配置包 */ typedef struct _USB_SETUP_PACKET { REQUEST_TYPE bmRequestType; BYTE bRequest; WORD_BYTE wValue; WORD_BYTE wIndex; WORD wLength; } USB_SETUP_PACKET; 1.bmRequestType 是包含有下面

浅析USB HID ReportDesc (HID报告描述符)

在USB中,USB Host是通过各种描述符来识别识别设备的,一般在设备枚举的过程将会获取有设备描述符/配置描述符/接口描述符/端点描述符/字符串描述符等 现在我们来介绍一下HID ReportDesc. 我们看一下在其内容为 我们先来使用HID Descriptor Tool来生成上面的数据 参考资料 1.Device Class Definition for Human Interface Devices (HID) Version 1.11 .PDF 2.HID Usage Tables

转 关于USB HID报告描述符

原文地址 USB HID报告及报告描述符简介 在USB中,USBHOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等.USB报 告描述符(ReportDescriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符.USBHID设备是通过报告来给传送数据的,报告 有输入报告和输出报告.输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等:输出 报告是主机发送在

USB HID描述符【转】

本文转载自: USB是个通用的总线,端口都是统一的.但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了.USB的描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符等等.关于报告描述符,请看我以前写的:<USB HID报告及报告描述符简介 > http://group.ednchina.com/93/198.aspx.一个USB设备有一个设备描述符,设备描述符里面决定了该设