网站导航:首页开源项目 USB开源项目:Easy USB 51 Programer  

目录导航

   
  1、项目简介
USB开发基础
1、USB接口的优点及开发难易度
2、USB设备的开发流程
3、USB接口芯片(USB控制器)的选择
4、了解USB的通讯过程
5、USB命令(请求)和USB描述符
6、实例讲解USB的枚举(配置)过程
准备工作
1、需要哪些工具
2、电路原理图
3、手工制作您的电路板
4、测试您的硬件
HID设备类
1、让PC机找到我们的硬件
2、如何成为一个HID设备(模拟鼠标)
3、如何成为一个HID设备(模拟键盘)
4、如何与HID设备通讯(一)
5、如何与HID设备通讯(二)
6、51编程器的实现
Windows USB 驱动程序(自定义设备)
1、Windows驱动开发基础
2、开发环境配置
3、第一个实例-Hello Wdm(一)
4、第一个实例-Hello Wdm(二)
5、真正的实例—驱动我们的实验板
6、真正的实例—测试驱动程序
7、真正的实例—控制LED及读取按键状态
8、如何编写应用程序
   

相关产品    淘宝网店
     
 

 
  更多...  
 
 
实例讲解USB的枚举(配置)过程 查看/参与此开源项目相关讨论
 

所需要工具

  网上大量介绍用bus hound作监控软件,我们为什么不选bus hound而选USB Monitor呢,因为bus hound在WindowsXP环境不能监控USB枚举(配置)过程,它只有在Windows2000下才能实现这个功能。不过用bus hound做除枚举以外的数据分析还是比较好用的。USB Monitor的唯一缺点是找不到它的破解版,只能试用大约一个月的时间。

USB Monitor的安装

  下载USB Monitor2.26, 安装一路next下去即可,安装完成后将会提示您重新启动系统。

启动您的USB Monitor

1、运行安装好后的USB Monitor,点击“File”→“New Session”

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

3、在“Monitoring Session Type”对话框中选择“USB Monitor”后点下一步

4、在“Configurating the USB Monitor”对话框中提示您选择哪一个USB设备需要监视,如果这时您还没有将任何USB设备插入主,将显示如下界面,我们怎么知道应该选择哪一项呢?请看第5步﹍

5、将您需要监控的USB设备插入主机USB端口,这时将会在某在项后面多出一些内容,如下图所示,我这里选择“USB Mass Storage”。小技巧:当我们要监控我们自己开发的设备时,可以先用一个优盘插入其中一个USB端口,在此步中选择我们插入的优盘,在实际监测过程中将我们开发的USB设备插入这个USB插口即可。

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

7、弹出您的优盘,然后在USB Monitor主界面里点“Edit”->“Clear View”,如下图所示

8、插入您的优盘,记得一定要插在同一USB插口哟!此时USB Monitor会检测许多的数据流,我们切换到Complete标签,如下图所示:

 

 分析USB设备的枚举过程

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

1、按“Ctrl + F”,查找第一个“Descriptor Request”,从这里开始是对我们有用的信息。

2、对USB Monitor显示的数据结构进行分析:

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

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

3、枚举过程分析

1)、主机第一次发出请求描述符命令,数据流为:80 06 00 02 00 00 09 00,bRequest的值为0x06,代表Get_Descriptor命令,但为什么描述符呢?wValue的高字节表示了描述符的类型,此处wValue的值为0x0100,所以高字节为0x01,代表设备描述符(见《USB开发基础--USB命令(请求)和USB描述符》中表5);设备返回的数据为:12 01 00 02 00 00 00 40 51 09 0E 16 00 02 01 02 03 01,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)、主机再次发出请求描述符指令,数据流为: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。


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

3)、主机第一次请求设备的配置描述符后得知包括配置描述符、接口描述符、端点描述符等在内的描述总长为32个字节后,这此主机再次发出请求配置描述指令,这次命令与上一个命令只有wLength字段的值不一样,这次wLength的值为0x20,表示要求设备返回32个字节,正好和上次命令中设备返回的wTotalLength信息一致。设备返回的数据流为如下图所示,USB Monitor已经将配置描述符、接口描述符、和端点描述符用不同的背景色区分开来,鼠标停留在不同的区域将弹出对此描述符的具体分析。第一个描述符的数据为:09 02 20 00 01 01 00 80 32,和上一次请求配置描述符得到的数据一模一样,这里不再分析。第二个描述符的数据为:09 04 00 00 02 08 06 50 00,bLength为0x09表示此描述符为9个字节,bDescriptorType的值为0x04表示接口描述符,bInterfaceNumber为0x00表示此配置接口的索引值。bNumEndpoint的值为0x02表示此接口端点数为两个。bInterfaceClass的值为0x08表示大数据存储类(见《USB开发基础--USB命令(请求)和USB描述符》中表11),bInterfaceSubClass的值为0x06,其含义因bInterfaceClass的不同而不同,由于此处bInterfaceClass的值指定了此设备属大数据存储类,所以需要查看大数据存储类(Mass storage class device)相关协议标准,经查询得知bInterfaceSubClass为0x06时代表传输协议工业标准为SCSI。bInterfaceProtocol的值为0x50,大数据存储类协议规定其含义为通讯方式为批量传输(Bulk-only)。


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

4)、在请求完配置描述符后,主机发出请求字符串描述符指令。请求字符描述符分两大步,每大步又分两小步,两大步为:先请求字符串描述符语言ID(此时wIndex的值设为零),再请求UNICODE编码的字符串描述符。不管是请求语言ID还是UNICODE编码的字符串描述符,都要分成两小步:先请求设备返回相应字符串描述符的前两个字节,第一个字节代表了此字符串描述符的长度,主机根据这个长度再次请求相应字符串描述符,这次得到整个字符串描述符。

首先取得语言ID的前两个字节,数据流为:80 06 00 03 00 00 02 00,wValue的高字节为0x03,表示字符串描述符。wIndex的值为0x0000,表示读取语言ID。wLength为0x0002要求设备返回2个字节数据。设备返回的数据为04 03,第一个字节为0x04表示语言ID字符串描述符长度为4个字节。

5)、主机根据上次读取的语言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,表示英语。

 

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

7)、在取得UNICODE字符串描述符的长度后,主机根据这个长度读取整个UNICODE字符串描述符。主机发出的命令数据流为:80 06 03 03 09 04 32 00,wValue的高字节为0x03,表示字符串描述符,低字节为0x03表示读取索引为3的字符串描述符。wIndex的值为0x0409表示语言ID。wLength的值为0x0032,表示要求设备返回50个字节的数据。设备返回的数据从第三个字节开始为Unicode编码的字符串,这里返回的字符串是:20070620000000005918B19E

 

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

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

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

 
 
 
本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4