diff --git a/demos/STM32/RT-AT32F435-ARTERY144/cfg/halconf.h b/demos/STM32/RT-AT32F435-ARTERY144/cfg/halconf.h index 6dba79884..a310f42fb 100644 --- a/demos/STM32/RT-AT32F435-ARTERY144/cfg/halconf.h +++ b/demos/STM32/RT-AT32F435-ARTERY144/cfg/halconf.h @@ -450,7 +450,7 @@ * buffers. */ #if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 +#define SERIAL_USB_BUFFERS_SIZE 64 #endif /** @@ -458,7 +458,7 @@ * @note The default is 2 buffers. */ #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 +#define SERIAL_USB_BUFFERS_NUMBER 8 #endif /*===========================================================================*/ diff --git a/os/hal/include/hal_serial_usb.h b/os/hal/include/hal_serial_usb.h index 0e32429d3..076032768 100644 --- a/os/hal/include/hal_serial_usb.h +++ b/os/hal/include/hal_serial_usb.h @@ -59,6 +59,22 @@ #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) #define SERIAL_USB_BUFFERS_NUMBER 2 #endif + +#if !defined(SERIAL_USB_BUFFERS_RX_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_RX_SIZE SERIAL_USB_BUFFERS_SIZE +#endif + +#if !defined(SERIAL_USB_BUFFERS_RX_NUMBER) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_RX_NUMBER SERIAL_USB_BUFFERS_NUMBER +#endif + +#if !defined(SERIAL_USB_BUFFERS_TX_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_TX_SIZE SERIAL_USB_BUFFERS_SIZE +#endif + +#if !defined(SERIAL_USB_BUFFERS_TX_NUMBER) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_TX_NUMBER SERIAL_USB_BUFFERS_NUMBER +#endif /** @} */ /*===========================================================================*/ @@ -69,6 +85,10 @@ #error "Serial over USB Driver requires HAL_USE_USB" #endif +#if (SERIAL_USB_BUFFERS_RX_SIZE != 64) +#error "Please keep SERIAL_USB_BUFFERS_SIZE until https://forum.chibios.org/viewtopic.php?f=35&t=6395 is properly fixed!" +#endif + /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ @@ -125,11 +145,11 @@ typedef struct { /* Output queue.*/ \ output_buffers_queue_t obqueue; \ /* Input buffer.*/ \ - uint8_t ib[BQ_BUFFER_SIZE(SERIAL_USB_BUFFERS_NUMBER, \ - SERIAL_USB_BUFFERS_SIZE)]; \ + uint8_t ib[BQ_BUFFER_SIZE(SERIAL_USB_BUFFERS_RX_NUMBER, \ + SERIAL_USB_BUFFERS_RX_SIZE)]; \ /* Output buffer.*/ \ - uint8_t ob[BQ_BUFFER_SIZE(SERIAL_USB_BUFFERS_NUMBER, \ - SERIAL_USB_BUFFERS_SIZE)]; \ + uint8_t ob[BQ_BUFFER_SIZE(SERIAL_USB_BUFFERS_TX_NUMBER, \ + SERIAL_USB_BUFFERS_TX_SIZE)]; \ /* End of the mandatory fields.*/ \ /* Current configuration data.*/ \ const SerialUSBConfig *config; diff --git a/os/hal/ports/STM32/LLD/OTGv1/hal_usb_lld.c b/os/hal/ports/STM32/LLD/OTGv1/hal_usb_lld.c index 76f7c320b..13480956c 100644 --- a/os/hal/ports/STM32/LLD/OTGv1/hal_usb_lld.c +++ b/os/hal/ports/STM32/LLD/OTGv1/hal_usb_lld.c @@ -521,6 +521,12 @@ static void otg_isoc_out_failed_handler(USBDriver *usbp) { } } + +/* IRQ flags which will trigger a retry around the IRQ loop */ +#define IRQ_RETRY_MASK (GINTSTS_NPTXFE | \ + GINTSTS_PTXFE | \ + GINTSTS_RXFLVL) + /** * @brief OTG shared ISR. * @@ -531,7 +537,9 @@ static void otg_isoc_out_failed_handler(USBDriver *usbp) { static void usb_lld_serve_interrupt(USBDriver *usbp) { stm32_otg_t *otgp = usbp->otg; uint32_t sts, src; + int retry_count = 8; +irq_retry: sts = otgp->GINTSTS; sts &= otgp->GINTMSK; otgp->GINTSTS = sts; @@ -603,8 +611,12 @@ static void usb_lld_serve_interrupt(USBDriver *usbp) { otg_rxfifo_handler(usbp); } + src = 0; /* IN/OUT endpoints event handling.*/ - src = otgp->DAINT; + if (sts & (GINTSTS_OEPINT | GINTSTS_IEPINT)) { + src = otgp->DAINT; + } + if (sts & GINTSTS_OEPINT) { if (src & (1 << 16)) otg_epout_handler(usbp, 0); @@ -665,6 +677,14 @@ static void usb_lld_serve_interrupt(USBDriver *usbp) { otg_epin_handler(usbp, 8); #endif } + + /* + * if we've had fifo events, we should try and go around the + * loop again to see if there's any point in returning yet. + */ + + if (sts & IRQ_RETRY_MASK && --retry_count > 0) + goto irq_retry; } /*===========================================================================*/ diff --git a/os/hal/src/hal_serial_usb.c b/os/hal/src/hal_serial_usb.c index 9de5dd888..526c4eaf0 100644 --- a/os/hal/src/hal_serial_usb.c +++ b/os/hal/src/hal_serial_usb.c @@ -73,7 +73,7 @@ static bool sdu_start_receive(SerialUSBDriver *sdup) { /* Buffer found, starting a new transaction.*/ usbStartReceiveI(sdup->config->usbp, sdup->config->bulk_out, - buf, SERIAL_USB_BUFFERS_SIZE); + buf, SERIAL_USB_BUFFERS_RX_SIZE); return false; } @@ -225,10 +225,10 @@ void sduObjectInit(SerialUSBDriver *sdup) { osalEventObjectInit(&sdup->event); sdup->state = SDU_STOP; ibqObjectInit(&sdup->ibqueue, true, sdup->ib, - SERIAL_USB_BUFFERS_SIZE, SERIAL_USB_BUFFERS_NUMBER, + SERIAL_USB_BUFFERS_RX_SIZE, SERIAL_USB_BUFFERS_RX_NUMBER, ibnotify, sdup); obqObjectInit(&sdup->obqueue, true, sdup->ob, - SERIAL_USB_BUFFERS_SIZE, SERIAL_USB_BUFFERS_NUMBER, + SERIAL_USB_BUFFERS_TX_SIZE, SERIAL_USB_BUFFERS_TX_NUMBER, obnotify, sdup); } diff --git a/testhal/AT32/AT32F4xx/ADC/halconf.h b/testhal/AT32/AT32F4xx/ADC/halconf.h index 97e01635f..9ad29bea5 100644 --- a/testhal/AT32/AT32F4xx/ADC/halconf.h +++ b/testhal/AT32/AT32F4xx/ADC/halconf.h @@ -427,7 +427,7 @@ * buffers. */ #if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 +#define SERIAL_USB_BUFFERS_SIZE 64 #endif /** @@ -435,7 +435,7 @@ * @note The default is 2 buffers. */ #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 +#define SERIAL_USB_BUFFERS_NUMBER 8 #endif /*===========================================================================*/ diff --git a/testhal/AT32/AT32F4xx/USB_CDC_IAD/halconf.h b/testhal/AT32/AT32F4xx/USB_CDC_IAD/halconf.h index 7fd4dc3ff..bbd235c43 100644 --- a/testhal/AT32/AT32F4xx/USB_CDC_IAD/halconf.h +++ b/testhal/AT32/AT32F4xx/USB_CDC_IAD/halconf.h @@ -450,7 +450,7 @@ * buffers. */ #if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 +#define SERIAL_USB_BUFFERS_SIZE 64 #endif /** @@ -458,7 +458,7 @@ * @note The default is 2 buffers. */ #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 +#define SERIAL_USB_BUFFERS_NUMBER 8 #endif /*===========================================================================*/