分享

USB枚举过程(好)

 haodafeng_org 2011-07-20
 
主机对一个USB设备的识别是经过一个枚举的过程来完成的,主机的总线枚举器随时监控必要的设备状态变化。总线枚举的过程如下:

(1)设备连接。USB设备经USB总线连接主机。
(2)设备上电。USB设备可以自供电,也可以使用USB总线供电。
(3)主机检测到设备,发出复位。主机通过检测设备在总线的上拉电阻检测到有新的设备连接,并获释设备是全速设备还是低速设备,然后向该端口发送一个复位信号。
(4)设备默认状态。设备从总线上接收到一个复位信号后,才可以对总线的处理操作做出响应。设备接收到复位信号后,就暂时使用默认地址(00H)来响应主机的命令。
(5)地址分配。当主机接收到有设备对默认地址(00H)响应的时候,就分配给设备一个空闲的地址,以后设备就只对该地址进行响应。
(6)读取USB设备描述符。主机读取USB设备描述符,确认USB设备的属性。
(7)设备配置。主机依照读取的USB设备描述符来进行配置,如果设备所需的USB资源得以满足,就发送配置命令给USB设备,表示配置完毕。
(s)挂起。如果使用总线供电,为了节省电源,当总线保持空闲状态超过3ms以后,设备驱动程序就会进入挂起状态,在挂起状态时,USB设备保留了包括其地址和配置信息在内的所有内部状态,设备的消耗电流不超过500uA。

USB设备的枚举过程的具体说明如下:
 
USB总线驱动程序自动检测新插入的USB设备。然后它读取设备内的设备描述符以查明插入的是何种设备,描述符中的厂商和产品标识以及其它描述符一同决定具体安装哪一个驱动程序。配置管理器调用驱动程序的AddDvecie函数。AddDvecie做以下工作:创建设备对象,把设备对象连接到驱动程序堆栈上,等等。最后,配置管理器向驱动程序发送一个即插即用请求IRP_MN_START_DEVICE。它通过调用一个名为StartDevice的辅助函数并传递一些参数,这些参数描述了赋予设备的经过转换的和未经转换的I/O资源。实际上它们不用任何I/O资源。 USB使用了许多方法来帮助操作系统定位驱动程序,包括设备上的设备描述符、配置描述符,以及接口描述符。对于有厂商和产品标识的设备,配置管理器首先在注册表中查找设备名称,例如名为USB\VID一0471&PID-0666的设备。如果注册表中没有这个表项,配置管理器将触发“新硬件向导” 来寻找该设备的INF文件。新硬件向导向用户询问INF文件的位置,然后安装驱动程序并填写注册表。一旦配置管理器找到了注册表表项,它就可以动态地装载驱动程序。StartDveiee的执行过程大致如下,首先为设备选择一个配置。如果你的设备像大多数设备一样,应该仅有一种配置。选定了某个配置后,接着应该选择配置中的一个或多个接口。选定了一个配置和一组接口后,你应该向总线驱动程序发送配置选择URB。最后,总线驱动程序向设备发出命令确定能选定的配置和接口。总线驱动程序负责创建管道和用于访问管道的句柄,管道提供功能驱动程序与选定接口端点之间的通信,它同时还创建配置句柄和接口句柄。你可以从完成的URB中提取这些句柄,并保存为以后使用。至此,设备的枚举过程全部结束。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多