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

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : usb_istr.c
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 27/10/2003
  5. * Description        : ISTR events interrupt service routines
  6. ********************************************************************************/
  7. #include "71x_lib.h"
  8. #include "USB_lib.h"
  9. #include "USB_conf.h"
  10. #include "USB_prop.h"
  11. #include "USB_pwr.h"
  12. volatile WORD wIstr;  /* ISTR register last read value */
  13. WORD wIstrCnt[9]={0,0,0,0,0,0,0,0,0};
  14. typedef enum _EVCOUNT{CTRcnt,DOVRcnt,ERRcnt,WKUPcnt,SUSPcnt,RESETcnt,SOFcnt,ESOFcnt,GENERcnt} EVCOUNT;
  15. volatile BYTE bIntPackSOF=0;  /* SOFs received between 2 consecutive packets */
  16. BOOL fConnected=FALSE; /* connection status */
  17. void USB_Istr(void);
  18. //#ifdef SERIAL_AVAILABLE
  19. //void IRQ_serial(void);
  20. //#endif
  21. /* function prototypes */
  22. /* automatically built defining related macros */
  23. #ifdef CTR_Callback
  24. void CTR_Callback(void);
  25. #endif
  26. #ifdef DOVR_Callback
  27. void DOVR_Callback(void);
  28. #endif
  29. #ifdef ERR_Callback
  30. void ERR_Callback(void);
  31. #endif
  32. #ifdef WKUP_Callback
  33. void WKUP_Callback(void);
  34. #endif
  35. #ifdef SUSP_Callback
  36. void SUSP_Callback(void);
  37. #endif
  38. #ifdef RESET_Callback
  39. void RESET_Callback(void);
  40. #endif
  41. #ifdef SOF_Callback
  42. void SOF_Callback(void);
  43. #endif
  44. #ifdef ESOF_Callback
  45. void ESOF_Callback(void);
  46. #endif
  47. extern void EP1_Callback(void);
  48. extern void EP2_Callback(void);
  49. extern void EP3_Callback(void);
  50. extern void EP4_Callback(void);
  51. extern void EP5_Callback(void);
  52. extern void EP6_Callback(void);
  53. extern void EP7_Callback(void);
  54. extern void EP8_Callback(void);
  55. extern void EP9_Callback(void);
  56. extern void EP10_Callback(void);
  57. extern void EP11_Callback(void);
  58. extern void EP12_Callback(void);
  59. extern void EP13_Callback(void);
  60. extern void EP14_Callback(void);
  61. extern void EP15_Callback(void);
  62. /* function pointers to non-control endpoints service routines */
  63. void (*pEpInt[15])(void)={
  64. EP1_Callback,
  65. EP2_Callback,
  66. EP3_Callback,
  67. EP4_Callback,
  68. EP5_Callback,
  69. EP6_Callback,
  70. EP7_Callback,
  71. EP8_Callback,
  72. EP9_Callback,
  73. EP10_Callback,
  74. EP11_Callback,
  75. EP12_Callback,
  76. EP13_Callback,
  77. EP14_Callback,
  78. EP15_Callback
  79. };
  80. /*==============================================================================*/
  81. /* USB_Istr */
  82. /*==============================================================================*/
  83. void USB_Istr(void)
  84. {
  85. wIstr = _GetISTR();
  86. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  87. #if (IMR_MSK & ISTR_RESET)
  88. if (wIstr & ISTR_RESET & wInterrupt_Mask) {
  89. _SetISTR((WORD)CLR_RESET);
  90. Device_Property.Reset();
  91. #ifdef RESET_Callback
  92.      RESET_Callback();
  93. #endif
  94. }
  95. #endif
  96. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  97. #if (IMR_MSK & ISTR_DOVR)
  98. if (wIstr & ISTR_DOVR & wInterrupt_Mask) {
  99. _SetISTR((WORD)CLR_DOVR);
  100. #ifdef DOVR_Callback
  101. DOVR_Callback();
  102. #endif
  103. }
  104. #endif
  105. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  106. #if (IMR_MSK & ISTR_ERR)
  107. if (wIstr & ISTR_ERR & wInterrupt_Mask) {
  108. _SetISTR((WORD)CLR_ERR);
  109. #ifdef ERR_Callback
  110. ERR_Callback();
  111. #endif
  112. }
  113. #endif
  114. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  115. #if (IMR_MSK & ISTR_WKUP)
  116. if (wIstr & ISTR_WKUP & wInterrupt_Mask) {
  117. _SetISTR((WORD)CLR_WKUP);
  118. Resume(RESUME_EXTERNAL);
  119. #ifdef WKUP_Callback
  120. WKUP_Callback();
  121. #endif
  122. }
  123. #endif
  124. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  125. #if (IMR_MSK & ISTR_SUSP)
  126. if (wIstr & ISTR_SUSP & wInterrupt_Mask) {
  127. /* check if SUSPEND is possible */
  128. if(fSuspendEnabled)
  129. {
  130. Suspend();
  131. }
  132. else
  133. {
  134. /* if not possible then resume after xx ms */
  135.     Resume(RESUME_LATER);
  136. }
  137. /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
  138. _SetISTR((WORD)CLR_SUSP);
  139. #ifdef SUSP_Callback
  140. SUSP_Callback();
  141. #endif
  142. }
  143. #endif
  144. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  145. #if (IMR_MSK & ISTR_SOF)
  146. if (wIstr & ISTR_SOF & wInterrupt_Mask) {
  147. _SetISTR((WORD)CLR_SOF);
  148. bIntPackSOF++;
  149. #ifdef SOF_Callback
  150. SOF_Callback();
  151. #endif
  152. }
  153. #endif
  154. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  155. #if (IMR_MSK & ISTR_ESOF)
  156. if (wIstr & ISTR_ESOF & wInterrupt_Mask) {
  157. _SetISTR((WORD)CLR_ESOF);
  158. /* resume handling timing is made with ESOFs */
  159. Resume(RESUME_ESOF); /* request without change of the machine state */
  160. #ifdef ESOF_Callback
  161. ESOF_Callback();
  162. #endif
  163. }
  164. #endif
  165. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  166. #if (IMR_MSK & ISTR_CTR)
  167. if (wIstr & ISTR_CTR & wInterrupt_Mask) {
  168. /* servicing of the endpoint correct transfer interrupt */
  169. /* clear of the CTR flag into the sub */
  170. CTR_ISR();
  171. #ifdef CTR_Callback
  172. CTR_Callback();
  173. #endif
  174. }
  175. #endif
  176. } /* USB_Istr */
  177. /*==============================================================================*/
  178. /*==============================================================================*/
  179. #ifdef CTR_Callback
  180. void count_CTR()
  181. {
  182. wIstrCnt[CTRcnt]++;
  183. }
  184. #endif
  185. /*==============================================================================*/
  186. #ifdef DOVR_Callback
  187. void count_DOVR()
  188. {
  189. wIstrCnt[DOVRcnt]++;
  190. }
  191. #endif
  192. /*==============================================================================*/
  193. #ifdef ERR_Callback
  194. void count_ERR()
  195. {
  196. wIstrCnt[ERRcnt]++;
  197. }
  198. #endif
  199. /*==============================================================================*/
  200. #ifdef WKUP_Callback
  201. void count_WKUP()
  202. {
  203. wIstrCnt[WKUPcnt]++;
  204. }
  205. #endif
  206. /*==============================================================================*/
  207. #ifdef SUSP_Callback
  208. void count_SUSP()
  209. {
  210. wIstrCnt[SUSPcnt]++;
  211. }
  212. #endif
  213. /*==============================================================================*/
  214. #ifdef RESET_Callback
  215. void count_RESET()
  216. {
  217. wIstrCnt[RESETcnt]++;
  218. }
  219. #endif
  220. /*==============================================================================*/
  221. #ifdef SOF_Callback
  222. void count_SOF()
  223. {
  224. wIstrCnt[SOFcnt]++;
  225. }
  226. #endif
  227. /*==============================================================================*/
  228. #ifdef ESOF_Callback
  229. void count_ESOF()
  230. {
  231. wIstrCnt[ESOFcnt]++;
  232. }
  233. #endif