USB2.0物理层的电信号
+ -

USB设备的休眠挂起及远程唤醒

2021-02-03 9283 33

USB协议的第9章讲到USB可见设备状态,分为连接(Attached),上电(Powered),默认(Default),地址(Address),配置(Configured)和挂起(Suspended)6个状态。所谓可见,即USB系统和主机可见的状态,其他状态属于USB设备内部而不可见。其中有关电源的,大致可分下面三类:

  • 连接状态(Attached):设备连接,但未提供电源。
  • 上电状态(Powered):设备被复位(Reset),或者说处于地址、配置状态。
  • 挂起状态(Suspended):3 ms未见总线活动而处于省电状态,设备不可用,但仍然保持原有的USB地址和配置。

usb-status-change

USB设备的挂起

我们知道,在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设备的挂起时序

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

设备的唤醒

设备处于挂起状态时,任何总线上的活动(非空闲信号)都可以把设备唤醒/恢复,从而退出低功耗模式。
因为设备挂起时处于全速信号,在当host需要把将设备退出suspend状态时,需要先发送一个持续时间超过20ms的Fulll Speed K状态。设备看到K状态结束的1.3us内醒过来,而host需要在3ms内发送uSOF信号以维持正常的高速信号模式,否则设备又将进入suspend。

当主机想要在挂起后唤醒设备时,它通过将数据线上的信号极性反转至少 20ms 来实现。该信号以分组信号的低速端完成。
设备的唤醒

具有远程唤醒功能集的设备也可以自行启动恢复。它必须处于空闲状态至少 5ms,并且必须在 1 到 15ms 之间应用唤醒 K 条件。主机在 1 ms 内接管恢复信号的驱动。

143524591368

设备的远程唤醒

同样,设备也可以换醒host,比如电脑待机时通过USB键盘来换醒主机,这种功能称之为“远程唤醒”(remote wakeup)
配置描述符中,USB设备会将是否支持远程唤醒的能力报告给主机。
设备的远程唤醒时序

GetStatus返回请求

GetStatus()设备请求返回的信息,包含是否允许远程唤醒的信息。
详见:USB读取状态GET_STATUS

配置描述符中,偏移第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设备的远程唤醒

当然,也可通过 USB清除特性请求CLEAR_FEATURE 来禁止USB的远程唤醒功能。

USB远程唤醒的编程

如我们有一个STM32做的USB设备,通过外接GPIO按键触发实现远程唤醒PC主机。
USB远程唤醒的编程

Resume的代码其实是一个状态机,是将STM32远程唤醒的寄存器置高10ms,即10个EOF,然后再置低,以使USB设备通过D+/D-的电信号进行远程唤醒。

STM32寄存器定义将此位置高1-15ms,将进行远程唤醒操作。

USB远程唤醒的编程

当然,支持远程唤醒也是需要PC机的配合的,一般情况下是在BIOS中的电源管理进行配置。
BIOS

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB设备的休眠挂起远程唤醒
USB协议的第9章讲到USB可见设备状态,分为连接(Attached),上电(Powered),默认(Default),地址(Address),配置(Configured)和挂起(Suspended)6个状态。所谓可见,即USB系统和主机可见的状态,其他状态属于USB设备内部而不可见。其中有关电源的......
USB设备复位、挂起和恢复命令
USB主机除了在正常的操作期间发送到设备的控制命令外,主机还可以发出三种独特的信号条件:复位、挂起或恢复挂起的设备。设备复位RESET在枚举过程中,主机向设备发出复位信号。注意此USB 复位与硬件或上电复位不相同,是两个概念。USB 复位的目的是设置设备的软件状态,以便进行枚举。当 D- 和 D......
USB设备远程唤醒RemoteWakeUp
USB设备的Remote Wakeup是可选的,其功能用于远程唤醒待机状态下的主机。USB设备通过配置描述符bmAttributes字段的D5标识其是否支持远程唤醒。支持远程唤醒的USB设备必须支持USB的标准请求CLEAR_FEATURE和SET_FEATURE。USB主机通过SET_FEATU......
USB全速设备的挂起、唤醒Resume
在介绍USB全速设备挂起Suspend、唤醒Resume之前先介绍USB全速设备的硬件连接方式。USB全速设备的连接USB全速设备的硬件连接和USB高速设备的硬件连接方式一样。区别是全速设备不会触发高速的协商。内容详见:USB2.0设备从全速模式到高速模式的识别过程及速率协商 https://ww......
USB设备挂起Supsend及唤醒Resume实现
为什么需要进行USB唤醒与挂起答案就是电源管理,节能。连接到USB主机端的设备必须遵守主机功率预算求。USB总线电源是一种有限的资源。USB设备(总线供电或自供电)必须将VBUS的功耗限制在更低直到它们进入配置状态。作为一种省电方式,当USB设备观察到超过3ms没有总线活动(恒定空闲状态),它们进入......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!