I'm trying to port GRBL 1.1 to the STM32F746 chip. Tell me the solution, thanks.
stm_usb_fs_lib/src/usb_int.c@0:8f0d870509fe, 2017-09-04 (annotated)
- Committer:
- Sergunb
- Date:
- Mon Sep 04 12:04:13 2017 +0000
- Revision:
- 0:8f0d870509fe
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Sergunb | 0:8f0d870509fe | 1 | /******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** |
Sergunb | 0:8f0d870509fe | 2 | * File Name : usb_int.c |
Sergunb | 0:8f0d870509fe | 3 | * Author : MCD Application Team |
Sergunb | 0:8f0d870509fe | 4 | * Version : V3.2.1 |
Sergunb | 0:8f0d870509fe | 5 | * Date : 07/05/2010 |
Sergunb | 0:8f0d870509fe | 6 | * Description : Endpoint CTR (Low and High) interrupt's service routines |
Sergunb | 0:8f0d870509fe | 7 | ******************************************************************************** |
Sergunb | 0:8f0d870509fe | 8 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS |
Sergunb | 0:8f0d870509fe | 9 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. |
Sergunb | 0:8f0d870509fe | 10 | * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, |
Sergunb | 0:8f0d870509fe | 11 | * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE |
Sergunb | 0:8f0d870509fe | 12 | * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING |
Sergunb | 0:8f0d870509fe | 13 | * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. |
Sergunb | 0:8f0d870509fe | 14 | *******************************************************************************/ |
Sergunb | 0:8f0d870509fe | 15 | #ifndef STM32F10X_CL |
Sergunb | 0:8f0d870509fe | 16 | |
Sergunb | 0:8f0d870509fe | 17 | /* Includes ------------------------------------------------------------------*/ |
Sergunb | 0:8f0d870509fe | 18 | #include "usb_lib.h" |
Sergunb | 0:8f0d870509fe | 19 | |
Sergunb | 0:8f0d870509fe | 20 | /* Private typedef -----------------------------------------------------------*/ |
Sergunb | 0:8f0d870509fe | 21 | /* Private define ------------------------------------------------------------*/ |
Sergunb | 0:8f0d870509fe | 22 | /* Private macro -------------------------------------------------------------*/ |
Sergunb | 0:8f0d870509fe | 23 | /* Private variables ---------------------------------------------------------*/ |
Sergunb | 0:8f0d870509fe | 24 | __IO uint16_t SaveRState; |
Sergunb | 0:8f0d870509fe | 25 | __IO uint16_t SaveTState; |
Sergunb | 0:8f0d870509fe | 26 | |
Sergunb | 0:8f0d870509fe | 27 | /* Extern variables ----------------------------------------------------------*/ |
Sergunb | 0:8f0d870509fe | 28 | extern void (*pEpInt_IN[7])(void); /* Handles IN interrupts */ |
Sergunb | 0:8f0d870509fe | 29 | extern void (*pEpInt_OUT[7])(void); /* Handles OUT interrupts */ |
Sergunb | 0:8f0d870509fe | 30 | |
Sergunb | 0:8f0d870509fe | 31 | /* Private function prototypes -----------------------------------------------*/ |
Sergunb | 0:8f0d870509fe | 32 | /* Private functions ---------------------------------------------------------*/ |
Sergunb | 0:8f0d870509fe | 33 | |
Sergunb | 0:8f0d870509fe | 34 | /******************************************************************************* |
Sergunb | 0:8f0d870509fe | 35 | * Function Name : CTR_LP. |
Sergunb | 0:8f0d870509fe | 36 | * Description : Low priority Endpoint Correct Transfer interrupt's service |
Sergunb | 0:8f0d870509fe | 37 | * routine. |
Sergunb | 0:8f0d870509fe | 38 | * Input : None. |
Sergunb | 0:8f0d870509fe | 39 | * Output : None. |
Sergunb | 0:8f0d870509fe | 40 | * Return : None. |
Sergunb | 0:8f0d870509fe | 41 | *******************************************************************************/ |
Sergunb | 0:8f0d870509fe | 42 | void CTR_LP(void) |
Sergunb | 0:8f0d870509fe | 43 | { |
Sergunb | 0:8f0d870509fe | 44 | __IO uint16_t wEPVal = 0; |
Sergunb | 0:8f0d870509fe | 45 | /* stay in loop while pending ints */ |
Sergunb | 0:8f0d870509fe | 46 | while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) |
Sergunb | 0:8f0d870509fe | 47 | { |
Sergunb | 0:8f0d870509fe | 48 | /* extract highest priority endpoint number */ |
Sergunb | 0:8f0d870509fe | 49 | EPindex = (uint8_t)(wIstr & ISTR_EP_ID); |
Sergunb | 0:8f0d870509fe | 50 | if (EPindex == 0) |
Sergunb | 0:8f0d870509fe | 51 | { |
Sergunb | 0:8f0d870509fe | 52 | /* Decode and service control endpoint interrupt */ |
Sergunb | 0:8f0d870509fe | 53 | /* calling related service routine */ |
Sergunb | 0:8f0d870509fe | 54 | /* (Setup0_Process, In0_Process, Out0_Process) */ |
Sergunb | 0:8f0d870509fe | 55 | |
Sergunb | 0:8f0d870509fe | 56 | /* save RX & TX status */ |
Sergunb | 0:8f0d870509fe | 57 | /* and set both to NAK */ |
Sergunb | 0:8f0d870509fe | 58 | |
Sergunb | 0:8f0d870509fe | 59 | |
Sergunb | 0:8f0d870509fe | 60 | SaveRState = _GetENDPOINT(ENDP0); |
Sergunb | 0:8f0d870509fe | 61 | SaveTState = SaveRState & EPTX_STAT; |
Sergunb | 0:8f0d870509fe | 62 | SaveRState &= EPRX_STAT; |
Sergunb | 0:8f0d870509fe | 63 | |
Sergunb | 0:8f0d870509fe | 64 | _SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK); |
Sergunb | 0:8f0d870509fe | 65 | |
Sergunb | 0:8f0d870509fe | 66 | /* DIR bit = origin of the interrupt */ |
Sergunb | 0:8f0d870509fe | 67 | |
Sergunb | 0:8f0d870509fe | 68 | if ((wIstr & ISTR_DIR) == 0) |
Sergunb | 0:8f0d870509fe | 69 | { |
Sergunb | 0:8f0d870509fe | 70 | /* DIR = 0 */ |
Sergunb | 0:8f0d870509fe | 71 | |
Sergunb | 0:8f0d870509fe | 72 | /* DIR = 0 => IN int */ |
Sergunb | 0:8f0d870509fe | 73 | /* DIR = 0 implies that (EP_CTR_TX = 1) always */ |
Sergunb | 0:8f0d870509fe | 74 | |
Sergunb | 0:8f0d870509fe | 75 | |
Sergunb | 0:8f0d870509fe | 76 | _ClearEP_CTR_TX(ENDP0); |
Sergunb | 0:8f0d870509fe | 77 | In0_Process(); |
Sergunb | 0:8f0d870509fe | 78 | |
Sergunb | 0:8f0d870509fe | 79 | /* before terminate set Tx & Rx status */ |
Sergunb | 0:8f0d870509fe | 80 | |
Sergunb | 0:8f0d870509fe | 81 | _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); |
Sergunb | 0:8f0d870509fe | 82 | return; |
Sergunb | 0:8f0d870509fe | 83 | } |
Sergunb | 0:8f0d870509fe | 84 | else |
Sergunb | 0:8f0d870509fe | 85 | { |
Sergunb | 0:8f0d870509fe | 86 | /* DIR = 1 */ |
Sergunb | 0:8f0d870509fe | 87 | |
Sergunb | 0:8f0d870509fe | 88 | /* DIR = 1 & CTR_RX => SETUP or OUT int */ |
Sergunb | 0:8f0d870509fe | 89 | /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */ |
Sergunb | 0:8f0d870509fe | 90 | |
Sergunb | 0:8f0d870509fe | 91 | wEPVal = _GetENDPOINT(ENDP0); |
Sergunb | 0:8f0d870509fe | 92 | |
Sergunb | 0:8f0d870509fe | 93 | if ((wEPVal &EP_SETUP) != 0) |
Sergunb | 0:8f0d870509fe | 94 | { |
Sergunb | 0:8f0d870509fe | 95 | _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */ |
Sergunb | 0:8f0d870509fe | 96 | Setup0_Process(); |
Sergunb | 0:8f0d870509fe | 97 | /* before terminate set Tx & Rx status */ |
Sergunb | 0:8f0d870509fe | 98 | |
Sergunb | 0:8f0d870509fe | 99 | _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); |
Sergunb | 0:8f0d870509fe | 100 | return; |
Sergunb | 0:8f0d870509fe | 101 | } |
Sergunb | 0:8f0d870509fe | 102 | |
Sergunb | 0:8f0d870509fe | 103 | else if ((wEPVal & EP_CTR_RX) != 0) |
Sergunb | 0:8f0d870509fe | 104 | { |
Sergunb | 0:8f0d870509fe | 105 | _ClearEP_CTR_RX(ENDP0); |
Sergunb | 0:8f0d870509fe | 106 | Out0_Process(); |
Sergunb | 0:8f0d870509fe | 107 | /* before terminate set Tx & Rx status */ |
Sergunb | 0:8f0d870509fe | 108 | |
Sergunb | 0:8f0d870509fe | 109 | _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); |
Sergunb | 0:8f0d870509fe | 110 | return; |
Sergunb | 0:8f0d870509fe | 111 | } |
Sergunb | 0:8f0d870509fe | 112 | } |
Sergunb | 0:8f0d870509fe | 113 | }/* if(EPindex == 0) */ |
Sergunb | 0:8f0d870509fe | 114 | else |
Sergunb | 0:8f0d870509fe | 115 | { |
Sergunb | 0:8f0d870509fe | 116 | /* Decode and service non control endpoints interrupt */ |
Sergunb | 0:8f0d870509fe | 117 | |
Sergunb | 0:8f0d870509fe | 118 | /* process related endpoint register */ |
Sergunb | 0:8f0d870509fe | 119 | wEPVal = _GetENDPOINT(EPindex); |
Sergunb | 0:8f0d870509fe | 120 | if ((wEPVal & EP_CTR_RX) != 0) |
Sergunb | 0:8f0d870509fe | 121 | { |
Sergunb | 0:8f0d870509fe | 122 | /* clear int flag */ |
Sergunb | 0:8f0d870509fe | 123 | _ClearEP_CTR_RX(EPindex); |
Sergunb | 0:8f0d870509fe | 124 | |
Sergunb | 0:8f0d870509fe | 125 | /* call OUT service function */ |
Sergunb | 0:8f0d870509fe | 126 | (*pEpInt_OUT[EPindex-1])(); |
Sergunb | 0:8f0d870509fe | 127 | |
Sergunb | 0:8f0d870509fe | 128 | } /* if((wEPVal & EP_CTR_RX) */ |
Sergunb | 0:8f0d870509fe | 129 | |
Sergunb | 0:8f0d870509fe | 130 | if ((wEPVal & EP_CTR_TX) != 0) |
Sergunb | 0:8f0d870509fe | 131 | { |
Sergunb | 0:8f0d870509fe | 132 | /* clear int flag */ |
Sergunb | 0:8f0d870509fe | 133 | _ClearEP_CTR_TX(EPindex); |
Sergunb | 0:8f0d870509fe | 134 | |
Sergunb | 0:8f0d870509fe | 135 | /* call IN service function */ |
Sergunb | 0:8f0d870509fe | 136 | (*pEpInt_IN[EPindex-1])(); |
Sergunb | 0:8f0d870509fe | 137 | } /* if((wEPVal & EP_CTR_TX) != 0) */ |
Sergunb | 0:8f0d870509fe | 138 | |
Sergunb | 0:8f0d870509fe | 139 | }/* if(EPindex == 0) else */ |
Sergunb | 0:8f0d870509fe | 140 | |
Sergunb | 0:8f0d870509fe | 141 | }/* while(...) */ |
Sergunb | 0:8f0d870509fe | 142 | } |
Sergunb | 0:8f0d870509fe | 143 | |
Sergunb | 0:8f0d870509fe | 144 | /******************************************************************************* |
Sergunb | 0:8f0d870509fe | 145 | * Function Name : CTR_HP. |
Sergunb | 0:8f0d870509fe | 146 | * Description : High Priority Endpoint Correct Transfer interrupt's service |
Sergunb | 0:8f0d870509fe | 147 | * routine. |
Sergunb | 0:8f0d870509fe | 148 | * Input : None. |
Sergunb | 0:8f0d870509fe | 149 | * Output : None. |
Sergunb | 0:8f0d870509fe | 150 | * Return : None. |
Sergunb | 0:8f0d870509fe | 151 | *******************************************************************************/ |
Sergunb | 0:8f0d870509fe | 152 | void CTR_HP(void) |
Sergunb | 0:8f0d870509fe | 153 | { |
Sergunb | 0:8f0d870509fe | 154 | uint32_t wEPVal = 0; |
Sergunb | 0:8f0d870509fe | 155 | |
Sergunb | 0:8f0d870509fe | 156 | while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) |
Sergunb | 0:8f0d870509fe | 157 | { |
Sergunb | 0:8f0d870509fe | 158 | _SetISTR((uint16_t)CLR_CTR); /* clear CTR flag */ |
Sergunb | 0:8f0d870509fe | 159 | /* extract highest priority endpoint number */ |
Sergunb | 0:8f0d870509fe | 160 | EPindex = (uint8_t)(wIstr & ISTR_EP_ID); |
Sergunb | 0:8f0d870509fe | 161 | /* process related endpoint register */ |
Sergunb | 0:8f0d870509fe | 162 | wEPVal = _GetENDPOINT(EPindex); |
Sergunb | 0:8f0d870509fe | 163 | if ((wEPVal & EP_CTR_RX) != 0) |
Sergunb | 0:8f0d870509fe | 164 | { |
Sergunb | 0:8f0d870509fe | 165 | /* clear int flag */ |
Sergunb | 0:8f0d870509fe | 166 | _ClearEP_CTR_RX(EPindex); |
Sergunb | 0:8f0d870509fe | 167 | |
Sergunb | 0:8f0d870509fe | 168 | /* call OUT service function */ |
Sergunb | 0:8f0d870509fe | 169 | (*pEpInt_OUT[EPindex-1])(); |
Sergunb | 0:8f0d870509fe | 170 | |
Sergunb | 0:8f0d870509fe | 171 | } /* if((wEPVal & EP_CTR_RX) */ |
Sergunb | 0:8f0d870509fe | 172 | else if ((wEPVal & EP_CTR_TX) != 0) |
Sergunb | 0:8f0d870509fe | 173 | { |
Sergunb | 0:8f0d870509fe | 174 | /* clear int flag */ |
Sergunb | 0:8f0d870509fe | 175 | _ClearEP_CTR_TX(EPindex); |
Sergunb | 0:8f0d870509fe | 176 | |
Sergunb | 0:8f0d870509fe | 177 | /* call IN service function */ |
Sergunb | 0:8f0d870509fe | 178 | (*pEpInt_IN[EPindex-1])(); |
Sergunb | 0:8f0d870509fe | 179 | |
Sergunb | 0:8f0d870509fe | 180 | |
Sergunb | 0:8f0d870509fe | 181 | } /* if((wEPVal & EP_CTR_TX) != 0) */ |
Sergunb | 0:8f0d870509fe | 182 | |
Sergunb | 0:8f0d870509fe | 183 | }/* while(...) */ |
Sergunb | 0:8f0d870509fe | 184 | } |
Sergunb | 0:8f0d870509fe | 185 | |
Sergunb | 0:8f0d870509fe | 186 | #endif /* STM32F10X_CL */ |
Sergunb | 0:8f0d870509fe | 187 | |
Sergunb | 0:8f0d870509fe | 188 | /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ |