{
int ep_num = USB_EpLogToPhysAdd(ep);
- if (UNLIKELY(!size))
- return 0;
- size = MIN(size, USB_RX_MAX_SIZE);
- rx_done = false;
- rx_size = 0;
-
/* Non-blocking read for EP0 */
if (ep_num == CTRL_ENP_OUT)
{
size = usb_size(size, setup_packet.wLength);
- __usb_ep_write(ep_num, buffer, size,
- USB_StatusHandler);
+ if (!size)
+ USB_StatusHandler(ep_num);
+ else
+ __usb_ep_read(ep_num, buffer, size,
+ USB_StatusHandler);
return size;
}
+ if (UNLIKELY(!size))
+ return 0;
+ size = MIN(size, USB_RX_MAX_SIZE);
+ rx_done = false;
+ rx_size = 0;
+
/* Blocking read */
__usb_ep_read(ep_num, buffer, size, usb_ep_read_complete);
while (!rx_done)
{
int ep_num = USB_EpLogToPhysAdd(ep);
- if (UNLIKELY(!size))
- return 0;
- size = MIN(size, USB_TX_MAX_SIZE);
- tx_done = false;
- tx_size = 0;
-
/* Non-blocking write for EP0 */
if (ep_num == CTRL_ENP_IN)
{
size = usb_size(size, setup_packet.wLength);
- __usb_ep_write(ep_num, buffer, size,
- USB_StatusHandler);
+ if (!size)
+ USB_StatusHandler(ep_num);
+ else
+ __usb_ep_write(ep_num, buffer, size,
+ USB_StatusHandler);
return size;
}
+ if (UNLIKELY(!size))
+ return 0;
+ size = MIN(size, USB_TX_MAX_SIZE);
+ tx_done = false;
+ tx_size = 0;
+
/* Blocking write */
__usb_ep_write(ep_num, buffer, size, usb_ep_write_complete);
while (!tx_done)
usb_set_address(0);
/* Enable all the device interrupts */
-#if 0
usb->CNTR = bmCTRM | bmRESETM | bmSOFM | bmERRM | bmPMAOVRM |
bmSUSPM | bmWKUPM;
-#else
- /* XXX: disable frame interrupts for now (too much noise!) */
- usb->CNTR = bmCTRM | bmRESETM | bmERRM | bmPMAOVRM | bmSUSPM | bmWKUPM;
-#endif
}
/* Handle a correct transfer under ISR */
}
if (interrupt.SOF)
{
+#if 0
+ /*
+ * XXX: disable logging of frame interrupts (too much noise!)
+ */
uint16_t frame_nr = usb->FNR & 0x0fff;
-
LOG_INFO("%s: frame %#x\n", __func__, frame_nr);
+#endif
usb->ISTR = ~bmSOFM;
}
if (interrupt.WKUP)