枚举过程

USB设备状态

概述

chapter9.1
在USB的枚举阶段, 设备的状态可以分为接入态、供电态、缺省态、地址态、配置态和挂起态。这些状态都是一种暂态。每一个暂态都有一系列主机与设备之间的数据通信。只有经过了一定的暂态之后, USB 设备才能进入稳定的状态, 最简单地说, 比如设备只有在按顺序经过了除挂起态以外的所有暂态之后, 才能算是真正被主机配置成功了。
这里写图片描述
这里写图片描述

USB各个状态

1 . 接入态(Attached)

设备可以连接到USB或者从USB上拔出,USB设备从总线上拨出后的状态在规范没定义,只说明一旦USB连到总线要求的操作以及属性。

2 . 供电态(Powered)

USB设备的电源可来自外部电源,也可从USB接口的集线器而来。电源来自外部电源的USB设备被称作自给电源式的(self-powered)。自给电源式USB设备可能在连接上USB接口以前可能已经带电,但它们直到连线上USB接口后才能被看作是加电状态(Powered state)。设备对电源支持的能力是通过配置描述表(configuration descriptor)来反映的。
在USB 设备刚刚接入到主机时的供电态是整个USB 总线的电源默认状态。即使没有USB 设备接入主机, 该端口上也会有同样大小的电源负载能力。USB 这样规定的目的, 主要是基于其即插即用技术的实现。设备的数据线上有一个3 .3 V 的上拉电平用于改变主机信号线的电平, 而这个3 .3 V 的
电平受制于USB 总线的这种电源默认状态。因此任何时候设备接入到主机的端口上, 就会得到3 .3 V 的电平, 从而实现即插即用。在进入配置阶段后, 这个供电态又会有所不同, USB 为了实现设备的复位( Reset ) , 并在信号线上检测到设备的重新接入(实际上物理接口并没有拔出和再接入) , 从而使供电态暂时停止供电。在 USB 设备配置结束后, 主机就会按照其要求的最大电流来供电(仅对总线供电设备而言) , 这种供电态是正常的供电状态。

3 . 缺省态(Default)

USB 设备再被配置之前, 通过默认地址0 与主机进行通信, 这种状态称为缺省态。

4 . 地址态(Address)

所有的USB设备在加电复位以后都使用缺省地址。每一设备在连接或复位后由主机分配一个唯一的地址。当USB设备处于挂起状态时,它保持这个地址不变。USB设备只对缺省通道(Pipe)请求发生响应,而不管设备是否已经被分配地址或在缺省地址。

5 . 配置态(Configured)

主机通过各种标准的USB 请求命令来获取设备的各种信息, 并对设备的某些信息进行改变或设置, 从而完成对设备的配置。这种状态称做配置态。

6 . 挂起态(Suspended)

为节省电源,USB设备在探测不到总线传输时自动进入中止状态。当中止时,USB设备保持本身的内部状态,包括它的地址及配置。
所有的设备在一段特定的时间内探测不到总线活动时必须进入中止态。不管设备是被分配了非缺省的地址或者是被配置了,已经连接的设备必须在任何加电的时刻随时准备中止。总线活动的中止可能是因为主机本身进入了中止状态。另外,USB设备必须在所连接的集线器端口失效时进入中止态。这就是所指的选择性中止(Selective suspend)。
USB设备在总线活动来到时结束中止态。USB设备也可以远程唤醒的电流信号来请求主机退出中止态或选择性中止态。具体设备具有的远程唤醒的能力是可选的,也就是说,如果一个设备有远程唤醒的能力,此设备必须能让主机控制此能力的有效与否。当设备复位时,远程唤醒能力必须被禁止。

USB总线枚举

概述

  • 8个步骤,4个状态
  • 上电状态(Powered) -> 默认状态(Default) -> 地址状态(Address) -> 配置状态(Configured)

枚举步骤

  • 1、设备连接到Hub 或根Hub 的下行端口上。接着Hub 就通过其状态变化管道(Status Change Pipe )把这个设备连接的事件通知主机。这个时候, 设备所连接的端口上有电流供应, 但是该端口的其他属性被禁止, 以便主机进行其他操作。设备的这个状态便是接入态。
  • 2、主机通过一系列命令来询问Hub , 以确定设计连接的事件的细节情况。
  • 3、主机确定了设备所接入的端口。接着主机等待100 ms 以使设备的接入过程顺利完成并使供电稳定。然后主机便激活该端口, 并发送复位的命令。设备处于低电流供电态和接入态复合的状态
  • 4、Hub 在设备接入的端口上保持复位命令10 ms。然后, 该端口就处于被激活的状态。这时, 设备处于缺省态, 可以从端口上获取最高达100 mA 的电流。设备的所有寄存器等均已复位, 并通过地址0 与主机通信。
  • 5、主机给设备分配一个总线上的惟一地址, 使设备进入地址态。因此, 在以后的各种数据传输中, 设备就将使用这个新的地址。
  • 6、在USB设备收到唯一地址之前,其默认控制管道仍可通过默认地址访问。 主机读取设备描述符,以确定USB设备的默认管道可以使用的实际最大数据有效载荷大小。
  • 7、主机获取所有设备的配置描述符。
  • 8、在得到配置描述符等一系列信息后, 主机就给该设备分配配置值。这样, 设备就完成了配置, 并处于配置态。所有接口和端点的属性也得到了主机的确认。接下来, 设备就可以从端口上获取其要求的最大电流数。也就是说, 这个USB 已经可以开始使用了。

http://blog.csdn.net/myarrow/article/details/8270029

数据包解析

参考:
http://blog.csdn.net/hushiganghu/article/details/54906960
http://blog.csdn.net/hushiganghu/article/details/54929066
http://blog.csdn.net/hushiganghu/article/details/64906052
图解USB枚举过程(AUDIO和HID双设备)
- 具体解析包和各个域解析请看上面的三个链接

这里写图片描述

  • 检测到USB设备后,对USB设备复位(Reset这里没有显示出来)

这里写图片描述

  • 看到这里发送的setup命令带的DATA0(8个字节)为80 06 00 01 00 00 40 00。参考标准命令,可知是一个获取描述符请求(GET_DESCRIPTOR),在地址0端点0获取设备40字节大小的设备描述符。不知道设备描述符的长度,暂时要求返回数据长度为0x40。
  • 这里起始各个参数意义都不大,主机这一步实际只需求获取的是设备端点0的大小。
  • 可选数据步骤,设备回复给主机数据包就是设备描述符含义,具体解析请参考设备描述符。这里偏移量为7的数据为0x40,表明设备端点0的大小为64个Byte。
  • 当完成第一次的控制传输后,也就是完成控制传输的状态阶段,系统会要求hub对设备进行再一次的复位操作(USB规范里面可没这要求)。再次复位的目的是使设备进入一个确定的状态。

transfer1

  • 从setup事务中数据包看到,这个命令是05(SET_ADDRESS设置地址请求),跟在后面的wValue(01 00)就是设置的设备地址
  • 可以看到这里就没有可选的数据阶段,设置完成后设备回复状态信息

transfer2

  • 设置地址成功后,这里可以看到新地址已经变成了1,对新地址发送获取设备描述符命令,此时已经知道了它的长度,直接按这个长度即可。
  • 小机返回设备描述符,有且只有一个。偏移量量17为设备配置描述符个数,这里可以看到只有一个配置描述符。

transfer3
- 可以看到setup数据包为80 06 00 02 00 00 FF 00,获取配置描述符请求,长度为0xFF。
- 设备返回数据,是一次把所有的描述符(配置、接口、端点)都返回了。
- 因为这里是获取audip设备的描述符,涉及到具体的子类协议,这里先不展开描述。我们记住无论任何描述符都是以长度开始计算的。

  • 之后的transfer4-6为获取字符串描述符,后续的就是继续获取各种配置和设置接口端点配置。到这里枚举过程就基本结束了。

猜你喜欢

转载自blog.csdn.net/hushiganghu/article/details/65444270