




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、USB命令在USB规范里,对命令一词提供的单词为“Request”,但这里为了更好的理解主机与设备之间的主从关系,将它定义成“命令”。所有的USB设备都要求对主机发给自己的控制命令作出响应,USB规范定义了11个标准命令,它们分别是:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。所有USB设备都必须支持这些命令(个别命令除外,如Set_Descriptor、Synch_Frame)。所有的命令虽然有不同的数据和使用目的,有的USB命令结构是一样的。下表所示为USB命令的结构:表1、USB命令的结构偏移量域长度(字节)值描述0bmRequestType1位图请求特征:D7:传输方向0=主机至设备1=设备至主机D6.5:种类0=标准1=类2=厂商3=保留D4.0:接受者0=设备1=接口2=端点3=其他4.31 保留1bRequest1值命令类型编码值(见表3)2wValue2值根据不同的命令,含义也不同4wIndex2索引或偏移根据不同的命令,含义也不同,主要用于传送索引或偏移6wLength2如有数据传送阶段,此为数据字节数。下表列出了USB的11种标准命令表2、USB的11种标准命令命令bmRequestTypebRequestwValuewIndexwLengthDataClear_Feature00000000B00000001B00000010BCLEAR_FEATURE特性选择符零接口号端点号零无Get_Configuration10000000BGET_CONFIGURATION零零一配置值Get_Descriptor10000000BGET_DESCRIPTOR描述表种类(高字节,见表5)和索引(低字节)零或语言标志描述表长描述表Get_Interface10000001BGET_INTERFACE零接口号一可选设置Get_Status10000000B10000001B10000010BGET_STATUS零零(返回设备状态)接口号(对像时接口时)端点号(对象是端点时)二设备,接口 ,或端点状态Set_Address00000000BSET_ADDRESS设备地址零零无Set_Configuration00000000BSET_CONFIGURATION配置值(高字节为0,低字节表示要设置的配置值)零零无Set_Descriptor00000000BSET_DESCRIPTOR描述表种类(高字节,见表5)和索引(低字节)零或语言标志描述表长描述表Set_Feature00000000B00000001B00000010BSET_FEATURE特性选择符(1表示设备,0表示端点)零接口号端点号零无Set_Interface00000001BSET_INTERFACE可选设置接口号零无Synch_Frame100000010BSYNCH_FRAME零端点号二帧号其中bRequest为命令编码值,含意见表3:表3、USB标准命令的编码值bRequestValueGET_STATUS0CLEAR_FEATURE1为将来保留2SET_FEATURE3为将来保留4SET_ADDRESS5GET_DESCRIPTOR6SET_DESCRIPTOR7GET_CONFIGURATION8SET_CONFIGURATION9GET_INTERFACE10SET_INTERFACE11SYNCH_FRAME12二、USB描述符USB协议为USB设备定义了一套描述设备功能和属性的有固定结构的描述符,包括标准的描述符即设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符,还有百标准描述符,如类描述符。USB设备通过这些描述符向USB主机汇报设备的各种各样属性,主机通过对这些描述符的访问对设备进行类型识别、配置并为其提供相应的客户端驱动程序。USB设备通过描述符反映自己的设备特性。USB描述符是由特定格式排列的一组数据结构组成。在USB设备枚举过程中,主机端的协义软件需要解析从USB设备读取的所有描述符信息。在USB主向设备发送读取描述符的请求后,USB设备将所有的描述符以连续的数据流方式传输给USB主机。主机从第一个读到的字符开始,根据双方规定好的数据格式,顺序地解析读到的数据流。USB描述符包含标准描述符、类描述符和厂商特定描述种形式。任何一种设备必须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个字段,结构如下:表4、USB设备描述符的结构偏移量域大小值描述0bLength1数字此描述表的字节数1bDecriptorType1常量描述符的类型(此处应为0x01,即设备描述符)2bcdUSB2BCD码此设备与描述表兼容的USB设备说明版本号(BCD 码)4bDeviceClass1类设备类码:如果此域的值为0则一个设置下每个接口指出它自己的类,各个接口各自独立工作。如果此域的值处于1FEH之间,则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作。此值指出了这些接口集体的类定义。如果此域设为FFH,则此设备的类由厂商定义。5bDeviceSubClass1子类子类挖码这些码值的具体含义根据bDeviceClass 域来看。如bDeviceClass 域为零,此域也须为零如bDeviceClass 域为FFH,此域的所有值保留。6bDevicePortocol1协议协议码这些码的值视bDeviceClass 和 bDeviceSubClass 的值而定。如果设备支持设备类相关的协议,此码标志了设备类的值。如果此域的值为零,则此设备不支持设备类相关的协议,然而,可能它的接口支持设备类相关的协议。如果此域的值为FFH,此设备使用厂商定义的协议。7bMaxPacketSize01数字端点0的最大包大小(仅8,16,32,64为合法值)8idVendor2ID厂商标志(由USB-IF组织赋值)10idProduct2ID产品标志(由厂商赋值)12bcdDevice2BCD 码设备发行号(BCD 码)14iManufacturer1索引描述厂商信息的字符串描述符的索引值。15iProduct1索引描述产品信息的字串描述符的索引值。16iSerialNumber1索引描述设备序列号信息的字串描述符的索引值。17bNumConfigurations1数字可能的配置描述符数目其中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)值(十进制)值(十六进制)说明00x00接口描述符中提供类的值20x02通信类90x09集线器类2200xDC用于诊断用途的设备类2240xE0无线通信设备类2550xFF厂商定义的设备类下表列出了一个USB鼠标的设备描述符的例子,供大家分析一下:表7、一种鼠标的设备描述符示例字段描述符值(十六制)bLength0x12bDecriptorType0x01bcdUSBx0110bDeviceClass0x00bDeviceSubClass0x00bDevicePortocol0x00bMaxPacketSize00x08idVendor0x045E(Microsoft Corporation)idProduct0x0047bcdDevice0x300iManufacturer0x01iProduct0x03iSerialNumber0x00bNumConfigurations0x012、配置描述符配置描述符中包括了描述符的长度(属于此描述符的所有接口描述符和端点描述符的长度的和)、供电方式(自供电/总线供电)、最大耗电量等。主果主机发出USB标准命令Get_Descriptor要求得到设备的某个配置描述符,那么除了此配置描述符以外,此配置包含的所有接口描述符与端点描述符都将提供给USB主机。表8、USB配置描述符的结构 偏移量 域大小 值 描述 0bLength1 数字此描述表的字节数长度。 1bDescriptorType1 常量配置描述表类型(此处为0x02) 2wTotalLength2 数字此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述符) 4bNumInterfaces1 数字此配置所支持的接口个数 5bCongfigurationValue1 数字在SetConfiguration()请求中用作参数来选定此配置。 6iConfiguration1 索引描述此配置的字串描述表索引 7bmAttributes1 位图配置特性:D7: 保留(设为一)D6: 自给电源D5: 远程唤醒D4.0:保留(设为一)一个既用总线电源又有自给电源的设备会在MaxPower域指出需要从总线取的电量。并设置D6为一。运行时期的实际电源模式可由GetStatus(DEVICE) 请求得到。 8MaxPower1 mA在此配置下的总线电源耗费量。以 2mA 为一个单位。下面是一种硬盘的配置描述符示例:表9、一种硬盘的配置描述符示例字段描述符值(十六进制)bLength0x09bDescriptorType0x02wTotalLength0x01FbNumInterfaces0x01bCongfigurationValue0x01iConfiguration0x00bmAttributes0x0CMaxPower0x323、接口描述符配置描述符中包含了一个或多个接口描述符,这里的“接口”并不是指物理存在的接口,在这里把它称之为“功能”更易理解些,例如一个设备既有录音的功能又有扬声器的功能,则这个设备至少就有两个“接口”。如果一个配置描述符不止支持一个接口描述符,并且每个接口描述符都有一个或多个端点描述符,那么在响应USB主机的配置描述符命令时,USB设备的端点描述符总是紧跟着相关的接口描述符后面,作为配置描述符的一部分被返回。接口描述符不可直接用Set_Descriptor和Get_Descriptor来存取。如果一个接口仅使用端点0,则接口描述符以后就不再返回端点描述符,并且此接口表现的是一个控制接口的特性,它使用与端点0相关联的默认管道进行数据传输。在这种情况下bNumberEndpoints域应被设置成0。接口描述符在说明端点个数并不把端点0计算在内。表10、USB接口描述符的结构偏移量域大小值说明 0bLength1数字此表的字节数 1bDescriptorType1常量接口描述表类(此处应为0x04) 2bInterfaceNumber1数字接口号,当前配置支持的接口数组索引(从零开始)。 3bAlternateSetting1数字可选设置的索引值。 4bNumEndpoints1数字此接口用的端点数量,如果是零则说明此接口只用缺省控制管道。 5bInterfaceClass 1类接口所属的类值:零值为将来的标准保留。如果此域的值设为FFH,则此接口类由厂商说明。所有其它的值由USB 说明保留。 6bInterfaceSubClass 1子类子类码这些值的定义视bInterfaceClass域而定。如果bInterfaceClass域的值为零则此域的值必须为零。bInterfaceClass域不为FFH则所有值由USB 所保留。 7bInterfaceProtocol 1协议协议码:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一个接口支持设备类相关的请求此域的值指出了设备类说明中所定义的协议. 8iInterface 1索引描述此接口的字串描述表的索引值。对于bInterfaceClass字段,表示接口所属的类别,USB协议根据功能将不同的接口划分成不的类,其具体含义如下表所示:表11、USB协议定义的接口类别(bInterfaceClass)值(十六进制)类别0x01音频类0x02CDC控制类0x03人机接口类(HID)0x05物理类0x06图像类0x07打印机类0x08大数据存储类0x09集线器类0x0ACDC数据类0x0B智能卡类0x0D安全类0xDC诊断设备类0xE0无线控制器类0xFE特定应用类(包括红外的桥接器等)0xFF厂商定义的设备4、端点描述符端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点0(控制端点,一般一个设备只有一个控制端点)为双向端口外,其它均为单向。端点描述符描述了数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。除了描述符中描述的端点外,每个设备必须要有一个默认的控制型端点,地址为0,它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它来配置设备。表12、USB端点描述符的结构偏移量域大小值说明0bLength1数字此描述表的字节数长度1bDescriptorType1常量端点描述表类(此处应为0x05)2bEndpointAddress1端点此描述表所描述的端点的地址、方向:Bit 3.0 : 端点号.Bit 6.4 : 保留,为零Bit 7: 方向,如果控制端点则略。0:输出端点(主机到设备)1:输入端点(设备到主机)3bmAttributes1位图此域的值描述的是在bConfigurationValue域所指的配置下端点的特性。Bit 1.0 :传送类型00=控制传送01=同步传送10=批传送11=中断传送所有其它的位都保留。4wMaxPacketSize2数字当前配置下此端点能够接收或发送的最大数据包的大小。对于实进传输,此值用于为每帧的数据净负荷预留时间。在实际运行时,管道可能不完全需要预留的带宽,实际带宽可由设备通过一种非USB定义的机制汇报给主机。对于中断传输,批量传输和控制传输,端点可能发送比之短的数据包6bInterval1数字周期数据传输端点的时间间隙。此域的值对于批传送的端点及控制传送的端点无意义。对于同步传送的端点此域必需为1,表示周期为1ms。对于中断传送的端点此域值的范围为1ms到255ms。下表是一种鼠标的端点描述符的示例,该端点是一个中断端点:表13、一种鼠标的端点描述符示例域值(十六进制)bLength0x07bDescriptorType0x05bEndpointAddress0x81bmAttributes0x03wMaxPacketSize0x04bInterval0x0A5、字符串描述符字符串描述符是一种可选的USB标准描述符,描述了如制商、设备名称或序列号等信息。如果一个设备无字符串描述符,则其它描述符中与字符串有关的索引值都必须为0。字符串使用的是Unicode编码。主机请示得到某个字符串描述符时一般分成两步:首先主机向设备发出USB标准命令Get_Descriptor,其中所使用的字符串的索引值为0,设备返回一个字符串描述符,此描述符的结构如下:表14、USB字符串描述符(响应主机请求时返回的表示语言ID的字符串描述符)偏移量域大小值描述0bLength1N+2此描述表的字节数1bDescriptorType1常量字串描述表类型(此处应为0x03)2wLANGID02数字语言标识(LANGID)码0NwLANGIDx2数字语言标识(LANGID)码X该字符串描述符双字节的语言ID的数组,wLANGID0wLANGIDx指明了设备支持的语言,具体含义可查看USB_LANGIDs.pdf。主机根据自己需要的语言,再次向设备发出USB标准命令Get_Descriptor,指明所要求得到的字符串的索引值和语言。这次设备所返回的是Unicode编号的字符串描述符,其结构如下:表15、Unicode字符串描述符(响应主机请求时真正表示字符串编码的字符串描述符)偏移量域大小值描述0bLength1数字此描述表的字节数(bString域的数值N2)1bDescriptorType1常量字串描述表类型(此处应为0x03)2bStringN数字UNICODE 编码的字串bString域为设备实际返回的以UNICODE编码的字符串流,我们在编写设备端硬件驱动的时候需要将字符串转换为UNICODE编码,您可以通过一些UNICODE转换工具进行转换。一般的用户是不能理解USB设备方便的背后是工程师多么艰苦的工作。我觉得USB是一个很好的发展方向,必将是未来的主流设备通信方式,于是开始钻研USB协议。现学现卖,实例讲解一个USB鼠标从插入开始同PC之间的数据流,一来巩固复习,二来也方便新人学习。当然一些前置知识是必要的,可以从/OpenSource/Easy%20USB%2051%20Programer/Easy%20USB%2051%20Programer2.htm开始看起,我就是看了这些之后才大致有了感性认识,本文就是对其最后一部分的模仿。首先选择工具,Bus Hound是挺好的,可惜据说只能在win2000上才能抓到设备枚举之前的包,在我的win2003上就不行了,只得放弃。USB Monitor 5.x以上复杂得我不会用,只好用2.5版本的。建立一个新session,选择一个HID鼠标,然后开始抓包。第一步是要把鼠标拔下来,等到把拔下鼠标的数据也抓完后清空记录,再次插入鼠标,这样就得到了一个完整的鼠标枚举过程数据流。以下内容中的斜体代表抓到的数据。前两个包是PnP事件,还记得在QQ上疯狂群发的一个消息吗-xx黑客使用PnP技术攻破腾讯数据库云云真是TMD装B都没有技术含量000970: PnP Event: Query ID (UP), 17.10.2009 19:56:30.5781250 +24.9531250Hardware IDs: USBVid_15ca&Pid_00c3&Rev_0512, USBVid_15ca&Pid_00c3000971: PnP Event: Query ID (UP), 17.10.2009 19:56:30.5781250 +0.0Compatible IDs: USBClass_03&SubClass_01&Prot_02, USBClass_03&SubClass_01, USBClass_03这里开始出现了第一个数据包,是主机发给设备的(down),看不出到底发送了什么数据,只看出要求的返回数据长度是18个字节 (0x12 bytes)000972: Get Descriptor Request (DOWN), 17.10.2009 19:56:30.5781250 +0.0Descriptor Type: DeviceDescriptor Index: 0x0Transfer Buffer Size: 0x12 bytes紧接着就是USB鼠标的第一个回答000973: Control Transfer (UP), 17.10.2009 19:56:30.5781250 +0.0Pipe Handle: 0x89639b50 12 01 00 02 00 00 00 08 CA 15 C3 00 12 05 00 02 00 01.Setup Packet 80 06 00 01 00 00 12 00 .Recipient: DeviceRequest Type: StandardDirection: Device-HostRequest: 0x6 (GET_CONFIGURATION)Value: 0x100Index: 0x0Length: 0x12关于这个包要说的东西就多了其中Setup Packet 80 06 00 01 00 00 12 00 这个就是它响应的主机端请求,也就是刚刚主机端发过来的setup包里的内容。 长度是8个字节,对应下表表1、USB命令的结构偏移量域长度(字节)值描述0bmRequestType1位图请求特征:D7:传输方向0=主机至设备1=设备至主机D6.5:种类0=标准1=类2=厂商3=保留D4.0:接受者0=设备1=接口2=端点3=其他4.31 保留1bRequest1值命令类型编码值(见表3)2wValue2值根据不同的命令,含义也不同4wIndex2索引或偏移根据不同的命令,含义也不同,主要用于传送索引或偏移6wLength2如有数据传送阶段,此为数据字节数。下表列出了USB的11种标准命令表2、USB的11种标准命令命令bmRequestTypebRequestwValuewIndexwLengthDataClear_Feature00000000B00000001B00000010BCLEAR_FEATURE特性选择符零接口号端点号零无Get_Configuration10000000BGET_CONFIGURATION零零一配置值Get_Descriptor10000000BGET_DESCRIPTOR描述表种类(高字节,见表5)和索引(低字节)零或语言标志描述表长描述表Get_Interface10000001BGET_INTERFACE零接口号一可选设置Get_Status10000000B10000001B10000010BGET_STATUS零零(返回设备状态)接口号(对像时接口时)端点号(对象是端点时)二设备,接口 ,或端点状态Set_Address00000000BSET_ADDRESS设备地址零零无Set_Configuration00000000BSET_CONFIGURATION配置值(高字节为0,低字节表示要设置的配置值)零零无Set_Descriptor00000000BSET_DESCRIPTOR描述表种类(高字节,见表5)和索引(低字节)零或语言标志描述表长描述表Set_Feature00000000B00000001B00000010BSET_FEATURE特性选择符(1表示设备,0表示端点)零接口号端点号零无Set_Interface00000001BSET_INTERFACE可选设置接口号零无Synch_Frame100000010BSYNCH_FRAME零端点号二帧号其中bRequest为命令编码值,含意见表3:表3、USB标准命令的编码值bRequestValueGET_STATUS0CLEAR_FEATURE1为将来保留2SET_FEATURE3为将来保留4SET_ADDRESS5GET_DESCRIPTOR6SET_DESCRIPTOR7GET_CONFIGURATION8SET_CONFIGURATION9GET_INTERFACE10SET_INTERFACE11SYNCH_FRAME12表5、USB描述符的类型值类型描述符描述符值标准描述符设备描述符(Device Descriptor)0x01配置描述符(Configuration Descriptor)0x02字符串描述符(String Descriptor)0x03接口描述符(Interface Descriptor)0x04端点描述符(EndPont Descriptor)0x05类描述符集线器类描述符(Hub Descriptor)0x29人机接口类描述符(HID)0x21厂商定义的描述符0xFF 联合以上四张表,来分析80 06 00 01 00 00 12 00 这段数据包首先第一个字节80是位图,决定了第二个字节只能取某些值第二个字节06,查表三得知是GET_DESCRIPTOR命令。第3-4个字节是00 01 ,查表五得知是设备描述符(Device Descriptor),这就很好理解7-8字节的12 00 ,是要求返回的数据大小 表4、USB设备描述符的结构偏移量域大小值描述0bLength1数字此描述表的字节数1bDecriptorType1常量描述符的类型(此处应为0x01,即设备描述符)2bcdUSB2BCD码此设备与描述表兼容的USB设备说明版本号(BCD 码)4bDeviceClass1类设备类码:如果此域的值为0则一个设置下每个接口指出它自己的类,各个接口各自独立工作。如果此域的值处于1FEH之间,则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作。此值指出了这些接口集体的类定义。如果此域设为FFH,则此设备的类由厂商定义。5bDeviceSubClass1子类子类挖码这些码值的具体含义根据bDeviceClass 域来看。如bDeviceClass 域为零,此域也须为零如bDeviceClass 域为FFH,此域的所有值保留。6bDevicePortocol1协议协议码这些码的值视bDeviceClass 和 bDeviceSubClass 的值而定。如果设备支持设备类相关的协议,此码标志了设备类的值。如果此域的值为零,则此设备不支持设备类相关的协议,然而,可能它的接口支持设备类相关的协议。如果此域的值为FFH,此设备使用厂商定义的协议。7bMaxPacketSize01数字端点0的最大包大小(仅8,16,32,64为合法值)8idVendor2ID厂商标志(由USB-IF组织赋值)10idProduct2ID产品标志(由厂商赋值)12bcdDevice2BCD 码设备发行号(BCD 码)14iManufacturer1索引描述厂商信息的字符串描述符的索引值。15iProduct1索引描述产品信息的字串描述符的索引值。16iSerialNumber1索引描述设备序列号信息的字串描述符的索引值。17bNumConfigurations1数字可能的配置描述符数目 再来分析USB鼠标回应的数据包12 01 00 02 00 00 00 08 CA 15 C3 00 12 05 00 02 00 01正好对应表四的18个字节。 第一个字节bLenght的值为0x12,表示此描述符的长度。bDecriptorType的值为0x01,代表设备描述符。bcdUSB的值为0x0200,代表USB协议的版本号,此处2.0版,如果为0x0110则表示1.1版。bDeviceClass和bDeviceSubClass都为0,表示设备类别由接口描述符指定。bMaxPacketSize0为08,说明端点0只支持最大长度为8的数据包(刚刚够接收刚才那个数据包)CA 15 C3 00 分别是VID和PID字节顺序的问题,也很常见了剩下的内容也就那样了,参照图标就能翻译出来。这就是上位机驱动程序做的事,靠软件的复杂来实现硬件设计的简单。USB Monitor的高版本太复杂了,都不会用,这里还是使用2.5的老版本.新建session,选择新插入的HID鼠标开始抓包,拔掉鼠标,清空记录,再次插入鼠标,现在就抓到了USB鼠标枚举数据流要看懂这些数据流,需要/deep_pro/blog/item/3f97effa7048f814a9d31115.html/deep_pro/blog/item/0ca086af97ca15f1faed5016.html里给出的14个表要注意的是USB数据包通常是先发LSB,再发MSB,所以低字节在前,高字节在后。后面的讲解中2个字节长度以上的数据没有转换回高字节在前,低字节在后的顺序,保留了原始状态。首先是两个PnP事件000026: PnP Event: Query ID (UP), 18.10.2009 09:53:28.9218750 +4.2656250Hardware IDs: USBVid_15ca&Pid_00c3&Rev_0512, USBVid_15ca&Pid_00c3000027: PnP Event: Query ID (UP), 18.10.2009 09:53:28.9218750 +0.0Compatible IDs: USBClass_03&SubClass_01&Prot_02, USBClass_03&SubClass_01, USBClass_03接着主机发出了第一个包000028000028: Get Descriptor Request (DOWN), 18.10.2009 09:53:28.9375000 +0.0156250Descriptor Type: DeviceDescriptor Index: 0x0Transfer Buffer Size: 0x12 bytes在这里没有给出主机包里的具体内容,跟Bus Hound是不一样的。只能看出请求的是设备描述符,要求返回的长度是18个字节,偏移为0对应的,USB鼠标回答了这个请求000029: Control Transfer (UP), 18.10.2009 09:53:28.9375000 +0.0Pipe Handle: 0x8945776812 01 00 02 00 00 00 08 CA 15 C3 00 12 05 00 0200 01 .Setup Packet80 06 00 01 00 00 12 00 .Recipient: DeviceRequest Type: StandardDirection: Device-HostRequest: 0x6 (GET_CONFIGURATION)Value: 0x100Index: 0x0Length: 0x12这里可以看到主机刚才发给来的数据包80 06 00 01 00 00 12 00,结构上面提到的参考表一第一个字节80是位图,没什么大的作用,限制第二个字节的。第二个字节06参照表二表三得知是GET_DESCRIPTOR命令wValue:00 01 参照表5得知是设备描述符wIndex:00 00 偏移为0wLength:12 00 要求设备端返回18个字节再看看设备端的回答12 01 00 02 00 00 00 08 CA 15 C3 00 12 05 00 02 00 01,正好18字节设备描述符的结构参照表四,bLength:12 ,此设备描述符的长度是18字节bDecriptorType:01 ,参照表5得知是设备描述符bcdUSB:00 02 ,代表USB协议的版本号,此处2.0版bDeviceClass:00bDeviceSubClass:00,表述设备类码由接口文件给出,可能是为了每个接口独立实现不同的功能。bDevicePortocol:00,跟前两个字节紧密联系,这里指还是等待在接口文件里再说明使用的设备协议bMaxPacketSize0:08,指端点0最大可接受的包大小,真是够抠门的,刚刚够用。idVendor:CA 15 ,VID其实是0x15ca,字节序问题不在赘述idProduct:C3 00 ,PID 0x00c3,在/usb.ids查询得知 15ca Textech International Ltd. 00c3 Mini Optical Mouse,实物确实是一个mini鼠标bcdDevice:12 05,这个似乎没什么通用的意义iManufacturer:00,iProduct:02,iSerialNumber:00,bNumConfigurations:01这几个数字都是索引值,如果以后主机想向设备端索要这些字符串信息(包含在字符串描述符里),就用这些值填充wIndex第一个回合终于结束,由人工翻译真得很累啊主机可没歇着,又发送了一个包000030: Get Descriptor Request (DOWN), 18.10.2009 09:53:28.9375000 +0.0Descriptor Type: ConfigurationDescriptor Index: 0x0Transfer Buffer Size: 0x9 bytes这个包也看不出来什么,因为发送的数据信息在回复包里才有显示,直接看回复000031: Control Transfer (UP), 18.10.2009 09:53:28.9375000 +0.0Pipe Handle: 0x8945776809 02 22 00 01 01 00 A0 31 . 1Setup Packet80 06 00 02 00 00 09 00 .Recipient: DeviceRequest Type: StandardDirection: Device-HostRequest: 0x6 (GET_CONFIGURATION)Value: 0x200Index: 0x0Length: 0x9主机发送的数据80 06 00 02 00 00 09 00分析了刚才那个包,这个一眼就看出来了,还是GET_DESCRIPTOR命令,要求的是配置描述符(Configuration Descriptor),9个字节设备回复的数据09 02 22 00 01 01 00 A0 31,配置描述符见表8bLength:09bDescriptorType:02 这跟设备描述符都没什么区别wTotalLength: 22 00 ,表示包括此配置描述符、接口描述符、端点描述符和设备类及厂商定义的描述符的总长为0x0022=34个字节。bNumInterfaces: 01 ,支持的接口数为1bCongfigurationValue:01, SetConfiguration请求中用作参数来选定此配置iConfiguration:00,描述此配置的字串描述表索引bmAttributes:A0,10100000B,只看得出是D5: 远程唤醒 ,D7是保留位MaxPower:31,总线耗电量为49x2=98mA.第三个回合主机发送000032: Get Descriptor Request (DOWN), 18.10.2009 09:53:28.9375000 +0.0Descriptor Type: ConfigurationDescriptor Index: 0x0Transfer Buffer Size: 0x22 bytes设备响应000033: Control Transfer (UP), 18.10.2009 09:53:28.9531250 +0.0156250Pipe Handle: 0x8945776809 02 22 00 01 01 00 A0 31 09 04 00 00 01 03 0102 00 09 21 10 01 00 01 22 48 00 07 05 81 03 0400 0A . 1.!.H.Setup Packet80 06 00 02 00 00 22 00 .Recipient: DeviceRequest Type: StandardDirection: Device-HostRequest: 0x6 (GET_CONFIGURATION)Value: 0x200Index: 0x0Length: 0x2280 06 00 02 00 00 22 00,GET_DESCRIPTOR命令,要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2024年秋季版)2024年七年级道德与法治下册 3.6.1 集体生活邀请我说课稿 新人教版
- 光学的考试题目及答案
- 工程质量管理中数据分析方法的应用
- 高数开学考试题及答案
- 福建历史会考试题及答案
- MBTI类型与艺术设计学生自我表达方式的关系
- 2025《深圳市房屋建筑和市政基础设施工程劳务分包合同》
- 基础的护理试题及答案
- 2025年个体房屋租赁合同范本
- 文秘知识基础试题及答案
- 《传统书画装裱与修复中材料的选择与运用》
- 2024ESC心房颤动管理指南解读
- 防洪排涝工程合同范本有效
- 高血压病基层诊疗指南
- 医院视频监控系统维保方案
- 门诊护士课件教学课件
- 《大学生的人际关系》课件
- 职务侵占罪培训
- 中式烹调师技能等级认定四级理论知识试卷
- DB65-T 4784-2024 冰川范围调查技术规范
- 幼儿园礼仪小天使《借物品》教学课件
评论
0/150
提交评论