X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Fcortex-m3%2Fdrv%2Fusb_stm32.c;h=eff625a45d60868d6c82815d0f6a894b55170f56;hb=aaa7697cfcd622a8d6ea4e5a30b5f2bc25cd77e9;hp=52f208dcec413693386c078c4c7de28c3d1c827f;hpb=08eb84f9adca434cbc682642aea5f3a7aea17187;p=bertos.git diff --git a/bertos/cpu/cortex-m3/drv/usb_stm32.c b/bertos/cpu/cortex-m3/drv/usb_stm32.c index 52f208dc..eff625a4 100644 --- a/bertos/cpu/cortex-m3/drv/usb_stm32.c +++ b/bertos/cpu/cortex-m3/drv/usb_stm32.c @@ -1098,20 +1098,23 @@ ssize_t usb_ep_read(int ep, void *buffer, ssize_t size) { 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) @@ -1140,20 +1143,24 @@ ssize_t usb_ep_write(int ep, const void *buffer, ssize_t size) { 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); + LOG_INFO("%s: size = %d\n", __func__, size); + 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)