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.
|
||||
*/
|
||||
#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
|
||||
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -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
|
||||
|
||||
/*===========================================================================*/
|
||||
|
|
Loading…
Reference in New Issue