/** * @brief USBD_DataInStage * Handle data in stage * @param pdev: device instance * @param epnum: endpoint index * @retval status */ static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) { USB_OTG_EP *ep; if(epnum == 0) { ep = &pdev->dev.in_ep[0]; if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN) { if(ep->rem_data_len > ep->maxpacket) { ep->rem_data_len -= ep->maxpacket; if(pdev->cfg.dma_enable == 1) { /* in slave mode this, is handled by the TxFifoEmpty ISR */ ep->xfer_buff += ep->maxpacket; } USBD_CtlContinueSendData (pdev, ep->xfer_buff, ep->rem_data_len); } else { /* last packet is MPS multiple, so send ZLP packet */ if((ep->total_data_len % ep->maxpacket == 0) && (ep->total_data_len >= ep->maxpacket) && (ep->total_data_len < ep->ctl_data_len )) { USBD_CtlContinueSendData(pdev , NULL, 0); ep->ctl_data_len = 0; } else { if((pdev->dev.cb->EP0_TxSent != NULL)&& (pdev->dev.device_status == USB_OTG_CONFIGURED)) { pdev->dev.cb->EP0_TxSent(pdev); } USBD_CtlReceiveStatus(pdev); } } } if (pdev->dev.test_mode == 1) { USBD_RunTestMode(pdev); pdev->dev.test_mode = 0; } } else if((pdev->dev.cb->DataIn != NULL)&& (pdev->dev.device_status == USB_OTG_CONFIGURED)) { pdev->dev.cb->DataIn(pdev, epnum); } return USBD_OK; }
/** * @brief USBD_DataInStage * Handle data in stage * @param pdev: device instance * @param epnum: endpoint index * @retval status */ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, uint8_t *pdata) { USBD_EndpointTypeDef *pep; if(epnum == 0) { pep = &pdev->ep_in[0]; if ( pdev->ep0_state == USBD_EP0_DATA_IN) { if(pep->rem_length > pep->maxpacket) { pep->rem_length -= pep->maxpacket; USBD_CtlContinueSendData (pdev, pdata, pep->rem_length); } else { /* last packet is MPS multiple, so send ZLP packet */ if((pep->total_length % pep->maxpacket == 0) && (pep->total_length >= pep->maxpacket) && (pep->total_length < pdev->ep0_data_len )) { USBD_CtlContinueSendData(pdev , NULL, 0); pdev->ep0_data_len = 0; } else { if((pdev->pClass->EP0_TxSent != NULL)&& (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->EP0_TxSent(pdev); } USBD_CtlReceiveStatus(pdev); } } } if (pdev->dev_test_mode == 1) { USBD_RunTestMode(pdev); pdev->dev_test_mode = 0; } } else if((pdev->pClass->DataIn != NULL)&& (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->DataIn(pdev, epnum); } return USBD_OK; }
/** * @brief USBD_DataInStage * Handle data in stage * @param pdev: device instance * @param epnum: endpoint index * @retval status */ static uint8_t USBD_DataInStage(USB_CORE_HANDLE *pdev , uint8_t epnum) { USB_EP *ep; if(epnum == 0) { ep = &pdev->dev.in_ep[0]; if ( pdev->dev.device_state == USB_EP0_DATA_IN) { if(ep->rem_data_len > ep->maxpacket) { ep->rem_data_len -= ep->maxpacket; USBD_CtlContinueSendData (pdev, ep->xfer_buff, ep->rem_data_len); } else { /* last packet is MPS multiple, so send ZLP packet */ if((ep->total_data_len % ep->maxpacket == 0) && (ep->total_data_len >= ep->maxpacket) && (ep->total_data_len < ep->ctl_data_len )) { USBD_CtlContinueSendData(pdev , NULL, 0); ep->ctl_data_len = 0; } else { if((pdev->dev.class_cb->EP0_TxSent != NULL)&& (pdev->dev.device_status == USB_CONFIGURED)) { pdev->dev.class_cb->EP0_TxSent(pdev); } USBD_CtlReceiveStatus(pdev); } } } else if ((pdev->dev.device_state == USB_EP0_STATUS_IN)&& (ADDRESS!=0)) { DCD_EP_SetAddress(pdev, ADDRESS); ADDRESS = 0; } } else if((pdev->dev.class_cb->DataIn != NULL)&& (pdev->dev.device_status == USB_CONFIGURED)) { pdev->dev.class_cb->DataIn(pdev, epnum); } return USBD_OK; }
/** * @brief USBD_DataInStage * Handle data in stage * @param pdev: device instance * @param epnum: endpoint index * @retval status */ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, uint8_t *pdata) { USBD_EndpointTypeDef *pep; UNUSED(pdata); if(epnum == 0) { pep = &pdev->ep_in[0]; if ( pdev->ep0_state == USBD_EP0_DATA_IN) { if(pep->rem_length > pep->maxpacket) { pep->rem_length -= pep->maxpacket; pdev->pData += pep->maxpacket; /* Prepare endpoint for premature end of transfer */ /* USBD_LL_PrepareReceive (pdev, 0, 0); */ USBD_CtlContinueSendData (pdev, pdev->pData, pep->rem_length); } else { /* last packet is MPS multiple, so send ZLP packet */ if((pep->total_length % pep->maxpacket == 0) && (pep->total_length >= pep->maxpacket) && (pep->total_length < pdev->ep0_data_len )) { /* Prepare endpoint for premature end of transfer */ /* USBD_LL_PrepareReceive (pdev, 0, 0); */ USBD_CtlContinueSendData(pdev , NULL, 0); pdev->ep0_data_len = 0; } else { uint8_t intf; for (intf =0; intf < USBD_MAX_NUM_INTERFACES; intf++) { if(usbd_is_valid_intf(pdev, intf) && (pdev->interfacesClass[intf].pClass->EP0_TxSent != NULL)&& (pdev->dev_state == USBD_STATE_CONFIGURED)) { ((EP0_RxReady_t)PIC(pdev->interfacesClass[intf].pClass->EP0_TxSent))(pdev); } } USBD_CtlReceiveStatus(pdev); } } } if (pdev->dev_test_mode == 1) { USBD_RunTestMode(pdev); pdev->dev_test_mode = 0; } } else { uint8_t intf; for (intf = 0; intf < USBD_MAX_NUM_INTERFACES; intf++) { if( usbd_is_valid_intf(pdev, intf) && (pdev->interfacesClass[intf].pClass->DataIn != NULL)&& (pdev->dev_state == USBD_STATE_CONFIGURED)) { ((DataIn_t)PIC(pdev->interfacesClass[intf].pClass->DataIn))(pdev, epnum); } } } return USBD_OK; }