/** * @brief Send an amount of data * @param hpcd: PCD handle * @param ep_addr: endpoint address * @param pBuf: pointer to the transmission buffer * @param len: amount of data to be sent * @retval HAL status */ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) { PCD_EPTypeDef *ep; uint16_t pmabuffer = 0; ep = &hpcd->IN_ep[ep_addr & 0x7F]; /*setup and start the Xfer */ ep->xfer_buff = pBuf; ep->xfer_len = len; ep->xfer_count = 0; ep->is_in = 1; ep->num = ep_addr & 0x7F; __HAL_LOCK(hpcd); /*Multi packet transfer*/ if (ep->xfer_len > ep->maxpacket) { len=ep->maxpacket; ep->xfer_len-=len; } else { len=ep->xfer_len; ep->xfer_len =0; } /* configure and validate Tx endpoint */ if (ep->doublebuffer == 0) { PCD_WritePMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, len); PCD_SET_EP_TX_CNT(hpcd->Instance, ep->num, len); } else { /*Write the data to the USB endpoint*/ if (PCD_GET_ENDPOINT(hpcd->Instance, ep->num)& USB_EP_DTOG_TX) { /*Set the Double buffer counter for pmabuffer1*/ PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, len); pmabuffer = ep->pmaaddr1; } else { /*Set the Double buffer counter for pmabuffer0*/ PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, len); pmabuffer = ep->pmaaddr0; } PCD_WritePMA(hpcd->Instance, ep->xfer_buff, pmabuffer, len); PCD_FreeUserBuffer(hpcd->Instance, ep->num, ep->is_in); } PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_VALID); __HAL_UNLOCK(hpcd); return HAL_OK; }
/** * @brief Receive an amount of data * @param hpcd: PCD handle * @param ep_addr: endpoint address * @param pBuf: pointer to the reception buffer * @param len: amount of data to be received * @retval HAL status */ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) { PCD_EPTypeDef *ep; ep = &hpcd->OUT_ep[ep_addr & 0x7F]; /*setup and start the Xfer */ ep->xfer_buff = pBuf; ep->xfer_len = len; ep->xfer_count = 0; ep->is_in = 0; ep->num = ep_addr & 0x7F; __HAL_LOCK(hpcd); /* Multi packet transfer*/ if (ep->xfer_len > ep->maxpacket) { len=ep->maxpacket; ep->xfer_len-=len; } else { len=ep->xfer_len; ep->xfer_len =0; } /* configure and validate Rx endpoint */ if (ep->doublebuffer == 0) { /*Set RX buffer count*/ PCD_SET_EP_RX_CNT(hpcd->Instance, ep->num, len); } else { /*Set the Double buffer counter*/ PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, len); } PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_VALID); __HAL_UNLOCK(hpcd); return HAL_OK; }