#include <stdio.h>
#include <stdlib.h>
+#include <stdalign.h>
#include "usb_device_config.h"
#include "usb.h"
#include "usb_phy.h"
#endif
+#include "ringbuf.h"
+#include "buffer.h"
+
/* Provided by users. */
extern void USB_DeviceClockInit(void);
extern void USB_DeviceIsrEnable(void);
/*******************************************************************************
* Variables
******************************************************************************/
+
+static uint8_t cdc_rx_buf_space[1024];
+static uint8_t cdc_tx_buf_space[1024] alignas(4);
+
+static struct ringbuf cdc_rx_buf =
+ RINGBUF_INIT (cdc_rx_buf_space, sizeof (cdc_rx_buf_space));
+
+struct buffer cdc_tx_buf;
+
/* Data structure of virtual com device */
usb_cdc_vcom_struct_t s_cdcVcom;
{
/* User: add your own code for send complete event */
s_sendComplete = 1;
+ USB_DeviceRecvRequest (handle, USB_CDC_VCOM_BULK_OUT_ENDPOINT, s_currRecvBuf, s_usbBulkMaxPacketSize);
#if defined(FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED) && (FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED > 0U) && \
defined(USB_DEVICE_CONFIG_KEEP_ALIVE_MODE) && (USB_DEVICE_CONFIG_KEEP_ALIVE_MODE > 0U) && \
defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U)
defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U)
USB0->INTEN |= USB_INTEN_SOFTOKEN_MASK;
#endif
+
+ if (s_recvSize) {
+ for (uint32_t offset = 0; s_recvSize-- > 0; offset++) {
+ if (ringbuf_is_full (&cdc_rx_buf))
+ break;
+
+ ringbuf_write (&cdc_rx_buf, s_currRecvBuf[offset]);
+ }
+
+ s_recvSize = 0;
+ } else
+
if (!s_recvSize)
{
#if defined(FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED) && (FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED > 0U) && \
defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U)
USB0->INTEN &= ~USB_INTEN_SOFTOKEN_MASK;
#endif
+
+ USB_DeviceRecvRequest (handle, USB_CDC_VCOM_BULK_OUT_ENDPOINT, s_currRecvBuf, s_usbBulkMaxPacketSize);
}
}
else
{
s_usbBulkMaxPacketSize = FS_CDC_VCOM_BULK_OUT_PACKET_SIZE;
}
+
+ USB_DeviceRecvRequest (handle, USB_CDC_VCOM_BULK_OUT_ENDPOINT, s_currRecvBuf, s_usbBulkMaxPacketSize);
}
}
break;
{
while ((s_cdcVcom.attach != 1) || (s_cdcVcom.startTransactions != 1))
{
- __NOP();
};
USB_DeviceSendRequest((usb_device_handle)baseAddr, USB_CDC_VCOM_BULK_IN_ENDPOINT, (uint8_t *)buf, count);
while (!s_sendComplete)
{
- __NOP();
};
s_sendComplete = 0;
}
+static ssize_t
+flush_tx_buffer (void *user_data, void *vbuf, size_t bufsiz, size_t count)
+{
+ (void) bufsiz;
+
+ /* Don't write data unless link is open. */
+ if (s_cdcVcom.attach != 1 || s_cdcVcom.startTransactions != 1)
+ return count;
+
+ USB_DeviceSendRequest (user_data, USB_CDC_VCOM_BULK_IN_ENDPOINT,
+ vbuf, count);
+
+ /* Wait for USB_DeviceCdcAcmBulkIn() to set s_sendComplete. */
+ while (!s_sendComplete)
+ {
+ }
+
+ /* Reset for the next write. */
+ s_sendComplete = 0;
+
+ return count;
+}
+
/* See virtual_com.h for documentation of this function. */
status_t USB_VcomReadBlocking(usb_device_handle baseAddr, uint8_t *buf, size_t count)
{
/* Waiting for the USB ready. */
while ((s_cdcVcom.attach != 1) || (s_cdcVcom.startTransactions != 1))
{
- __NOP();
};
do
/* Waiting for data received by virtual com. */
while (s_recvSize <= 0)
{
- __NOP();
};
/* When receive request is error. */
/* Waiting for the USB ready and transfer started. */
while ((s_cdcVcom.attach != 1) || (s_cdcVcom.startTransactions != 1))
{
- __NOP();
};
s_recvSize = 0;
}
else
{
deviceHandle = s_cdcVcom.deviceHandle;
+
+ buffer_init (&cdc_tx_buf, cdc_tx_buf_space, sizeof (cdc_tx_buf_space),
+ flush_tx_buffer, deviceHandle);
+
USB_DeviceIsrEnable();
USB_DeviceRun(s_cdcVcom.deviceHandle);
}
/* enable USB IP clock,user code. */
#endif /* USB_DEVICE_CONFIG_LPCIP3511HS */
}
+
+void
+USB0_IRQHandler (void)
+{
+ USB_DeviceKhciIsrFunction (s_cdcVcom.deviceHandle);
+}
+
+bool usb_serial_read (char *c)
+{
+ if (ringbuf_is_empty (&cdc_rx_buf)) {
+ if (!s_recvSize || s_recvSize == (uint32_t) -1)
+ USB_DeviceRecvRequest (s_cdcVcom.deviceHandle,
+ USB_CDC_VCOM_BULK_OUT_ENDPOINT,
+ s_currRecvBuf,
+ s_usbBulkMaxPacketSize);
+
+ return false;
+ }
+
+ *c = ringbuf_read (&cdc_rx_buf);
+
+ return true;
+}