找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12495|回复: 1
打印 上一主题 下一主题
收起左侧

USB 枚举的具体过程详细说明

[复制链接]
跳转到指定楼层
楼主
ID:94349 发表于 2015-11-10 01:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USB的的监控用得较多的是BUSHund,但是这个BUSHound这家伙不能监控USB的枚举,我们使用USBMonitor就能很好地实现这一过程。

工具:
USB Monitor 2.26
USB 移动硬盘
personal Computer

软体的安装:
这个问题难度不大,一般下载完成后,一路解压缩即可,最后点击完成,安装OK!

监控USB的枚举:
1.启动安装好后的USB Monitor,点击“file”,“new Session”,如图:

2.在弹出的对话窗口中选择“下一步”,如图:


3.在“Monitoring Session Type”对话框中选择“USB Montitor”,点击下一步,如图:


4.在“configurating The USBMonitor”对话框中选择你需要见识的USB口,如果这是你还没有将任何USB设备插入主机,将显示如下界面:


5.将需要监控的USB设备插入主机USB接口,这是将会在某选项的后面多出一些内容,如下图所示,此处选择"USB MassStorage".
tips:当我们要监控我们自己开发的设备时,可以瞎弄一个U盘插入其中一个USB接口,在此步中选择我么能插入的U盘,在实际检测过程中,将我们开发的USB设备插入这个USB接口即可!


6.在“Configure Data Processing”对话框中选择“Request View”,并点击下一步:


7.弹出你的U盘,然后在USB Monitor主界面里点“Edit”->"Clear View",如下图所示:

8.插入你的U盘,记得徐插在同一USb接口,!此时,USBMonitor会监测到许多数据流,我们切换到Complete标签,如图:


以下是USB 设备枚举的分析过程:
通过以上操作以后,我们可以对USB Monitor监测到的数据进行分析了,如下:
1.按“CTRL+F”,查找第一个“Descriptor Request”,从此处开始是对我们有用的信息:如图:


2.对USB Monitor 现实的数据进行分析:

①序列号,可理解为一个上行或者下行数据流标号,无实际意义
②命令类型,括号里的“Down”代表输出数据,即主机到设备
③命令数据流,出现“Setup Pocket”后面,十六进制
④对命令数据的简单分析
⑤传输类型,括号里的“Up”代表输入数据,及设备到主机
⑥设备返回的数据流,十六进制
⑦对命令(请求)数据的详略分析(其中对“Request”的分析应该有BUG,0X6应为Get_Descriptor,而USb Monitor 解释为Get_Configuration)

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


3.枚举过程分析
a.主机第一次发出请求描述符命令,数据流为:
80 06 00 02 00 00 0900    bRequest的值为0X06,代表Get_Descriptor命令
但为什么描述符呢?
wValue的高字节表示了描述符的类型,
此处的wValue值为0X0100,所以高字节为0X01,代表设备描述符!!
设备返回的数据为:12 01 00 02 00 00 00 40 51 09 0E16 00 02 01 02 0301   
bLength的值为0X12,表示此描述符的长度
bDescriptorType的值为0X01,代表设备描述符
bcdUSb的值为0X0200,代表USB协议的版本号,此处2.0版,入股欧威0X0110则表示1.1版
bDeviceClass和bDeviceSubClass读为0,表示设别类别有接口描述符指定,
bDeviceProtoco值为0,但并不代表它不支持USb定义的标准设备类协议,因为此时可有接口描述符指明设备支持的协议
bMaxPocketsize0的值为0X40,表示端点0的数据包最大长度为64字节
iManufacturer、iProduct和iSeriousNumber的值分别为0X01、0X02和0X03,表示字符串索引在主机读取字符串的命令中,将以这几个值来填充wIndex字段


b.主机再次发出请求描述符指令,数据流为:
80 06 00 02 00 00 09 00
wValue的高字节为0x02表示配置描述符,表示请求配置描述符
wLength的值为0x0009,表示要求返回的数据长度为9个字节。
这次
设备返回的数据只有9个字节:
09 02 20 00 01 01 00 80 32
第一位数为
bLeng域,其值为0x09,代表此描述符的长度。
bDecriptorType的值为0x02,表示配置描述符。
wTotalLength的值为0x0020,表示包括此配置描述符、接口描述符、端点描述符和设备类及厂商定义的描述符的总长为32个字节。
bNumInterfaces的值为0x01,表示该配置支持1个接口。
MaxPower的值为0x32,表示总线耗电量为50×2=100mA


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


USB Monitor已经将配置描述符、接口描述符、和端点描述符用不同的背景色区分开来,鼠标停留在不同的区域将弹出对此描述符的具体分析。
第一个描述符的数
据为:09 02 20 00 01 01 00 8032
和上一次请求配置描述符得到的数据一模一样,这里不再分析。
第二个描述符的数据为:
09 04 00 00 02 0806 50 00
bLength0x09表示此描述符为9个字节
bDescriptorType的值为0x04表示接口描述
bInterfaceNumber0x00表示此配置接口的索引值。
bNumEndpoint的值为0x02表示此接口端点数为两个。
bInterfaceClass的值为0x08表示大数据存储类
bInterfaceSubClass的值为0x06,其含义因bInterfaceClass的不同而不同,
由于此处
bInterfaceClass的值指定了此设备属大数据存储类,
所以需要查看大数据存储类
(Mass storageclass device)相关协议标准,经查询得知:
bInterfaceSubClass0x06时代表传输协议工业标准为SCSI
bInterfaceProtocol的值为0x50
大数据存储类协议规定其含义为通讯方式为批量传输
(Bulk-only)


d.请求完配置描述符后,主机发出请求字符串描述符指令。
请求字符描述符分两大步,每大步又分两小步,
两大步为:
先请求字符串描述符语言
ID(此时wIndex的值设为零),再请求UNICODE编码的字符串描述符。
不管是请求语言
ID还是UNICODE编码的字符串描述符,都要分成两小步:
先请求
设备返回相应字符串描述符的前两个字节,第一个字节代表了此字符串描述符的长度,主机根据这个长度再次请求相应字符串描述符,这次得到整个字符串描述符。
先取得语言ID的前两个字节,数据流为:
80 06 00 03 00 00 0200
wValue的高字节为0x03,表示字符串描述符。
wIndex的值为0x0000,表示读取语言ID
wLength0x0002要求设备返2个字节数据。
设备返回的数据为
0403,第一个字节为0x04表示语言ID字符串描述符长度为4个字节。


e.
主机根据上次读取的语言ID字符串描述符长再次读取此描述符,
这次读出全部语言ID描述符。主机发出的数据流为:
80 06 00 03 00 00 04 00
其中wValue的高字节为0x03,表示字符串描述符,
wIndex的值为0x00,表示读取语言ID。
wLength为0x0004要求设备返回4个字节数据。设备返回的数据流为:04 03 09 04,
bLength的值为0x04表示此描述符长度为4个字节,
bDescriptorType的值为0x03表示字符串描述符。
wLANGUID的值 为0x0409,表示英语


f.取完字符串描述符支持的语言ID后将读取UNICODE编码的字符串描述符,
同读取语言
ID一样,
主机同样会分两步读取。主机发出的命令数据流为:
80 06 0303 09 04 02 00
wValue的高字节为0x03,表示字符串描述符,
低字节为
0x03,表示读取索引为3的字符串描述符(在第1步读取的设备描述中iSerialNumber字符串的索引为3
所以这里实际读取的是设备序列号
)
wIndex
的值为0x0409,表示语言ID
wLength的值为0x0002,表示要求设备返回此描述符的前两个字节。
设备返回的数据流为:
3203,第一个字节的值为0x32表示此字符串描述符的长度为50个字节。


g.取得UNICODE字符串描述符的长度后,
主机根据这个长度读取整个
UNICODE字符串描述符。
主机发出的命令数据流为:

80 06 03 03 09 04 32 00
wValue的高字节为0x03,表示字符串描述符,低字节为0x03表示读取索引为3的字符串描述符。
wIndex的值为0x0409表示语言ID
wLength的值为0x0032,表示要求设备返回50个字节的数据。
设备返回的数据从第三个字节开始为
Unicode编码的字符串,
这里返回的字符串
是:20070620000000005918B19E


h.在读取完字符串描述符后,主机发出Set_Configuration选择配置索引以激活这个设备的一个配置,
然后设备对这一命令作出回应。
(不知为何USBMonitor对这此命令的数据流没有显示出来)



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


j.以上为所有USB设备枚举过程中都会经历的过程,
后续的配置过程将根据不同的设备分类

(
见《USB开发基础--USB命令(请求)和USB描述符》中表6)而有所不同。
下图所示为此实验所用优盘的后续配置过程的一部分。
对于具体设备类相关协议规定的枚举过程就不作分析了,请大家参考相关设备类协议。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:64089 发表于 2015-11-11 18:19 | 只看该作者
分析的非常好,对于想学习USB的来说确实很实用哦!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表