usb_pwr.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:5k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : usb_pwr.c
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 27/10/2003
  5. * Description        : connection/disconnection & power management
  6. *
  7. ********************************************************************************/
  8. #include "USB_lib.h"
  9. #include "USB_conf.h"
  10. #include "USB_pwr.h"
  11. #define AD_DISP (0x001F81FC)
  12. #define DE_DISP (0x0067807E)
  13. #define PO_DISP (0x001F81BC)
  14. #define AT_DISP (0x090401FC)
  15. #define SU_DISP (0x001B81DA)
  16. volatile BOOL fCellSuspended;
  17. volatile BYTE bDeviceState=UNCONNECTED; /* USB device status */
  18. DWORD dwLedVal; /* alpha-display value */
  19. volatile BOOL fSuspendEnabled=TRUE;  /* true when suspend is possible */
  20. struct {
  21. volatile RESUME_STATE eState;
  22. volatile BYTE bESOFcnt;
  23. } ResumeS;
  24. /*==========================================================================*/
  25. /* PowerOn() */
  26. /* handles switch-on conditions */
  27. /* INPUT : */
  28. /* OUTPUT: */
  29. /*==========================================================================*/
  30. RESULT PowerOn()
  31. {
  32.  WORD wRegVal;
  33. /*** cable plugged-in ? ***/
  34. /*
  35. while(!CablePluggedIn());
  36. */
  37. /*** CNTR_PWDN = 0 ***/
  38. wRegVal = CNTR_FRES;
  39. _SetCNTR(wRegVal);
  40. /*** CNTR_FRES = 0 ***/
  41.     wInterrupt_Mask = 0;
  42.     _SetCNTR(wInterrupt_Mask);
  43. /*** Clear pending interrupts ***/
  44.     _SetISTR(0);
  45. /*** Set interrupt mask ***/
  46.     wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM;
  47.     _SetCNTR(wInterrupt_Mask);
  48. return SUCCESS;
  49. } /* PowerOn */
  50. /*==========================================================================*/
  51. /* PowerOff() */
  52. /* handles switch-off conditions */
  53. /* INPUT : */
  54. /* OUTPUT: */
  55. /*==========================================================================*/
  56. RESULT PowerOff()
  57. {
  58. /* disable all ints and force USB reset */
  59.     _SetCNTR(CNTR_FRES);
  60.     /* clear interrupt status register */
  61.     _SetISTR(0);
  62.     /* switch-off device */
  63.     _SetCNTR(CNTR_FRES+CNTR_PDWN);
  64.     /* sw variables reset */
  65. /* ... */
  66. return SUCCESS;
  67. } /* PowerOff */
  68. /*==========================================================================*/
  69. /* Suspend() */
  70. /* sets suspend mode operating conditions */
  71. /* INPUT : */
  72. /* OUTPUT: */
  73. /*==========================================================================*/
  74. void Suspend(void)
  75. {
  76.  WORD wCNTR;
  77.     fCellSuspended= TRUE;
  78. /* suspend preparation */
  79. /* ... */
  80. /* macrocell enters suspend mode */
  81.     wCNTR = _GetCNTR();
  82.     wCNTR |= CNTR_FSUSP;
  83.     _SetCNTR(wCNTR);
  84. /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */
  85. /* power reduction */
  86. /* ... on connected devices */
  87.     /* force low-power mode in the macrocell */
  88.     wCNTR = _GetCNTR();
  89.     wCNTR |= CNTR_LPMODE;
  90.     _SetCNTR(wCNTR);
  91.     /* switch-off the clocks */
  92.     /* ... */
  93. }/* Suspend */
  94. /*==========================================================================*/
  95. /* Resume_Init() */
  96. /* handles wake-up restoring normal operations */
  97. /* INPUT : */
  98. /* OUTPUT: */
  99. /*==========================================================================*/
  100. void Resume_Init(void)
  101. {
  102.  WORD wCNTR;
  103.     fCellSuspended= FALSE;
  104. /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */
  105.     /* restart the clocks */
  106.     /* ...  */
  107.     /* CNTR_LPMODE = 0 */
  108.     wCNTR = _GetCNTR();
  109.     wCNTR &= (~CNTR_LPMODE);
  110.     _SetCNTR(wCNTR);
  111. /* restore full power */
  112. /* ... on connected devices */
  113.     /* reset FSUSP bit */
  114.     _SetCNTR(IMR_MSK);
  115. /* reverse suspend preparation */
  116. /* ... */
  117. }/* Resume_Init() */
  118. /*==========================================================================*/
  119. /* Resume() */
  120. /* This is the state machine handling resume operations and timing sequence. */
  121. /* The control is based on the ResumeS structure variables and on the ESOF */
  122. /* interrupt calling this subroutine without changing machine state.*/
  123. /* */
  124. /* IN  : a state machine value (RESUME_STATE) */
  125. /*       RESUME_ESOF does'nt change ResumeS.eState */
  126. /*   allowing decrementing of the ESOF counter in different states */
  127. /* OUT : none */
  128. /*==========================================================================*/
  129. void Resume(RESUME_STATE eResumeSetVal)
  130. {
  131.  WORD wCNTR;
  132.  WORD wRegVal;
  133. if(eResumeSetVal != RESUME_ESOF)
  134. ResumeS.eState = eResumeSetVal;
  135. switch(ResumeS.eState)
  136. {
  137. case RESUME_EXTERNAL:
  138. Resume_Init();
  139.         wRegVal = GetFNR();
  140.      if(wRegVal & FNR_RXDP) /* 10 & 11 false conditions */
  141.       {
  142.            Suspend();
  143.       }
  144.     ResumeS.eState = RESUME_OFF;
  145. break;
  146. case RESUME_INTERNAL:
  147. Resume_Init();
  148.     ResumeS.eState = RESUME_START;
  149. break;
  150. case RESUME_LATER:
  151. ResumeS.bESOFcnt = 2;
  152.     ResumeS.eState = RESUME_WAIT;
  153. break;
  154. case RESUME_WAIT:
  155. ResumeS.bESOFcnt--;
  156. if(ResumeS.bESOFcnt == 0)
  157.     ResumeS.eState = RESUME_START;
  158. break;
  159. case RESUME_START:
  160.     wCNTR = _GetCNTR();
  161.     wCNTR |= CNTR_RESUME;
  162.     _SetCNTR(wCNTR);
  163.     ResumeS.eState = RESUME_ON;
  164.     ResumeS.bESOFcnt = 10;
  165. break;
  166. case RESUME_ON:
  167. ResumeS.bESOFcnt--;
  168. if(ResumeS.bESOFcnt == 0)
  169. {
  170.     wCNTR = _GetCNTR();
  171.     wCNTR &= (~CNTR_RESUME);
  172.     _SetCNTR(wCNTR);
  173.     ResumeS.eState = RESUME_OFF;
  174. }
  175. break;
  176. case RESUME_OFF:
  177. case RESUME_ESOF:
  178. default:
  179.     ResumeS.eState = RESUME_OFF;
  180. break;
  181. }
  182. }/* Resume() */