#include <stdio.h>
#include <stdlib.h>
+#include <stdalign.h>
#include "usb_device_config.h"
#include "usb.h"
#endif
#include "ringbuf.h"
+#include "buffer.h"
/* Provided by users. */
extern void USB_DeviceClockInit(void);
******************************************************************************/
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;
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)
{
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);
}