Merge pull request #48 from dron0gus/stm32-otg-freeze
STM32 OTGv1 freeze on OUT bulk with size = 64
This commit is contained in:
commit
900fa76da4
|
@ -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
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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.*/
|
||||||
src = otgp->DAINT;
|
if (sts & (GINTSTS_OEPINT | GINTSTS_IEPINT)) {
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
Loading…
Reference in New Issue