USB枚举详细过程剖析(转)

USB枚举详细过程剖析(转)

原文地址:http://blog.163.com/luge_arm/blog/static/6774972620071018117290/ html

从驱动开发网看到一篇《USB枚举详细过程分析》,依据本身的理解和经验对原文稍加改动。本文仅供参考,一些顺序并非固定的。 
本文描述的是Windows系统的USB枚举过程,但对嵌入式系统自行开发的USB主机驱动程序也有参考价值。 

USB枚举详细过程剖析 

1.主机集线器检测到新设备 
主机集线器监视着每一个端口的信号电压,当有新设备接入时即可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,所以被主机集线器检测到。) 

2.主机发送Get_Status请求 
每一个集线器用中断传输来报告在集线器上的事件。当主机知道了这个事件,它给集线器发送一个Get_Status请求来了解更多的消息。返回的消息告诉主机一个设备是何时链接的。 

3.主机发送Set_Feature请求,集线器重启端口 
当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重启端口。集线器使得设备的USB数据线处于重启(RESET)状态至少10ms。 

4.集线器在设备和主机之间创建一个信号通路 
主机发送一个Get_Status请求来验证设备是否激起重启状态。返回的数据有一位表示设备仍然处于重启状态。当集线器释放了重启状态,设备就处于默认状态了,设备已经准备好经过Endpoint 0 的默认流程响应控制传输,即设备如今使用默认地址0x0与主机通讯。 

5.集线器检测设备速度 
集线器经过测定哪根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备仍是全速设备。(全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻)。 

如下须要USB的firmware进行干预 。 

6.获取最大数据包长度 
PC 向address 0发送USB协议规定的Get_Device_Descriptor命令,以取得缺省控制管道所支持的最大数据包长度,并在有限的时间内等待USB设备的响应。该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,因此这时主机只需读取该描述符的前8个字节。注意,主机一次只能枚举一个USB设备,因此同一时刻只能有一个USB设备使用缺省地址0。 

如下操做雷同,不一样操做系统设定时延是不同的,好比说win2k大概是几毫秒,若是没有反应就再发送一次命令,重复三次。 

7.主机分配一个新的地址给设备 
主机经过发送一个Set_Address请求来分配一个惟一的地址给设备。设备读取这个请求,返回一个确认,并保存新的地址。今后开始全部通讯都使用这个新地址。 

8.主机从新发送Get_Device_Descriptor命令,读取完整设备描述符 
主机向新地址从新发送Get_Device_Descriptor命令,这次读取其设备描述符的所有字段,以了解该设备的整体信息,如VID,PID。 

9.主机发送Get_Device_Configuration命令,获取完整配置信息 
主机向设备循环发送Get_Device_Configuration命令,要求USB设备回答,以读取所有配置信息。 

10.主机发送Get_Device_String命令,得到描述字符集(unicode) 
描述字符集包括了产商、产品描述、型号等信息。 

11.主机展现新设备信息 
此时主机将会弹出窗口,展现发现新设备的信息,产商、产品描述、型号等。 

12.PC判断可否提供该类USB的驱动 
根据Device_Descriptor和Device_Configuration应答,PC判断是否可以提供USB的Driver,通常win2k能提供几大类的设备,如游戏操做杆、存储、打印机、扫描仪等,操做就在后台运行。可是Win98却不能够,因此在此时将会弹出对话框,索要USB的 Driver。 

13.主机发送Set_Configuration(x)命令,请求为设备选择一个配置 
加载了USB设备驱动之后,主机发送Set_Configuration(x)命令请求为该设备选择一个合适的配置(x表明非0的配置值)。若是配置成功,USB设备进入“配置”状态,并能够和客户软件进行数据传输。 

此时,常规的USB完成了其必须进行的配置和链接工做。查看注册表,可以发现相应的项目已经添加完毕,至此设备应当能够开始使用。不过,USB协议还提供了一些用户可选的协议,设备若是不该答,也不会出错,可是会影响到系统的功能。post

相关文章
相关标签/搜索