/** * @brief Handle_USBAsynchXfer * Send data to USB * @param pdev: instance * @retval None */ static void Handle_USBAsynchXfer (void *pdev) { if(USB_Tx_State != 1) { u8_t *data_p; u16_t len = ringbuf_available_linear(&usb_vcd_ringbuf_tx, &data_p); if (len == 0) { USB_Tx_State = 0; return; } #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED APP_Rx_length &= ~0x03; #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ if (len > CDC_DATA_IN_PACKET_SIZE) { len = CDC_DATA_IN_PACKET_SIZE; } USB_Tx_State = 1; DCD_EP_Tx (pdev, CDC_IN_EP, data_p, len); ringbuf_get(&usb_vcd_ringbuf_tx, 0, len); } }
/** * @brief usbd_audio_DataIn * Data sent on non-control IN endpoint * @param pdev: device instance * @param epnum: endpoint number * @retval status */ static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum) { if (USB_Tx_State == 1) { u8_t *data_p; u16_t len = ringbuf_available_linear(&usb_vcd_ringbuf_tx, &data_p); if (len == 0) { USB_Tx_State = 0; } else { if (len > CDC_DATA_IN_PACKET_SIZE){ len = CDC_DATA_IN_PACKET_SIZE; } /* Prepare the available data buffer to be sent on IN endpoint */ DCD_EP_Tx (pdev, CDC_IN_EP, data_p, len); ringbuf_get(&usb_vcd_ringbuf_tx, 0, len); } } return USBD_OK; }
void EP7_IN_Callback (void) { if (USB_Tx_State == 1) { u8_t *buf; int avail = ringbuf_available_linear(&tx_rb, &buf); if (avail == 0) { USB_Tx_State = 0; return; } if (avail > VIRTUAL_COM_PORT_DATA_SIZE) { avail = VIRTUAL_COM_PORT_DATA_SIZE; } UserToPMABufferCopy(buf, ENDP7_TXADDR, avail); ringbuf_get(&tx_rb, 0, avail); SetEPTxCount(ENDP7, avail); SetEPTxValid(ENDP7); } }