USB枚举过程的详细流程
USB枚举过程的详细流程
用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态。
主机检测设备。
1>Hub使用中断通道将事件报告给Host。
2>Host发送Get_Port_Status(读端口状态)请求,以获取更多的设备信息。
3>集线器检测设备是低速运行还是高速运行,并将此信息送给主机,这是对Get_Port_Status请求的响应。
4>主机发送Set_Port_Feature(写端口状态)请求给集线器,要求它复位端口。
5>集线器对设备复位。
6>Host使用Chirp K信号来了解全速设备是否支持高速运行。
7>Host发送另一个Get_Port_Status请求,确定设备是否已经从复位状态退出。
8>Function device此时处于Default state,且已准备好在endpoint 0缺省通道响应Host控制传输。缺省地址为00h,function device 能从bus获取高达100mA的电流。
9>Host发送Get_Descriptor(读设备描述符)报文,以便确定最大数据包大小。设备描述符的八个字节是bMaxPacketSize。
10>通过发送Set_Address(写地址)请求,Host分配地址,Function device此时处于Device state。
11>Host发送Get_Descriptor,以获取更多的设备信息。Host通过发送描述符响应设备请求,随后发送全部的次级描述符。
12>Host分配并加载设备驱动程序。
13>Host通过发送Set_Configuration(写配置)请求,Host的设备驱动程序选择一个有效配置,Device此时处于Configuration state。
14>Host为复合设备接口分配驱动程序。
15>如果Hub检测到有过流现象,或者Host要求集线器关闭电源,则USB总线切断设备供电电源。在这种情况下,Device与Host无法通信,但设备处于连接状态。
16>如果在3毫秒内设备在Bus上未见任何动作,则它将进入Suspend状态,在挂起状态设备消耗的总线电能最少。
还有一个差不多,如下:
1)集线器检测新设备
主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个 1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)
(2)主机知道了新设备连接后
每个集线器用中断传输来报告在集线器上的事件。当主机知道了这个事件,它给集线器发送一个Get_Status请求来了解更多的消息。返回的消息告诉主机一个设备是什么时候连接的。
(3)集线器重新设置这个新设备
当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重新设置端口。集线器使得设备的USB数据线处于重启(RESET)状态至少10ms。
(4)集线器在设备和主机之间建立一个信号通路
主 机发送一个Get_Status请求来验证设备是否激起重启状态。返回的数据有一位表示设备仍然处于重启状态。当集线器释放了重启状态,设备就处于Default state, 即设备已经准备好通过Endpoint 0 的默认流程响应控制传输。即设备现在使用默认地址0x0与主机通信。
(5)集线器检测设备速度
集线器通过测定那根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备还是全速设备。(全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻)。
以下,需要USB的firmware进行干预.
(6)获取最大数据包长度
Host向address 0发送USB协议规定的Get_Device_Descriptor命令,以取得却缺省控制管道所支持的最大数据包长度,并在有限的时间内等待USB设备的响应,该长 度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需读取该描述符的前8个字节。注意,主机一次只能列举一个 USB设备,所以同一时刻只能有一个USB设备使用缺省地址0。
以下操作雷同,不同操作系统设定时延是不一样的,比如说win2k大概是几毫秒,如果没有反应就再发送一次命令,重复三次。
(7)Host分配一个新的地址给设备
主机通过发送一个Set_Address请求来分配一个唯一的地址给设备。设备读取这个请求,返回一个确认,并保存新的地址。从此开始所有通信都使用这个新地址,设备进入Address State。
(8)主机向新地址重新发送Get_Device_Descriptor命令,此次读取其设备描述符的全部字段,以了解该设备的总体信息,如VID,PID。
(9)主机向设备循环发送Get_Device_Configuration命令,要求USB设备回答,以读取全部配置信息。
(10)主机发送Get_Device_String命令,获得字符集描述(unicode),比如产商、产品描述、型号等等。
(11)此时主机将会弹出窗口,展示发现新设备的信息,产商、产品描述、型号等。
(12) 根据Device_Deor和Device_Configuration应答,Host判断是否能够提供USB的Driver,一般win2k能提供几大类的设备,如游戏操作杆、存储、打印机、扫描仪等,操作就在后台运行。但是Win98却不可以,所以在此时将会弹出对话框,索要USB的Driver。
(13)加载了USB设备驱动以后,主机发送Set_Configuration(x)命令请求为该C设备选择一个合适的配置(x代表非0的配置值)。如果配置成功,USB设备进入Configuration state,并可以和客户软件进行数据传输。
此时,常规的USB完成了其必须进行的配置和连接工作。查看注册表,能够发现相应的项目已经添加完毕,至此设备应当可以开始使用。不过,USB协议还提供了一些用户可选的协议,设备如果不应答,也不会出错,但是会影响到系统的功能
USB枚举过程的详细流程的更多相关文章
- 基于STM32的USB枚举过程学习笔记(转)
之前使用ST官方的库以及网络的资料,完成了使用USB HID类进行STM32和PC机的通讯.由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB设备的枚举,以及具体的通讯方式都没有清晰的概念, ...
- 基于STM32的USB枚举过程学习笔记
源:基于STM32的USB枚举过程学习笔记 基于STM32的USB枚举过程学习笔记(一) 基于STM32的USB枚举过程学习笔记(二) 基于STM32的USB枚举过程学习笔记(三) 基于STM32的U ...
- USB枚举过程
1. 枚举是什么? 枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序.调试USB设备,很重要的一点就是USB的枚举过程,只 ...
- USB枚举过程【转】
转自:http://blog.csdn.net/myarrow/article/details/8270029 1. 枚举是什么? 枚举就是从设备读取一些信息,知道设备是什么样的设备,如 ...
- USB 枚举过程详解
Windows 对USB设备的枚举过程流程图如图1所示: 图1 WP8的USB功能只支持一个配置,三个接口,也就是分别有如下的字段: 设备描述符的bNumConfigurations=1, 配置描述符 ...
- USB枚举过程(1)
总的过程 ① host检测到device,reset 获取设备描述符 host发获取设备描述符请求 ->setup ->data0 <-ack Divice 返回设备描述符 -> ...
- OPPO R7在哪里打开USB调试模式的详细流程
在我们使用PC连接安卓手机的时候,如果手机没有开启USB调试模式,PC则没办法成功检测到我们的手机,这时我们需要想办法将手机的USB调试模式打开,如下资料我们介绍OPPO R7如何开启USB调试模式的 ...
- USB枚举过程(2)
用bus hound 得到的数据 GET MAX LUN 命令 详见USB_MSC_BlukOnly_v1.0 接下来用到的是UFI SCSI
- USB枚举的详细流程
附一个很好的枚举过程的详细流程: ◆ 用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态.◆ 主机检测设备.◆ 集线器使用中断通道将事件报告给主机.◆ 主机发送Get_Port_ ...
随机推荐
- Oracle查看表空间及修改数据文件大小
Oracle查看表空间及修改数据文件大小 第一步:查看所有表空间及表空间大小: select tablespace_name ,sum(bytes) / 1024 / 1024 as MB from ...
- Oracle多行记录合并处理
1:效果如下图所示: 表T1: CREATE TABLE T1 ( WEEKWORKID VARCHAR2(20) , DD VARCHAR2(20) ) 表T2 CREATE TABLE T2 ( ...
- python 安装 ez_setup.py出现的问题及解决办法
试了网上好几个解决办法. 下面这个办法是最对我胃口的. ~~~~~~~~~~~~~~~~ 安装ez_setup.py时出现了这个问题: UnicodeDecodeError: 'ascii' cod ...
- svn: “sqlite: attempt to write a readonly database”
原因很可能是在svn与本地同步的时候上锁了,可能没注意在svn执行与仓库同步的时候被中断,所以锁文件没有解锁,但是这样的错误,应该不是标题上所说的错误啊??搞不懂了,以前这样的错误,cleanup都有 ...
- poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)
Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...
- handsontable插件HOOK事件
Hook插件 afterChange (changes: Array, source: String):1个或多个单元格的值被改变后调用 changes:是一个2维数组包含row,prop,o ...
- Handsontable对单元格的操作
1.自动填充单元格数据 fillHandle:true/false //当值为true时,允许拖动单元格右下角,将其值自动填充到选中的单元格 2.合并单元格 mergeCells:[{row:起 ...
- javascript 将递归转化为循环
function tco(f) { var value; var active = false; var accumulated = []; return function accumulator() ...
- asp.net在后台弹出confirm确认对话框并获取用户选择的值做出相应的操作
在asp项目中,这种情况是经常出现的,前段时间通过查找资料以及自己尝试,找到一种解决方案,但是不知是否有更好的方案,以后发现再进行记录. 一.思路 在本次项目中,在一个函数中需要让用户判断,并根据用户 ...
- Linux 与 unix shell编程指南——学习笔记
第一章 文件安全与权限 文件访问方式:读,写,执行. 针对用户:文件属主,同组用户,其它用户. 文件权限位最前面的字符代表文件类型,常用的如 d 目录:l 符号链 ...