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.
*/
#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
/*===========================================================================*/

View File

@ -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;

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.
*
@ -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;
}
/*===========================================================================*/

View File

@ -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);
}

View File

@ -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
/*===========================================================================*/

View File

@ -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
/*===========================================================================*/