unsigned char cdc0_ep_rx_buff[USB_MAX_PACKET] __attribute__ ((aligned (8)));
unsigned char ep0_buffer[USB_MAX_PACKET0] __attribute__ ((aligned (8)));
int cdc0_tx_index = 0, cdc0_tx_ready = 1;
+int cdc0_tx_flush_required;
int cdc0_rx_index = 0, cdc0_rx_chars = 0;
uint16_t cdc0_serial_state = 0; /* USBCDC_SERIAL_STATE_xxx */
return 0;
}
+static inline
+int usb_app_epnum2event_mask(int epnum)
+{
+ int evmask;
+ int evbit;
+ /* LPC17xx EP1RX 0x04, EP1TX 0x08, EP2RX 0x10, EP2TX 0x20 */
+
+ evbit = (epnum & ~USB_ENDPOINT_DIRECTION_MASK) * 2;
+ if (epnum & USB_ENDPOINT_DIRECTION_MASK)
+ evbit++;
+
+ evmask = 1 << evbit;
+
+ return evmask;
+}
+
int usb_app_init(void)
{
memset(&usb_device, 0, sizeof(usb_device));
eps[CDC0_EPIDX_NOTIFY].epnum = CDC0_EP_NOTIFY;
eps[CDC0_EPIDX_RXD].epnum = CDC0_EP_RXD;
eps[CDC0_EPIDX_TXD].epnum = CDC0_EP_TXD;
- eps[CDC0_EPIDX_NOTIFY].event_mask = 0x08;
- eps[CDC0_EPIDX_RXD].event_mask = 0x10;
- eps[CDC0_EPIDX_TXD].event_mask = 0x20;
+ eps[CDC0_EPIDX_NOTIFY].event_mask = usb_app_epnum2event_mask(CDC0_EP_NOTIFY); /* 0x08; */
+ eps[CDC0_EPIDX_RXD].event_mask = usb_app_epnum2event_mask(CDC0_EP_RXD); /* 0x10; */
+ eps[CDC0_EPIDX_TXD].event_mask = usb_app_epnum2event_mask(CDC0_EP_TXD); /* 0x20; */
eps[CDC0_EPIDX_NOTIFY].udev = &usb_device;
eps[CDC0_EPIDX_RXD].udev = &usb_device;
eps[CDC0_EPIDX_TXD].udev = &usb_device;
return 0;
}
-int cdc0_txd_check_ep()
+int cdc0_txd_check_ep(void)
{
if (usb_device.ep_events & CDC0_MASK_EP_TXD)
{
}
/* Respond if there is something to send and RX is ready */
- if (cdc0_tx_ready && cdc0_tx_index != 0)
+ if (cdc0_tx_ready && ((cdc0_tx_index != 0) || cdc0_tx_flush_required))
{
usb_udev_write_endpoint(&eps[CDC0_EPIDX_TXD], cdc0_ep_tx_buff, cdc0_tx_index);
+ cdc0_tx_flush_required = (cdc0_tx_index == USB_MAX_PACKET);
cdc0_tx_index = 0;
cdc0_tx_ready = 0;
hal_gpio_set_value(LED2_PIN, 0);