USB设备复位、挂起和恢复命令

转自:https://www.usbzh.com/article/detail-850.html

一、设备复位RESET

  在枚举过程中,主机向设备发出复位信号。注意此USB 复位与硬件或上电复位不相同,是两个概念。USB 复位的目的是设置设备的软件状态,以便进行枚举。

  当 D- 和 D+ 都保持低电平 (SE0) 10 ms 时,器件会识别复位条件。在某些情况下,器件能够在 2.5 µs 内检测到复位,但是,主机将在整个 10 ms 内保持复位条件。
USB设备复位、挂起和恢复命令_第1张图片
  为了初始化复位,集线器将 D+ 和 D- 保持在低电平。让集线器将数据线保持在低电平允许主机持续为其他设备提供服务,并避免设备因 D+ 和 D- 上缺乏活动而进入挂起模式。主机通过向集线器发出SET_PORT_FEATURE(PORT_RESET)控制命令使集线器复位设备。

二、挂起Suspend

  当连续三个帧都没有接收到帧开始信号时,设备将进入挂起状态。 当发生挂起时,设备中运行的应用软件通常会收到通知,并可能会采取措施降低功耗。在挂起模式下,设备将吸取不超过 50 毫安的电流。挂起的设备能够响应重置和恢复命令。
USB设备复位、挂起和恢复命令_第2张图片
  主机可以通过向连接到要挂起的设备的集线器发出
SET_PORT_FEATURE(PORT_SUSPEND)控制命令来使一个枚举设备挂起。

补充

  我们知道,在USB系统中,正常状态下hub或root hub会一直周期性地发送SOF包(Start Of Frame,全速USB每1ms发送一个,高速USB则是125µs发送一个)。根据USB协议,如果USB线上一直处于空闲(Idle)状态超过3ms,设备应该把它当作一个挂起(Suspended)信号,要求设备在10ms内进入挂起状态,并把设备所需的电流大小降到规定的值(对于low-power设备,要求是500 µA,而对于high-power或支持远程唤醒(remote wakeup)功能的设备是2.5mA。

  • 所在USB设备都应该支持挂起状态(Suspending State)。
  • USB设备可以从任意供电状态进入挂起状态。
  • USB设备从上游主机端口接收到持续的IDLE信号超过3.0ms时,USB设备应当认为这是一个挂起的信号,然后开始进入挂起状态。当所有端口无总线活动时,要求设备在10ms内进入挂起状态,并把设备所需的电流大小降到规定的值,即挂起电流值(对于low-power设备,要求是500 µA,而对于high-power或支持远程唤醒(remote wakeup)功能的设备是2.5mA。
  • USB设备面向上游的端口上的任何总线活动都将使其退出挂起状态。
  • 在没有任何其他总线流量的情况下,SOF令牌每(微)帧将发生一次,以防止全速/高速设备挂起。 在没有任何低速流量的情况下,低速设备将在每一帧中看到至少一个保持活动状态发生 SOF,使它们无法挂起。
  • 当处于挂起状态时,设备必须继续为其 D+(全速/高速)或 D-(低速)上拉电阻供电,以保持IDLE状态,以便上游集线器可以保持正确的设备连接状态 。
  • USB设备挂起时,可以停止设备的时钟,以进入低功耗模式。而当USB设备可以通过外部中断唤醒自身,然后再由USB设备唤醒主机。

  在挂起状态中,设备必须继续向数据项D+/D-的上拉电阻提供电压以维持Idle状态。而对于USB2.0高速设备,还有些额外的要求:

  • 高速设备在收到挂起信号(3ms空闲)后,应在0.125ms内切换到全速状态,也就是说要把终端电阻移除,并在D+数据线上重新挂上1.5k上拉电阻。

  • 设备在随后的100-875µs内检测数据线上的状态。如果该状态是一个Full speed J,那么说明host发下来的是一个挂起信号;如果此时该状态是SE0,说明是host drive数据线D+到0,这是一个复位信号(复位信号会持续至少10ms时间)。
    要注意的是高速设备在挂起状态时处于高速模式,只是所用的是全速信号。一旦从挂起状态恢复回来,会马上进入高速工作状态而无需进行复位操作。

  • USB主机使使用周期性的SOF或Keep alive(低速)阻止设备进入挂起状态。

    • For High-speed, SOF is sent every micro-frame 125us +/- 65ns
    • For Full-speed, SOF is sent every frame 1ms +/- 500ns
    • For Low-speed, Keep Alive (End of Packet) is sent every 1ms in absence of low-speed data
  • USB设备要退出【挂起模式】 可以由Host唤醒,或者自己唤醒。
    USB设备复位、挂起和恢复命令_第3张图片

  • 如果设备配置为高功率(高达 500 mA),并启用了远程唤醒功能,则在挂起期间允许消耗高达 2.5 mA 的电流。

三、恢复Resume

  当设备处于#挂起Suspend状态时,设备端口上的数据K状态意味着从暂停状态恢复。这意味着恢复信号是全速段中从数据J状态到数据K状态的变化。

  恢复设备操作的顺序是在 D+ 和 D- 上产生 K 状态 20 ms。 K 状态在 USB 规范中定义,由 USB 速度决定。
USB设备复位、挂起和恢复命令_第4张图片
  暂停的设备可以通过以下两种方式之一返回到运行状态(即恢复):

  如果设备在 Suspend 状态至少 5 ms 后设置了远程恢复功能,则设备可以启动恢复正常操作的过程。要开始恢复,器件会在 D+ 和 D- 上断言 K 状态 1 到 15 ms。主机(即 HUB)将检测到此状态并在 1 毫秒内接管控制 D+ 和 D- 20 毫秒的剩余时间。20 ms 后,设备将恢复正常运行。
  主机可以通过向连接到设备的集线器发送CLEAR_PORT_FEATURE(PORT_SUSPSEND)来恢复设备。 这将导致集线器在 D+ 和 D- 上驱动 K 状态 20 毫秒。

  下图显示了在运行暂停和恢复 HID 演示时捕获的 USB抓包日志。 在 PC 主机停止发送 SOF 使 USB 总线进入挂起状态之前,它会发出 Set Feature 请求以在 USB 设备上启用远程唤醒。 恢复信号的时序显示为 10 ms,如在 USB 堆栈中实现的那样。
USB设备复位、挂起和恢复命令_第5张图片

四、设备的远程唤醒

  同样,设备也可以换醒host,比如电脑待机时通过USB键盘来换醒主机,这种功能称之为“远程唤醒”(remote wakeup)。
  在配置描述符中,USB设备会将是否支持远程唤醒的能力报告给主机。
USB设备复位、挂起和恢复命令_第6张图片
  在配置描述符中,偏移第7个字节的描述属性项,包含了设备是否支持远程的功能位。Bit5代表是否支持远程唤醒。

    ------------------ Configuration Descriptor -------------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x02 (Configuration Descriptor)
wTotalLength             : 0x010B (267 bytes)
bNumInterfaces           : 0x04 (4 Interfaces)
bConfigurationValue      : 0x01 (Configuration 1)
iConfiguration           : 0x00 (No String Descriptor)
bmAttributes             : 0xA0
 D7: Reserved, set 1     : 0x01
 D6: Self Powered        : 0x00 (no)
 D5: Remote Wakeup       : 0x01 (yes)
 D4..0: Reserved, set 0  : 0x00
MaxPower                 : 0x32 (100 mA)

你可能感兴趣的:(#,USB,2.0,服务器,网络,运维)