]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blobdiff - sw/app/rocon/appl_usb.c
RoCoN: compute USB engine event mask by function.
[fpga/lx-cpu1/lx-rocon.git] / sw / app / rocon / appl_usb.c
index d87fe159882358a1c203b986db0b53a2c3c3f29a..f96b1f0e3cf4a3dd27675f65f09fb27819e809f5 100644 (file)
@@ -79,6 +79,7 @@ unsigned char cdc0_ep_tx_buff[USB_MAX_PACKET] __attribute__ ((aligned (8)));
 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 */
@@ -537,6 +538,22 @@ int usb_app_fill_serial_number(uint32_t ul_sn)
   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));
@@ -547,9 +564,9 @@ int usb_app_init(void)
   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;
@@ -569,7 +586,7 @@ int usb_app_init(void)
   return 0;
 }
 
-int cdc0_txd_check_ep()
+int cdc0_txd_check_ep(void)
 {
   if (usb_device.ep_events & CDC0_MASK_EP_TXD)
   {
@@ -579,9 +596,10 @@ int cdc0_txd_check_ep()
   }
 
   /* 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);