USB 命令及鼠标枚举过程(3)

2020-04-03 12:48

1 bDescriptorType 1 常量 字串描述表类型(此处应为0x03) 2 wLANGID[0] 2 数字 语言标识(LANGID) 码0 … N … … … … wLANGID[x] 2 数字 语言标识(LANGID) 码X 该字符串描述符双字节的语言ID的数组,wLANGID[0]~wLANGID[x]指明了设备支持的语言,具体含义可查看USB_LANGIDs.pdf。

主机根据自己需要的语言,再次向设备发出USB标准命令Get_Descriptor,指明所要求得到的字符串的索引值和语言。这次设备所返回的是Unicode编号的字符串描述符,其结构如下:

表15、Unicode字符串描述符(响应主机请求时真正表示字符串编码的字符串描述符) 偏移量 0 域 bLength 大小 1 值 数字 描述 此描述表的字节数(bString域的数值N+2) 1 bDescriptorType 1 常量 字串描述表类型(此处应为0x03) 2 bString N 数字 UNICODE 编码的字串 bString域为设备实际返回的以UNICODE编码的字符串流,我们在编写设备端硬件驱动的时候需要将字符串转换为UNICODE编码,您可以通过一些UNICODE转换工具进行转换。 一般的用户是不能理解USB设备方便的背后是工程师多么艰苦的工作。

我觉得USB是一个很好的发展方向,必将是未来的主流设备通信方式,于是开始钻研USB协议。

现学现卖,实例讲解一个USB鼠标从插入开始同PC之间的数据流,一来巩固复习,二来也方便新人学习。

当然一些前置知识是必要的,可以从

http://www.baiheee.com/OpenSource/Easy USB 51 Programer/Easy USB 51 Programer2.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.9531250 Hardware IDs: USB\\Vid_15ca&Pid_00c3&Rev_0512, USB\\Vid_15ca&Pid_00c3 000971: PnP Event: Query ID (UP), 17.10.2009 19:56:30.5781250 +0.0

Compatible IDs: USB\\Class_03&SubClass_01&Prot_02, USB\\Class_03&SubClass_01, USB\\Class_03

这里开始出现了第一个数据包,是主机发给设备的(down),看不出到底发送了什么数据,只看出要求的返回数据长度是18个字节 (0x12 bytes)

000972: Get Descriptor Request (DOWN), 17.10.2009 19:56:30.5781250 +0.0 Descriptor Type: Device Descriptor Index: 0x0

Transfer Buffer Size: 0x12 bytes

紧接着就是USB鼠标的第一个回答

000973: Control Transfer (UP), 17.10.2009 19:56:30.5781250 +0.0 Pipe 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: Device Request Type: Standard Direction: Device->Host

Request: 0x6 (GET_CONFIGURATION) Value: 0x100 Index: 0x0 Length: 0x12

.......

关于这个包要说的东西就多了 其中 Setup Packet

80 06 00 01 00 00 12 00 这个就是它响应的主机端请求,也就是刚刚主机端发过来的setup包

里的内容。 长度是8个字节,对应下表 表1、USB命令的结构 偏移量 域 长度(字节) 值 描述 请求特征: D7:传输方向 0=主机至设备 1=设备至主机 D6..5:种类 0=标准 0 bmRequestType 1=类 1 位图 2=厂商 3=保留 D4..0:接受者 0=设备 1=接口 2=端点 3=其他 4..31 保留 1 2 4 6 bRequest wValue wIndex wLength 1 2 2 2 值 值 命令类型编码值(见表3) 根据不同的命令,含义也不同 索引或偏根据不同的命令,含义也不同,主要用于传送索引或移 偏 移 如有数据传送阶段,此为数据字节数。 下表列出了USB的11种标准命令 表2、USB的11种标准命令 命令 bmRequestTypbRequest e Clear_Feature 00000000B 00000001B 00000010B Get_Configurat10000000B ion Get_Descriptor 10000000B GET_CONFIGURATION GET_DESCRIPT描述表种类零或语言OR (高字节,见标志 描述表长 描述表 零 CLEAR_FEATURE 特性选择符 零 接口号 端点号 零 一 配置值 零 无 wValue wIndex wLength Data 表5)和索引(低字节) Get_Interface 10000001B GET_INTERFAC零 E Get_Status 10000000B 10000001B 10000010B GET_STATUS 零 零(返回设二 备状态) 接口号(对像时接口时) 端点号(对象是端点时) Set_Address 00000000B SET_ADDRESS 设备地址 SET_CONFIGURATION 零 零 零 无 无 设备, 接口 ,或 端点状态 接口号 一 可选设置 Set_Configurat00000000B ion 配置值(高零 字节为0,低字节表示要设置的配置值) Set_Descriptor 00000000B SET_DESCRIPT描述表种类零或语言OR (高字节,标志 见表5)和索引(低字节) 描述表长 描述表 Set_Feature 00000000B 00000001B 00000010B SET_FEATURE 特性选择符零 (1表示设点) 接口号 备,0表示端端点号 零 无 Set_Interface 00000001B SET_INTERFAC可选设置 E 接口号 零 无 Synch_Frame 100000010B SYNCH_FRAME 零 端点号 二 帧号 其中bRequest为命令编码值,含意见表3: 表3、USB标准命令的编码值 bRequest GET_STATUS CLEAR_FEATURE 为将来保留 SET_FEATURE 为将来保留 SET_ADDRESS GET_DESCRIPTOR Value 0 1 2 3 4 5 6 SET_DESCRIPTOR GET_CONFIGURATION SET_CONFIGURATION GET_INTERFACE SET_INTERFACE SYNCH_FRAME 7 8 9 10 11 12 表5、USB描述符的类型值 类型 描述符 设备描述符(Device Descriptor) 配置描述符(Configuration Descriptor) 描述符值 0x01 0x02 0x03 0x04 0x05 0x29 0x21 0xFF 标准描述符 字符串描述符(String Descriptor) 接口描述符(Interface Descriptor) 端点描述符(EndPont Descriptor) 集线器类描述符(Hub Descriptor) 类描述符 人机接口类描述符(HID) 厂商定义的描述符 联合以上四张表,来分析80 06 00 01 00 00 12 00 这段数据包 首先第一个字节80是位图,决定了第二个字节只能取某些值

第二个字节06,查表三得知是GET_DESCRIPTOR命令。第3-4个字节是00 01 , 查表五得知是设备描述符(Device Descriptor),

这就很好理解7-8字节的12 00 ,是要求返回的数据大小 表4、USB设备描述符的结构 偏移量 0 1 2 域 bLength bDecriptorType bcdUSB 大小 1 1 2 值 数字 常量 此描述表的字节数 描述符的类型(此处应为0x01,即设备描述符) 描述 BCD码 此设备与描述表兼容的USB设备说明版本号(BCD 码) 4 bDeviceClass 1 类 设备类码: 如果此域的值为0则一个设置下每个接口指出它自己的类,各个接口各自独立工作。 如果此域的值处于1~FEH之间,则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作。此值指出了这些接口集体的类定义。 如果此域设为FFH,则此设备的类由厂商定义。 5 bDeviceSubClass 1 子类 子类挖码


USB 命令及鼠标枚举过程(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:电子测量的练习题与答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: