/**
  * @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;
}
Example #3
0
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);
  }
}