Handles PCD interrupt request.
This function handles PCD interrupt request.
1048 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1049 uint32_t USBx_BASE = (uint32_t)USBx;
1050 uint32_t i, ep_intr, epint, epnum = 0U;
1051 uint32_t fifoemptymsk, temp;
1055 if (
USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE)
1058 if (__HAL_PCD_IS_INVALID_INTERRUPT(hpcd))
1063 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS))
1066 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS);
1069 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT))
1076 while (ep_intr != 0U)
1078 if ((ep_intr & 0x1U) != 0U)
1082 if ((epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC)
1084 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC);
1088 if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP)
1092 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP);
1095 if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS)
1097 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS);
1101 if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR)
1103 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);
1107 if ((epint & USB_OTG_DOEPINT_NAK) == USB_OTG_DOEPINT_NAK)
1109 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_NAK);
1117 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT))
1124 while (ep_intr != 0U)
1126 if ((ep_intr & 0x1U) != 0U)
1130 if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC)
1132 fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));
1133 USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
1135 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC);
1137 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1138 hpcd->DataInStageCallback(hpcd, (uint8_t)epnum);
1143 if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC)
1145 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC);
1147 if ((epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE)
1149 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE);
1151 if ((epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE)
1153 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE);
1155 if ((epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD)
1157 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD);
1159 if ((epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE)
1170 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT))
1173 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
1175 if (hpcd->LPM_State ==
LPM_L1)
1177 hpcd->LPM_State =
LPM_L0;
1179 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1187 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1188 hpcd->ResumeCallback(hpcd);
1194 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT);
1198 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP))
1200 if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)
1202 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1203 hpcd->SuspendCallback(hpcd);
1208 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP);
1212 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT))
1214 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT);
1216 if (hpcd->LPM_State ==
LPM_L0)
1218 hpcd->LPM_State =
LPM_L1;
1219 hpcd->BESL = (hpcd->Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >> 2U;
1221 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1229 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1230 hpcd->SuspendCallback(hpcd);
1238 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST))
1240 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
1243 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
1245 USBx_INEP(i)->DIEPINT = 0xFB7FU;
1246 USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL;
1247 USBx_OUTEP(i)->DOEPINT = 0xFB7FU;
1248 USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL;
1250 USBx_DEVICE->DAINTMSK |= 0x10001U;
1252 if (hpcd->Init.use_dedicated_ep1 != 0U)
1254 USBx_DEVICE->DOUTEP1MSK |= USB_OTG_DOEPMSK_STUPM |
1255 USB_OTG_DOEPMSK_XFRCM |
1256 USB_OTG_DOEPMSK_EPDM;
1258 USBx_DEVICE->DINEP1MSK |= USB_OTG_DIEPMSK_TOM |
1259 USB_OTG_DIEPMSK_XFRCM |
1260 USB_OTG_DIEPMSK_EPDM;
1264 USBx_DEVICE->DOEPMSK |= USB_OTG_DOEPMSK_STUPM |
1265 USB_OTG_DOEPMSK_XFRCM |
1266 USB_OTG_DOEPMSK_EPDM |
1267 USB_OTG_DOEPMSK_OTEPSPRM |
1268 USB_OTG_DOEPMSK_NAKM;
1270 USBx_DEVICE->DIEPMSK |= USB_OTG_DIEPMSK_TOM |
1271 USB_OTG_DIEPMSK_XFRCM |
1272 USB_OTG_DIEPMSK_EPDM;
1276 USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD;
1281 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST);
1285 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE))
1293 (uint8_t)hpcd->Init.speed);
1295 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1296 hpcd->ResetCallback(hpcd);
1301 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE);
1305 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL))
1307 USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
1309 temp = USBx->GRXSTSP;
1311 ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM];
1313 if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT)
1315 if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U)
1318 (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4));
1320 ep->
xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
1321 ep->
xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
1324 else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT)
1327 ep->
xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
1333 USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
1337 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF))
1339 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1340 hpcd->SOFCallback(hpcd);
1345 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF);
1349 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR))
1351 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1352 hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum);
1357 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR);
1361 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
1363 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1364 hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum);
1369 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
1373 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT))
1375 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1376 hpcd->ConnectCallback(hpcd);
1381 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT);
1385 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT))
1387 temp = hpcd->Instance->GOTGINT;
1389 if ((temp & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET)
1391 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 1392 hpcd->DisconnectCallback(hpcd);
1397 hpcd->Instance->GOTGINT |= temp;
static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
process EP OUT setup packet received interrupt.
uint32_t USB_ReadDevOutEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum)
Returns Device OUT EP Interrupt register.
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
Resume event callback.
void * USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len)
USB_ReadPacket : read a packet from the RX FIFO.
HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t *psetup)
Prepare the EP0 to start the first control setup.
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
USB Start Of Frame callback.
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Incomplete ISO IN callback.
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Data IN stage callback.
HAL_StatusTypeDef USB_ActivateSetup(USB_OTG_GlobalTypeDef *USBx)
Activate EP0 for Setup transactions.
uint32_t USB_ReadDevAllOutEpInterrupt(USB_OTG_GlobalTypeDef *USBx)
USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status.
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
USB Reset callback.
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Incomplete ISO OUT callback.
static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
Check FIFO for the next packet to be loaded.
uint32_t USB_ReadDevInEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum)
Returns Device IN EP Interrupt register.
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
Suspend event callback.
uint32_t USB_ReadDevAllInEpInterrupt(USB_OTG_GlobalTypeDef *USBx)
USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status. ...
static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
process EP OUT transfer complete interrupt.
HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, uint32_t hclk, uint8_t speed)
Set the USB turnaround time.
uint32_t HAL_RCC_GetHCLKFreq(void)
Return the HCLK frequency.
void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
Send LPM message to user layer callback.
uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx)
USB_GetDevSpeed Return the Dev Speed.
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
Disconnection event callback.
HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num)
USB_OTG_FlushTxFifo : Flush a Tx FIFO.
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
Connection event callback.
uint32_t USB_GetMode(USB_OTG_GlobalTypeDef *USBx)
Returns USB core mode.