Merge pull request #48 from dron0gus/stm32-otg-freeze

STM32 OTGv1 freeze on OUT bulk with size = 64
This commit is contained in:
Andrey G 2024-11-04 00:09:20 +03:00 committed by GitHub
commit 900fa76da4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 54 additions and 14 deletions

View File

@ -450,7 +450,7 @@
* buffers. * buffers.
*/ */
#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) #if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
#define SERIAL_USB_BUFFERS_SIZE 256 #define SERIAL_USB_BUFFERS_SIZE 64
#endif #endif
/** /**
@ -458,7 +458,7 @@
* @note The default is 2 buffers. * @note The default is 2 buffers.
*/ */
#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
#define SERIAL_USB_BUFFERS_NUMBER 2 #define SERIAL_USB_BUFFERS_NUMBER 8
#endif #endif
/*===========================================================================*/ /*===========================================================================*/

View File

@ -59,6 +59,22 @@
#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
#define SERIAL_USB_BUFFERS_NUMBER 2 #define SERIAL_USB_BUFFERS_NUMBER 2
#endif #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" #error "Serial over USB Driver requires HAL_USE_USB"
#endif #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. */ /* Driver data structures and types. */
/*===========================================================================*/ /*===========================================================================*/
@ -125,11 +145,11 @@ typedef struct {
/* Output queue.*/ \ /* Output queue.*/ \
output_buffers_queue_t obqueue; \ output_buffers_queue_t obqueue; \
/* Input buffer.*/ \ /* Input buffer.*/ \
uint8_t ib[BQ_BUFFER_SIZE(SERIAL_USB_BUFFERS_NUMBER, \ uint8_t ib[BQ_BUFFER_SIZE(SERIAL_USB_BUFFERS_RX_NUMBER, \
SERIAL_USB_BUFFERS_SIZE)]; \ SERIAL_USB_BUFFERS_RX_SIZE)]; \
/* Output buffer.*/ \ /* Output buffer.*/ \
uint8_t ob[BQ_BUFFER_SIZE(SERIAL_USB_BUFFERS_NUMBER, \ uint8_t ob[BQ_BUFFER_SIZE(SERIAL_USB_BUFFERS_TX_NUMBER, \
SERIAL_USB_BUFFERS_SIZE)]; \ SERIAL_USB_BUFFERS_TX_SIZE)]; \
/* End of the mandatory fields.*/ \ /* End of the mandatory fields.*/ \
/* Current configuration data.*/ \ /* Current configuration data.*/ \
const SerialUSBConfig *config; const SerialUSBConfig *config;

View File

@ -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. * @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) { static void usb_lld_serve_interrupt(USBDriver *usbp) {
stm32_otg_t *otgp = usbp->otg; stm32_otg_t *otgp = usbp->otg;
uint32_t sts, src; uint32_t sts, src;
int retry_count = 8;
irq_retry:
sts = otgp->GINTSTS; sts = otgp->GINTSTS;
sts &= otgp->GINTMSK; sts &= otgp->GINTMSK;
otgp->GINTSTS = sts; otgp->GINTSTS = sts;
@ -603,8 +611,12 @@ static void usb_lld_serve_interrupt(USBDriver *usbp) {
otg_rxfifo_handler(usbp); otg_rxfifo_handler(usbp);
} }
src = 0;
/* IN/OUT endpoints event handling.*/ /* IN/OUT endpoints event handling.*/
if (sts & (GINTSTS_OEPINT | GINTSTS_IEPINT)) {
src = otgp->DAINT; src = otgp->DAINT;
}
if (sts & GINTSTS_OEPINT) { if (sts & GINTSTS_OEPINT) {
if (src & (1 << 16)) if (src & (1 << 16))
otg_epout_handler(usbp, 0); otg_epout_handler(usbp, 0);
@ -665,6 +677,14 @@ static void usb_lld_serve_interrupt(USBDriver *usbp) {
otg_epin_handler(usbp, 8); otg_epin_handler(usbp, 8);
#endif #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;
} }
/*===========================================================================*/ /*===========================================================================*/

View File

@ -73,7 +73,7 @@ static bool sdu_start_receive(SerialUSBDriver *sdup) {
/* Buffer found, starting a new transaction.*/ /* Buffer found, starting a new transaction.*/
usbStartReceiveI(sdup->config->usbp, sdup->config->bulk_out, usbStartReceiveI(sdup->config->usbp, sdup->config->bulk_out,
buf, SERIAL_USB_BUFFERS_SIZE); buf, SERIAL_USB_BUFFERS_RX_SIZE);
return false; return false;
} }
@ -225,10 +225,10 @@ void sduObjectInit(SerialUSBDriver *sdup) {
osalEventObjectInit(&sdup->event); osalEventObjectInit(&sdup->event);
sdup->state = SDU_STOP; sdup->state = SDU_STOP;
ibqObjectInit(&sdup->ibqueue, true, sdup->ib, 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); ibnotify, sdup);
obqObjectInit(&sdup->obqueue, true, sdup->ob, 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); obnotify, sdup);
} }

View File

@ -427,7 +427,7 @@
* buffers. * buffers.
*/ */
#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) #if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
#define SERIAL_USB_BUFFERS_SIZE 256 #define SERIAL_USB_BUFFERS_SIZE 64
#endif #endif
/** /**
@ -435,7 +435,7 @@
* @note The default is 2 buffers. * @note The default is 2 buffers.
*/ */
#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
#define SERIAL_USB_BUFFERS_NUMBER 2 #define SERIAL_USB_BUFFERS_NUMBER 8
#endif #endif
/*===========================================================================*/ /*===========================================================================*/

View File

@ -450,7 +450,7 @@
* buffers. * buffers.
*/ */
#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) #if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
#define SERIAL_USB_BUFFERS_SIZE 256 #define SERIAL_USB_BUFFERS_SIZE 64
#endif #endif
/** /**
@ -458,7 +458,7 @@
* @note The default is 2 buffers. * @note The default is 2 buffers.
*/ */
#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
#define SERIAL_USB_BUFFERS_NUMBER 2 #define SERIAL_USB_BUFFERS_NUMBER 8
#endif #endif
/*===========================================================================*/ /*===========================================================================*/