Esempio n. 1
0
/* 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;
}
Esempio n. 2
0
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;

}