用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx

上传人:b****5 文档编号:3353023 上传时间:2022-11-22 格式:DOCX 页数:20 大小:1.31MB
下载 相关 举报
用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx_第1页
第1页 / 共20页
用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx_第2页
第2页 / 共20页
用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx_第3页
第3页 / 共20页
用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx_第4页
第4页 / 共20页
用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx

《用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx》由会员分享,可在线阅读,更多相关《用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx(20页珍藏版)》请在冰豆网上搜索。

用USB Monitor监视USB枚举配置识别过程USB枚举过程分析.docx

用USBMonitor监视USB枚举配置识别过程USB枚举过程分析

搭个简单电路验证USB主机是如何检测USB设备的插入和拨出动作的

------分隔线----------------------------

  USB设备是一种即插即用设备,即插即用的英文缩写为PNP(PlugandPlay),在不用关主机的情况即可直接拨插USB设备,而且插上即可使用,那么USB主机是如何检测USB设备的插入和拨出动作的呢?

  总结来说USB主机是通过监视USB端口上的电压变化来判断设备的插入和拨出动作的。

  USB集线器端口的两根信号线D+和D-(《USB物理模型简介》一文有介绍)的每一根都有15kΩ的下拉电阻,而在设备端,在D+或D-上接了1.5kΩ的上拉电阻,当未插入设备时,即集线器的端口悬空时,两根信号线都被下拉电阻拉到了低电平。

当USB设备插入时,由于上拉电阻的存在,由1.5K的上拉电阻和15K的下拉电阻分压,两要信号线中有一根被拉到了高电平,集线器检测到这个状态后,它就报告给USB主控制器(或者通过它上一层的集线器报告给USB主控制器),这样就检测到设备的插入了。

对于全速和高速设备,上拉电阻是接在D+上的,而低速设备则是上拉电阻接在D-上的,集线器通过判断哪根线被拉高来区分是低速设备还是全速和高速设备。

USB高速设备先是被识别为全速设备,然后通过主机和设备两者之间的数据通讯进一步确认,再切换到高速模式的。

在高速模式下,是电流传输模式,这时会将D+上的上拉电阻断开。

当USB主机检测设备的插入后,主机将会向设备发出一系列枚举请求,设备作出正确响应来完成USB设备枚举过程。

  我们做个简单的实验,自已搭一个电路,只用一个上拉电阻接在USB的+5V(VBUS)和D+或者D-上,这个电路插入电脑上的USB端口后同样会提示发现USB设备,只是不能安装驱动程序而已(因为安装驱动力程序需要设备枚举过后,设备枚举过程需要USB设备对主机发来的命令请求数据包作出正确的回复),这时打开设备管理器看看,有显示未知USB设备,并且其VID和PID为0,根据这个,我们可以简单的判断设备是否枚举成功。

电路图如下:

 

 

图1 USB插入检测实验电路

 

  下面我们来搭这个电路,如果手上没有USB插座,可以用一根USB电缆,一头剪掉,记得插电脑那头扁平接头连线不要留得太短,将一个1.5K电阻焊到上VBUS和D+之间即可,如如何找出USB电缆里这两根线的位置呢,请看下面图所示:

 

 

图2 USB电缆及插头信号定义

  这里介绍另一种方法,如果您的手上有USB插座的话,这种方法不用把USB电剪断,所以建议使用下面的方法。

这种方法直接把电阻焊到另外准备的USB插座上,各种类型USB插座信号脚定义如下所示:

 

 

图3 USB插座引脚编号(电气含义见图2)

   在USB插座的VBUS和D+(即第1和第3脚)之间焊上1.5K电阻后的效果(我用的是贴片电阻):

 

 

图3在USB-B插座上搭个电阻做USB设备插入检测实验

  然后把这个电路插入电脑主机,Windows真的发现有USB设备插入电脑了,只是不能安装驱动程序而已,如下图所示:

 

 

图4 Windows真的发现这个假的USB设备了

  打开设备管理器查看这个假的USB设备,发现PID和VID都为0,这也是判断USB枚举成功与否的标志。

 

图5 USB插入检测实验-查看PID和VID 

用USBMonitor监视USB枚举(配置、识别)过程(USB枚举过程分析

------分隔线----------------------------

  这是原来发表在百合电子工作室主站的,现在由于成立了百合电子工作室的USB专题站(USB开发网),所以将这篇文章移到了这里,除了本文介绍的用USBMonitor监控USB枚举过程,分析USB枚举过程外,由于大部分网友对bushound使用比较熟悉,所以USB开发网还另外发表了一篇《用BUSHOUND监视USB枚举(配置、识别)过程(USB枚举过程分析)》。

准备工具

  在发表此文之前,网上讲的监控USB通信都是介绍的bushound,这里我们介绍另一个工具:

USBMonitor。

USBMonitor可以监控到USB枚举初始阶段一些数据,不过这些数据对于大多数开发人员来说不需要去关心,另外USBMonitor还可以对截获的数据进行简单解析,给出其含义。

用USBMonitor的缺点是目前好像还找不到它的破解版,只能试用大约一个月的时间,不过已经够了。

 

∙USBMonitor2.26

∙优盘一个

USBMonitor的安装

  非常简单,安装一路next下去即可,安装完成后将会提示您重新启动系统,照做。

监控设置

1、运行安装好后的USBMonitor,点击菜单“File”→“NewSession”

 2、在弹出的对话框中点“下一步”

3、在“MonitoringSessionType”对话框中选择“USBMonitor”后点下一步

后面的几步比较重要,决定是否能正确监控USB枚举过程。

4、在“ConfiguratingtheUSBMonitor”对话框中提示的是选择哪一个USB设备需要监视,如果这时您还没有将任何USB设备插入主机(电脑),将显示出多项“USBRootHub”,且无下级没有分支,我们怎么知道应该选择哪一项呢?

请看第5步﹍

5、将您需要监控的USB设备插入主机USB端口,这时将会在某在项后面多出一些内容,如下图所示,我这里选择“USBMassStorage”。

 6、在“ConfigureDataProcessing”对话框中选择“RequestView”并点下一步

7、弹出并拨下您的优盘,这时USBMonitor监视窗口里已经监视到了一些数据,这时拨出时USB数据通信,我们不需要分析,在USBMonitor主界面里点“Edit”->“ClearView”,如下图所示

8、插入您的优盘,记得一定要插在同一USB插口哟!

此时USBMonitor会检测到许多的数据流,我们切换到Complete标签查看更详细的信息,如下图所示:

 

 分析USB枚举过程

  通过以上的操作后,我们现在可以对USBMonitor监测到的数据进行分析了。

1、按“Ctrl+F”,查找第一个“DescriptorRequest”,从这里开始是对我们分析USB枚举过程有用的信息。

2、首先了解一下USBMonitor显示的数据结构,如下图所示是USBMonitor截获的一个完整的输入输出(主机发给设备的是输出,设备发给主机的是输入)数据:

①序列号,可理解为一个上行或下行数据流标号,无实际意义

②命令类型,括号里的“Down”代表输出数据,即主机到设备

③命令数据流,出现“SetupPacket”后面,十六进制

④USBMonitor对命令数据的简单分析

⑤传输类型,括号里的UP代表输入数据,即设备到主机

⑥设备返回的数据流,十六进制

⑦对命令(请求)数据的详略分析(其中对“Request”的分析应该有BUG,0x6应为Get_Descriptor,而USBMonitor解释为Get_Configuration)

以上没有看到对上行数据(设备返回的数据)的分析,我们只要将鼠标停留在设备返回数据处(上图所示标记⑥),就会弹出对上行数据的分析画面,如下图所示:

3、USB枚举过程分析

1)、主机第一次发出请求描述符命令,数据流为:

8006000200000900,bRequest的值为0x06,代表Get_Descriptor命令,但为什么描述符呢?

wValue的高字节表示了描述符的类型,此处wValue的值为0x0100,所以高字节为0x01,代表设备描述符(见《USB命令请求及描述符详解(速查手册)》中表5);设备返回的数据为:

120100020000004051090E16000201020301,第一个字节bLenght的值为0x12,表示此描述符的长度。

第二个字节bDecriptorType的值为0x01,代表设备描述符。

bcdUSB的值为0x0200,代表USB协议的版本号,此处2.0版,如果为0x0110则表示1.1版。

bDeviceClass和bDeviceSubClass都为0,表示设备类别由接口描述符指定。

bDevicePortocol的值为0,但并不代表它不支持USB定义的标准设备类协议,因为此时可由接口描述符指明设备支持的协议。

bMaxPacketSize0的值为0x40,表示端点0的数据包最大长度为64字节。

iManufacturer、iProduct和iSerialNumber的分别为0x01、0x02和0x03,表示字符串索引,在主机读取字符串的命令中将以这几个值来填充wIndex字段。

        请求设备描述符的数据流

2)、主机再次发出请求描述符指令,数据流为:

8006000200000900,wValue的高字节为0x02表示配置描述符,表示请求配置描述符,wLength的值为0x0009,表示要求返回的数据长度为9个字节。

这次设备返回的数据只有9个字节:

090220000101008032,第一位数为bLeng域,其值为0x09,代表此描述符的长度。

bDecriptorType的值为0x02,表示配置描述符。

wTotalLength的值为0x0020,表示包括此配置描述符、接口描述符、端点描述符和设备类及厂商定义的描述符的总长为32个字节。

bNumInterfaces的值为0x01,表示该配置支持1个接口。

MaxPower的值为0x32,表示总线耗电量为50×2=100mA。

        第一次请求配置描述符的数据流

3)、主机第一次请求设备的配置描述符后得知包括配置描述符、接口描述符、端点描述符等在内的描述总长为32个字节后,这此主机再次发出请求配置描述指令,这次命令与上一个命令只有wLength字段的值不一样,这次wLength的值为0x20,表示要求设备返回32个字节,正好和上次命令中设备返回的wTotalLength信息一致。

设备返回的数据流为如下图所示,USBMonitor已经将配置描述符、接口描述符、和端点描述符用不同的背景色区分开来,鼠标停留在不同的区域将弹出对此描述符的具体分析。

第一个描述符的数据为:

090220000101008032,和上一次请求配置描述符得到的数据一模一样,这里不再分析。

第二个描述符的数据为:

090400000208065000,bLength为0x09表示此描述符为9个字节,bDescriptorType的值为0x04表示接口描述符,bInterfaceNumber为0x00表示此配置接口的索引值。

bNumEndpoint的值为0x02表示此接口端点数为两个。

bInterfaceClass的值为0x08表示大数据存储类(见《USB命令请求及描述符详解(速查手册)》中表11),bInterfaceSubClass的值为0x06,其含义因bInterfaceClass的不同而不同,由于此处bInterfaceClass的值指定了此设备属大数据存储类,所以需要查看大数据存储类(Massstorageclassdevice)相关协议标准,经查询得知bInterfaceSubClass为0x06时代表传输协议工业标准为SCSI。

bInterfaceProtocol的值为0x50,大数据存储类协议规定其含义为通讯方式为批量传输(Bulk-only)。

        第二次请求配置描述符的数据流

4)、在请求完配置描述符后,主机发出请求字符串描述符指令。

请求字符描述符分两大步,每大步又分两小步,两大步为:

先请求字符串描述符语言ID(此时wIndex的值设为零),再请求UNICODE编码的字符串描述符。

不管是请求语言ID还是UNICODE编码的字符串描述符,都要分成两小步:

先请求设备返回相应字符串描述符的前两个字节,第一个字节代表了此字符串描述符的长度,主机根据这个长度再次请求相应字符串描述符,这次得到整个字符串描述符。

首先取得语言ID的前两个字节,数据流为:

800600030000 0200,wValue的高字节为0x03,表示字符串描述符。

wIndex的值为0x0000,表示读取语言ID。

wLength为0x0002要求设备返回2个字节数据。

设备返回的数据为0403,第一个字节为0x04表示语言ID字符串描述符长度为4个字节。

5)、主机根据上次读取的语言ID字符串描述符长再次读取此描述符,这次读出全部语言ID描述符。

主机发出的数据流为:

8006000300000400,其中wValue的高字节为0x03,表示字符串描述符,wIndex的值为0x00,表示读取语言ID。

wLength为0x0004要求设备返回4个字节数据。

设备返回的数据流为:

04030904,bLength的值为0x04表示此描述符长度为4个字节,bDescriptorType的值为0x03表示字符串描述符。

wLANGUID的值为0x0409,表示英语。

 

6)、读取完字符串描述符支持的语言ID后将读取UNICODE编码的字符串描述符,同读取语言ID一样,主机同样会分两步读取。

主机发出的命令数据流为:

8006030309040200,wValue的高字节为0x03,表示字符串描述符,低字节为0x03,表示读取索引为3的字符串描述符(在第1步读取的设备描述中iSerialNumber字符串的索引为3,所以这里实际读取的是设备序列号)。

wIndex的值为0x0409,表示语言ID。

wLength的值为0x0002,表示要求设备返回此描述符的前两个字节。

设备返回的数据流为:

3203,第一个字节的值为0x32表示此字符串描述符的长度为50个字节。

7)、在取得UNICODE字符串描述符的长度后,主机根据这个长度读取整个UNICODE字符串描述符。

主机发出的命令数据流为:

8006030309043200,wValue的高字节为0x03,表示字符串描述符,低字节为0x03表示读取索引为3的字符串描述符。

wIndex的值为0x0409表示语言ID。

wLength的值为0x0032,表示要求设备返回50个字节的数据。

设备返回的数据从第三个字节开始为Unicode编码的字符串,这里返回的字符串是:

20070620000000005918B19E

 

8)、在读取完字符串描述符后,主机发出Set_Configuration选择配置索引以激活这个设备的一个配置,然后设备对这一命令作出回应。

(不知为何USBMonitor对这此命令的数据流没有显示出来)

9)、主机发出Set_Interface指令激活设备的某个接口,然后设备对此指令作出回应。

 10)、以上为所有USB设备枚举过程中都会经历的过程,后续的配置过程将根据不同的设备分类(见《USB命令请求及描述符详解(速查手册)》中表6)而有所不同。

下图所示为此实验所用优盘的后续配置过程的一部分。

对于具体设备类相关协议规定的枚举过程就不作分析了,请大家参考相关设备类协议。

 

  大家在分析数据的时候请多多参考《USB命令请求及描述符详解(速查手册)》一文,一般第一次看本文可能看不太明白,可以在以后的USB设计过程中回过头来看本文及《》《USB命令请求及描述符详解(速查手册)》一文。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1