USB的挂起恢复机制:suspend

1.四个概念:挂起、恢复、空闲、唤醒

  首先,需要明白四个概念:挂起(suspend)、恢复(resume)、空闲(idle)和唤醒(wakeup)。

挂起

  是一个从Host/Hub到设备的请求,这个请求表现为一个在USB总线上的3ms的’J’状态(即全速模式下的空闲状态,此时,信号线D+上的电压高于信号线D-上的电压)。此外,还可以手动产生一个挂起信号,即向SUSPEND寄存器写任意值:

恢复

  是一个设备(或者主机)发起的将USB总线驱动成’K’状态的信号,用于请求主机(或者设备)从退出低功耗的挂起模式。

空闲

  是EZ-USB的低功耗状态。固件可以通过设置寄存器PCON (Power Control)的BIT0为0,进入而是芯片进入这一状态。此后,如果如下条件满足其中之一,则 系统晶振停摆:   1)总线上的挂起条件继续存在,或者向SUSPEND寄存器写入数据;   2)唤醒源(WAKEUP, WU2, USB Resume)被禁止或出错。   当收到唤醒中断时,EZ-USB退出空闲状态。

唤醒

  是一个重启EZ-USB晶振、发出强制EZ-USB退出空闲状态和恢复代码执行的中断的机制。 

2.源代码

  这是fw.c中的源代码,位于主循环中,,用于处理挂起-恢复。

// check for and handle suspend. // NOTE: Idle mode stops the processor clock. There are only two // ways out of idle mode, the WAKEUP pin, and detection of the USB // resume state on the USB bus. The timers will stop and the // processor will not wake up on any other interrupts. if (Sleep) {if(TD_Suspend()){Sleep = FALSE;// Clear the “go to sleep” flag. Do it here to prevent any race condition between wakeup and the next sleep.do{EZUSB_Susp();// Place processor in idle mode.}while(!Rwuen && EZUSB_EXTWAKEUP());// above. Must continue to go back into suspend if the host has disabled remote wakeup// *and* the wakeup was caused by the external wakeup pin.// 8051 activity will resume here due to USB bus or Wakeup# pin activity.EZUSB_Resume(); // If source is the Wakeup# pin, signal the host to Resume.TD_Resume();}}

  当EZ-USB检测到挂起中断,其会进入相应的中断服务程序:

void ISR_Susp(void) interrupt 0{ Sleep = TRUE; EZUSB_IRQ_CLEAR(); USBIRQ = bmSUSP;}

  即,1)将睡眠标志位Sleep置1;   2)清除USB中断请求(因为USB中断作为自动向量分出很多中断,这里避免影响响应其他中断);   3)清除挂起中断请求;

  当主循环运行到 if (Sleep)时,就可以执行if里的语句了。   1)这里的if(TD_Suspend())恒返回真,实际应用中可以修改其返回值为FALSE,使EZ-USB永远不会休眠;   2)EZUSB_Susp()来自Cypress的函数库,使处理器进入空闲状态;   3)while(!Rwuen && EZUSB_EXTWAKEUP());用于实现“如果远程唤醒被禁用,则不响应来自外部唤醒引脚的唤醒”,而是又执行一次EZUSB_Susp();   4)往下执行,说明:(a)远程唤醒被使能,或者(b)远程唤醒被禁止,而唤醒中断来自USB总线。但是,函数EZUSB_Resume(); (来自函数库)仍然是只处理外部唤醒引脚啊!对此,很疑惑。

EZUSB_Resume(void){if( ((WAKEUPCS & bmWUEN)&&(WAKEUPCS & bmWU)) || // Check status AND Enable((WAKEUPCS & bmWU2EN)&&(WAKEUPCS & bmWU2)) ){USBCS |= bmSIGRESUME;EZUSB_Delay(20);USBCS &= ~bmSIGRESUME;}}

没有创造的生活不能算生活,只能算活着。

USB的挂起恢复机制:suspend

相关文章:

你感兴趣的文章:

标签云: