USB2.0设备的休眠挂起及远程唤醒
USB可见设备状态,分为连接(Attached),上电(Powered),默认(Default),地址(Address),配置(Configured)和挂起(Suspended)6个状态。所谓可见,即USB系统和主机可见的状态,其他状态属于USB设备内部而不可见。其中有关电源的,大致可分下面三类:
连接状态(Attached):设备连接,但未提供电源。
上电状态(Powered):设备被复位(Reset),或者说处于地址、配置状态。
挂起状态(Suspended):3 ms未见总线活动而处于省电状态,设备不可用,但仍然保持原有的USB地址和配置。

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时间)。
要注意的是高速设备在挂起状态时处于高速模式,只是所用的是全速信号。一旦从挂起状态恢复回来,会马上进入高速工作状态而无需进行复位操作。
当处于挂起状态时,设备必须继续为其 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唤醒,或者自己唤醒。

- 如果设备配置为高功率(高达 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 内接管恢复信号的驱动。

设备的远程唤醒
同样,设备也可以换醒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主机。

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

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

USB2.0设备的休眠挂起及远程唤醒的更多相关文章
- 【转载】USB2.0接口差分信号线设计
引 言 通用串行总线(Universal Serial Bus)从诞生发展到今天,USB协议已从1.1过渡到2.0,作为其重要指标的设备传输速度,从1.5 Mbps:的低速和12 Mbps的全速,提高 ...
- USB2.0 速度识别--区分低速-高速-全速
USB2.0是向下兼容USB1.X的,即USB2.0支持高速,全速,低速的USB设备 (HIGH-SPEED,FULL-SPEED,LOW-SPEED),而USB1.X不支持高速设备. 因此如果高速设 ...
- USB2.0速度识别
我们知道USB2.0向下兼容USB1.x,即高速2.0的hub能支持所有的速度类型的设备,而USB1.x的hub不能支持高速设备(High Speed Device).因此,如果高速设备挂到USB1. ...
- USB2.0学习笔记连载(十七):keil实现寄存器的配置及相关函数讲解(一)
首先要实现对寄存器的配置,可以参考手册<Development kit User Guide>,如下图所示: 此文件包含在 文件中.上述的应用文档详细介绍了如何利用KEIL实现对固件程序 ...
- usb2.0 协议分析
转:https://blog.csdn.net/u011594613/article/details/48291307 一.USB硬件介绍1.1.概述 一条USB传输线分别由地线.电源线.D+和D-四 ...
- USB2.0协议学习笔记---USB数据包结构
USB包类型和传输过程 USB是一种串行总线,因此数据都是一位一位传输的,如同串口那样,但是USB在真实物理电路上却不是TTL电平,而是一种差分信号采用NRZI编码,就是用变化表示0,不变表示1,同 ...
- Virtualbox安装USB2.0/3.0
系统:Ubuntu16.04 软件:Virtualbox5.1 1.打开Virtualbox,不启动虚拟系统. 2.点击设置->USB->启动usb2.0. 3.若发现不能启用,则到官网下 ...
- USB2.0协议笔记
1.概述 USB(Universal Serial Bus)具有传输速率快,可热插拔等显著特点,应用已经十分广泛,目前的相当多的设备已经支持最新的USB3.0协议.理论上USB1.1的传输速度 ...
- USB2.0规范
USB是一种支持热插拔的高速串行传输总线,它使用差分信号来传输数据,最高速度可达480Mb/S. USB支持“总线供电”和“自供电”两种供电模式.在总线供电模式下,设备最多可以获得500mA的电流.U ...
- ehci符合USB2.0,uhci,ohci,
uhci ohci ehci他们都是主机控制器的规格,OHCI主要为非PC系统上以及带有SiShe ALi芯片组的 PC主板上的USB芯片,UHCI大多为Intel和Via主板上的USB控制器 ...
随机推荐
- Known框架实战演练——进销存财务管理
本文介绍如何实现进销存管理系统的财务对账模块,财务对账模块包括供应商对账和客户对账2个菜单页面.供应商和客户对账字段相同,因此可共用一个页面组件类. 项目代码:JxcLite 开源地址: https: ...
- vue页面加载慢,chunk-vendors.js文件太大
今天拉取合并了同事的代码后页面加载速度变得非常慢,经过排查发现是因为加载的chunk-vendors.js太大 58m 28s就很离谱 经过同事指导加上百度终于找到解决办法,配置compression ...
- 【Java】Main方法的命令行参数
可以使用命令行注入参数执行
- 【SpringBoot】04 初探YAML与配置
什么是YAML? https://www.cnblogs.com/mindzone/p/12849789.html 复合结构的语法 一个标配JavaBean public class Person { ...
- jdk命令行工具系列——检视阅读
jdk命令行工具系列--检视阅读 参考 java虚拟机系列 RednaxelaFX知乎问答 RednaxelaFX博客 jps--虚拟机进程状态工具 jps :(JVM Process Status ...
- 一个专为量化投资开发的强化学习算法框架:ElegantRL
链接: https://github.com/AI4Finance-Foundation/ElegantRL 这是一个专为量化投资开发的强化学习算法框架. 相关论文: ElegantRL-Podrac ...
- vscode中使用ssh进行远程项目开发时无法连接远端服务器——如何解决
找到vscode中的ssh扩展(Visual Studio Code Remote - SSH),然后卸载,再重新安装,即可解决. PS: 重新安装时需要较长时间的等待. ============== ...
- openAI的仿真环境Gym Retro的Python API接口
如题,本文主要介绍仿真环境Gym Retro的Python API接口 . 官网地址: https://retro.readthedocs.io/en/latest/python.html ===== ...
- 证明: 设n阶方阵A相似于对角阵Λ, λ是A的k重特征值, 则r(λE-A)=n-k.
命题: 设n阶方阵A相似于对角阵Λ, λ是A的k重特征值, 则r(λE-A)=n-k.证明: 由定理3.9: A~Λ <=> A有n个线性无关的特征向量, 知k重特征值λ存在k个线性无关的 ...
- SMU Summer 2024 Contest Round 2
SMU Summer 2024 Contest Round 2 Sierpinski carpet 题意 给一个整数 n ,输出对应的 \(3^n\times 3^n\) 的矩阵. 思路 \(n = ...