+ ASSERT(!(ep & 0x01));
+
+ event_do(&usb_event_done[ep >> 1]);
+ rx_size = ep_cnfg[ep].size;
+}
+
+ssize_t usb_endpointReadTimeout(int ep, void *buffer, ssize_t size,
+ ticks_t timeout)
+{
+ int ep_num = usb_ep_logical_to_hw(ep);
+ ssize_t max_size = sizeof(ep_buffer[ep_num]);
+
+ /* Non-blocking read for EP0 */
+ if (in_atomic && (ep_num == CTRL_ENP_OUT))
+ {
+ size = usb_size(size, usb_le16_to_cpu(setup_packet.wLength));
+ if (UNLIKELY(size > max_size))
+ {
+ LOG_ERR("%s: ep_buffer exceeded, try to enlarge CONFIG_USB_BUFSIZE\n",
+ __func__);
+ ASSERT(0);
+ return -USB_BUF_OVERFLOW;
+ }
+ if (!size)
+ usb_status_handler(ep_num);
+ else
+ {
+ __usb_ep_read(ep_num, ep_buffer[ep_num], size,
+ usb_status_handler);
+ memcpy(buffer, ep_buffer[ep_num], size);
+ }
+ return size;
+ }
+ if (UNLIKELY(!size))
+ return 0;
+ size = MIN(size, max_size);
+ event_initGeneric(&usb_event_done[ep_num >> 1]);
+ rx_size = 0;
+
+ /* Blocking read */
+ __usb_ep_read(ep_num, ep_buffer[ep_num], size,
+ usb_endpointRead_complete);
+ if (timeout < 0)
+ event_wait(&usb_event_done[ep_num >> 1]);
+ else
+ if (!event_waitTimeout(&usb_event_done[ep_num >> 1], timeout))
+ return 0;
+ memcpy(buffer, ep_buffer[ep_num], rx_size);
+
+ return rx_size;
+}
+
+static void usb_endpointWrite_complete(int ep)
+{
+ if (UNLIKELY(ep >= EP_MAX_NUM))
+ {
+ ASSERT(0);
+ return;
+ }
+ ASSERT(ep & 0x01);
+
+ event_do(&usb_event_done[ep >> 1]);
+ tx_size = ep_cnfg[ep].size;
+}
+
+ssize_t usb_endpointWriteTimeout(int ep, const void *buffer, ssize_t size,
+ ticks_t timeout)
+{
+ int ep_num = usb_ep_logical_to_hw(ep);
+ ssize_t max_size = sizeof(ep_buffer[ep_num]);
+
+ /* Non-blocking write for EP0 */
+ if (in_atomic && (ep_num == CTRL_ENP_IN))
+ {
+ size = usb_size(size, usb_le16_to_cpu(setup_packet.wLength));
+ if (UNLIKELY(size > max_size))
+ {
+ LOG_ERR("%s: ep_buffer exceeded, try to enlarge CONFIG_USB_BUFSIZE\n",
+ __func__);
+ ASSERT(0);
+ return -USB_BUF_OVERFLOW;
+ }
+ if (!size)
+ usb_status_handler(ep_num);
+ else
+ {
+ memcpy(ep_buffer[ep_num], buffer, size);
+ __usb_ep_write(ep_num, ep_buffer[ep_num], size,
+ usb_status_handler);
+ }
+ return size;
+ }
+ if (UNLIKELY(!size))
+ return 0;
+ size = MIN(size, max_size);
+ event_initGeneric(&usb_event_done[ep_num >> 1]);
+ tx_size = 0;
+
+ /* Blocking write */
+ memcpy(ep_buffer[ep_num], buffer, size);
+ __usb_ep_write(ep_num, ep_buffer[ep_num], size,
+ usb_endpointWrite_complete);
+ if (timeout < 0)
+ event_wait(&usb_event_done[ep_num >> 1]);
+ else
+ if (!event_waitTimeout(&usb_event_done[ep_num >> 1], timeout))
+ return 0;
+
+ return tx_size;