usb设备枚举过程

文章来自:http://hi.baidu.com/nirvana68/item/bdaa30163a7d1c751009b5a9

//*****************************************************************************

作者:Eragon

//*****************************************************************************

    当我们通过usb协议大体了解了usb描述符和标准请求后,我们就有了解usb枚举过程的基础,在看完usb枚举过程之后,我们要明白一个问题,就是主机是怎么认识usb设备的
首先,主机是usb通信的发起者,usb设备只能被动接受命令。

下面的枚举过程通过bushound可以探测到,对于bushound的使用,一搜一片。

usb控制器与集线器都在机箱里,集线器检测到了新设备信号,它先要和usb控制器商量一下,下面是商量的内容:
1.主机的集线器检测新设备
电脑主机的主板上都会有几个集线器,每个集线器都会有多个usb口,usb口就是我们肉眼看到的机箱外部的usb插口。主机集线器轮巡每个端口的信号电压,当有新设备接入usb口时就会察觉。原因在于集线器端口的两根信号线的每一根都有一个15KΩ的下拉电阻,每一个设备在D+线上都有一个1.5KΩ的上拉电阻。当总线将主机和设备接通后,设备的上拉电阻使信号线上的电位升高,此时主集线器就会检测到这个信号。
2.报告集线器事件
当检测到接入信号后,集线器用中断来报告给主机usb控制器(简称主机),控制器知道后,给集线器发送一个Get_Status请求,集线器告诉主机新设备是什么时候连接到主机上的。
3.重新设置新设备
当主机确定此时有新设备后,主机给集线器发送一个Set_Feature请求,集线器使得usb数据线处于reset状态至少10ms
4.重发Get_Status请求
主机重发Get_Status请求以检查设备是否真的处于重启态。当集线器释放重启态后,设备进入默认态,此时可以通过端点0进行控制传输了,使用默认地址0x0与主机通信。
5.集线器通过D+/D-信号线在空闲时电压的高低来断定usb此时是全速还是低速。

好了,控制器与集线器商量了一会,心里有底了,现在可以询问设备了
1.主机向端点0发送获取设备描述符请求,在有限时间内等待usb设备回答,不管usb设备此时返回多少字节,主机只读前8个字节
,如果等待几ms设备没有反应,会持续三次
2.主机发送Set_Address请求给设备,同时为设备分配一个新地址。设备读到这个请求后,返回给主机确认信息,同时保存新地址,下面开始用新地址通信。
3.主机重发获取设备描述符请求给设备,这次会读取全部的usb设备描述符,了解设备的VID,PID等信息。一次读不全,会重复发送该请求。
4.主机发送获取字符串描述符,获得厂商,产口描述,型号等信息。
5.到这儿主机右下角就会弹出发现新硬件,接着弹出厂商,产品描述,型号等
6.主机设备描述符和设备配置信息在自己的驱动库中查找是否有合适的驱动,win98以上的windows系统(不包括98)支持HID设备,打印机,扫描仪等,如果搜不到,会弹出对话框,提示安装设备驱动。
7.驱动加载以后,主机发送设置配置请求为设备选一个合适的配置。如果配置成功,usb进入配置状态,设备可以和主机上应用软件通信了。

    不做实际的固件开发,上面的过程有些地方很难理解,读完之后只需有一个大体印象,当usb枚举失败之后,通过bushound我们就知道到在哪一个阶段出了问题。

你可能感兴趣的:(USB枚举,c/c++)