USB的挂起和唤醒(Suspend and Resume)【转】

转自:http://m.blog.csdn.net/blog/luckywang1103/25244091

USB协议的第9章讲到USB可见设备状态[Universal Serial Bus Specification, Section 9.1.1, Pg 239],分为连接(Attached),上电(Powered),默认(Default),地址(Address),配置(Configured)和挂起(Suspended)6个状态。所谓可见,即USB系统和主机可见的状态,其他状态属于USB设备内部而不可见。其中有关电源的,大致可分下面三类:
1. 连接状态(Attached):设备连接,但未提供电源。
2. 上电状态(Powered):设备被复位(Reset),或者说处于地址、配置状态。(参见USB枚举过程,USB Specification, page 241)
3. 挂起状态(Suspended):3 ms未见总线活动而处于省电状态,设备不可用,但仍然保持原有的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【Section 7.2.3, Pg176】)。在挂起状态中,设备必须继续向数据项D+/D-的上拉电阻提供电压以维持Idle状态。而对于USB2.0高速设备,还有些额外的要求:
1. 高速设备在收到挂起信号(3ms空闲)后,应在0.125ms内切换到全速状态,也就是说要把终端电阻移除,并在D+数据线上重新挂上1.5k上拉电阻。
2. 设备在随后的100-875µs内检测数据线上的状态。如果该状态是一个Full speed J,那么说明host发下来的是一个挂起信号;如果此时该状态是SE0,说明是host drive数据线D+到0,这是一个复位信号(复位信号会持续至少10ms时间)。
  要注意的是高速设备在挂起状态时处于高速模式,只是所用的是全速信号。一旦从挂起状态恢复回来,会马上进入高速工作状态而无需进行复位操作。

USB High Speed Suspend Signal
  如上图所示,Host在a点停止发送SOF,系统处于SE0状态,b点是3ms时间点,之后的125µs内,设备移除终端电阻,并挂上1.5k上拉。此时如host发送的是suspend信号,那它就不会不drive D+数据线,导致D+被设备拉高,形成一个Full Speed J状态。在c点之后100-875µs内设备检测此时host行为,发现是suspend信号,设备内部进入低功耗的挂起(suspend)状态。(假如hsot发送的是复位信号,那么当设备在c点挂1.5k电阻之后,由于host对D+线的drive作用,D+线无法被拉高,仍然处于SE0状态,设备在c点之后的检测,发现的还是SE0状态,等到10ms后就可判断这是一个复位信号,进行设备复位操作。)
设备的唤醒
  设备处于挂起状态时,任何总线上的活动(非空闲信号)都可以把设备唤醒/恢复,从而退出低功耗模式。(同样,设备也可以换醒host,比如电脑待机时通过USB键盘来换醒主机,这种功能称之为“远程唤醒”(remote wakeup),不在本文的讨论范围内。)
  因为设备挂起时处于全速信号,在当host需要把将设备退出suspend状态时,需要先发送一个持续时间超过20ms的Fulll Speed K状态。设备看到K状态结束的1.3us内醒过来,而host需要在3ms内发送uSOF信号以维持正常的高速信号模式,否则设备又将进入suspend。如下图所示:

时间: 2024-09-24 22:11:46

USB的挂起和唤醒(Suspend and Resume)【转】的相关文章

线程 死锁-一个关于线程挂起、唤醒的问题

问题描述 一个关于线程挂起.唤醒的问题 在windows平台上, 线程的挂起可以使用API SuspendThread()函数,而减少线程的挂起计数则可以使用ResumeThread()函数,但是今天却发现了其中隐藏的问题:1. 现有一个主线程和子线程A,在主线程中调用SuspengThread()使得A被挂起:2. 主线程中调用ResumeThread()使得A恢复运行:3. 主线程立刻调用SuspendThread()意图挂起A时,主线程竟然被阻塞在了调用处!也就是说产生了deadlock!

Linux 线程挂起与唤醒功能 实例

pthread_cond_wait 多线程的条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立"(给出条件成立信号).为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起. 创建和注销 条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量,如下: pthread_cond_t cond=PTHREAD_COND

Java Thread多线程详解及用法解析_java

最全面的java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); public Thread(Runnab

Java多线程的用法详解_java

1.创建线程   在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( );  public Thread(Runnable target);  public Thread(String name);  public Thread(Runnable targ

Linux下USB suspend/resume源码分析【转】

转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron   本文主要从自己开发的一个USB驱动的例子来深入讲解linux内核是如何支持USB设备的休眠和唤醒的, 最近我在为我们公司的一个模块写linux下的驱动, 其中之一就是要支持USB的休眠唤醒问题, 实际上linux内核对USB的这个功能的支持还是比较新的, 也就是最近几年的事.   一  打开/

mfc线程挂起唤醒操作问题

问题描述 mfc线程挂起唤醒操作问题 HANDLE hThread; CWnd *pWnd; UINT TextShow(LPVOID pParam) { CString szLine; //打开文件 CStdioFile file; file.Open(_T("E:1.txt"), CFile::modeRead); //逐行读取字符串 while (file.ReadString(szLine)) { pWnd->SetWindowText(szLine); hThread

Linux那些事儿之我是Hub(大结局)挂起自动化【转】

转自:http://blog.csdn.net/fudan_abc/article/details/1805471 目睹了当今大学校园的素质流氓化,kiss公开化,消费白领化,上课梦游化,逃课普遍化,补考专业化之后,区里的人们很时髦的提出了一个挂起自动化的概念. 接下来的一个话题就是autosuspend/autoresume. 所谓的autosuspend就是driver自己判断是否需要挂起,而之前的suspend/resume是受外界影响的,比如说PM core统一的系统级的挂起,或者用户通

多线程之Java线程阻塞与唤醒

线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java发展史上曾经使用suspend().resume()方法对于线程进行阻塞唤醒,但随之出现很多问题,比较典型的还是死锁问题.如下代码,主要的逻辑代码是主线程启动线程mt一段时间后尝试使用suspend()让线程挂起,最后使用resume()恢复线程.但现实并不如愿,执行到suspend()时将一直卡住

linux设备驱动之USB主机控制器驱动分析 【转】

转自:http://blog.chinaunix.net/uid-20543183-id-1930831.html   ------------------------------------------ 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ ------------------------------------------ 一:前言 Usb是一个很复杂的系统.在usb2.0规范中,将其定义成了一个分层模型.linux中的代码也是按照