/* UCOM bulk EP_IN and EP_OUT endpoints handler */ static ErrorCode_t UCOM_bulk_hdlr(USBD_HANDLE_T hUsb, void *data, uint32_t event) { UCOM_DATA_T *pUcom = (UCOM_DATA_T *) data; uint32_t count = 0; switch (event) { /* A transfer from us to the USB host that we queued has completed. */ case USB_EVT_IN: /* check if UART had more data to send */ if (pUcom->rxBuf_uartIndex < pUcom->rxBuf_usbIndex) { count = UCOM_BUF_SZ - pUcom->rxBuf_usbIndex; } else { count = pUcom->rxBuf_uartIndex - pUcom->rxBuf_usbIndex; } if (count) { pUcom->usbTxBusy = 1; count = USBD_API->hw->WriteEP(pUcom->hUsb, USB_CDC_IN_EP, &pUcom->rxBuf[g_uCOM.rxBuf_usbIndex], count); g_uCOM.rxBuf_usbIndex = (g_uCOM.rxBuf_usbIndex + count) & (UCOM_BUF_SZ - 1); } else { pUcom->usbTxBusy = 0; } break; /* We received a transfer from the USB host . */ case USB_EVT_OUT: if ((Chip_UART_GetIntsEnabled(LPC_USART) & UART_IER_THREINT) == 0) { pUcom->txBuf_count = USBD_API->hw->ReadEP(hUsb, USB_CDC_OUT_EP, pUcom->txBuf); pUcom->txBuf_uartIndex = 0; /* kick start UART tranmission */ pUcom->txBuf_uartIndex = Chip_UART_Send(LPC_USART, &pUcom->txBuf[g_uCOM.txBuf_uartIndex], pUcom->txBuf_count); pUcom->txBuf_count -= pUcom->txBuf_uartIndex; /* Enable UART transmit interrupt */ Chip_UART_IntEnable(LPC_USART, UART_IER_THREINT); } else { pUcom->usbRxPending++; } break; default: break; } return LPC_OK; }
static ErrorCode_t UCOM_bulk_hdlrOutGeneric(USBD_HANDLE_T hUsb, void *data, uint32_t event) { UCOM_DATA_T *pUcom = (UCOM_DATA_T *) data; switch (event) { case USB_EVT_OUT: if(pUcom->selected!=0){ if ((Chip_UART_GetIntsEnabled(pUcom->selected) & UART_IER_THREINT) == 0) { pUcom->txBuf_count = USBD_API->hw->ReadEP(hUsb, pUcom->outEndpoint, pUcom->txBuf); pUcom->txBuf_uartIndex = 0; /* kick start UART tranmission */ pUcom->txBuf_uartIndex = Chip_UART_Send(pUcom->selected, &pUcom->txBuf[pUcom->txBuf_uartIndex], pUcom->txBuf_count); pUcom->txBuf_count -= pUcom->txBuf_uartIndex; /* Enable UART transmit interrupt */ Chip_UART_IntEnable(pUcom->selected, UART_IER_THREINT); } else { pUcom->usbRxPending++; } return LPC_OK; } break; break; default: break; } return ERR_USBD_UNHANDLED; }