diff --git a/os/hal/ports/STM32/LLD/OTGv1/usb_lld.c b/os/hal/ports/STM32/LLD/OTGv1/usb_lld.c index 00ada1203..a4a784d2a 100644 --- a/os/hal/ports/STM32/LLD/OTGv1/usb_lld.c +++ b/os/hal/ports/STM32/LLD/OTGv1/usb_lld.c @@ -511,6 +511,19 @@ static void usb_lld_serve_interrupt(USBDriver *usbp) { sts &= otgp->GINTMSK; otgp->GINTSTS = sts; + /* Reset interrupt handling.*/ + if (sts & GINTSTS_USBRST) { + + /* Resetting pending operations.*/ + usbp->txpending = 0; + + /* Default reset action.*/ + _usb_reset(usbp); + + /* Preventing execution of more handlers, the core has been reset.*/ + return; + } + /* Wake-up handling.*/ if (sts & GINTSTS_WKUPINT) { /* If clocks are gated off, turn them back on (may be the case if @@ -529,15 +542,13 @@ static void usb_lld_serve_interrupt(USBDriver *usbp) { /* Suspend handling.*/ if (sts & GINTSTS_USBSUSP) { + /* Resetting pending operations.*/ + usbp->txpending = 0; + + /* Default suspend action.*/ _usb_suspend(usbp); } - /* Reset interrupt handling.*/ - if (sts & GINTSTS_USBRST) { - - _usb_reset(usbp); - } - /* Enumeration done.*/ if (sts & GINTSTS_ENUMDNE) { /* Full or High speed timing selection.*/ @@ -920,18 +931,18 @@ void usb_lld_reset(USBDriver *usbp) { /* Flush the Tx FIFO.*/ otg_txfifo_flush(usbp, 0); + /* Endpoint interrupts all disabled and cleared.*/ + otgp->DIEPEMPMSK = 0; + otgp->DAINTMSK = DAINTMSK_OEPM(0) | DAINTMSK_IEPM(0); + /* All endpoints in NAK mode, interrupts cleared.*/ for (i = 0; i <= usbp->otgparams->num_endpoints; i++) { otgp->ie[i].DIEPCTL = DIEPCTL_SNAK; otgp->oe[i].DOEPCTL = DOEPCTL_SNAK; - otgp->ie[i].DIEPINT = 0xFF; - otgp->oe[i].DOEPINT = 0xFF; + otgp->ie[i].DIEPINT = 0xFFFFFFFF; + otgp->oe[i].DOEPINT = 0xFFFFFFFF; } - /* Endpoint interrupts all disabled and cleared.*/ - otgp->DAINT = 0xFFFFFFFF; - otgp->DAINTMSK = DAINTMSK_OEPM(0) | DAINTMSK_IEPM(0); - /* Resets the FIFO memory allocator.*/ otg_ram_reset(usbp); diff --git a/os/hal/src/usb.c b/os/hal/src/usb.c index 2075cd7a2..b6813c381 100644 --- a/os/hal/src/usb.c +++ b/os/hal/src/usb.c @@ -380,6 +380,19 @@ void usbDisableEndpointsI(USBDriver *usbp) { usbp->transmitting &= ~1U; usbp->receiving &= ~1U; for (i = 1; i <= (unsigned)USB_MAX_ENDPOINTS; i++) { +#if USB_USE_WAIT == TRUE + /* Signaling the event to threads waiting on endpoints.*/ + if (usbp->epc[i] != NULL) { + osalSysLockFromISR(); + if (usbp->epc[i]->in_state != NULL) { + osalThreadResumeI(&usbp->epc[i]->in_state->thread, MSG_RESET); + } + if (usbp->epc[i]->out_state != NULL) { + osalThreadResumeI(&usbp->epc[i]->out_state->thread, MSG_RESET); + } + osalSysUnlockFromISR(); + } +#endif usbp->epc[i] = NULL; } @@ -638,12 +651,14 @@ void _usb_reset(USBDriver *usbp) { #if USB_USE_WAIT == TRUE /* Signaling the event to threads waiting on endpoints.*/ if (usbp->epc[i] != NULL) { + osalSysLockFromISR(); if (usbp->epc[i]->in_state != NULL) { osalThreadResumeI(&usbp->epc[i]->in_state->thread, MSG_RESET); } if (usbp->epc[i]->out_state != NULL) { osalThreadResumeI(&usbp->epc[i]->out_state->thread, MSG_RESET); } + osalSysUnlockFromISR(); } #endif usbp->epc[i] = NULL; @@ -671,7 +686,7 @@ void _usb_reset(USBDriver *usbp) { void _usb_suspend(USBDriver *usbp) { /* State transition.*/ - usbp->state = USB_SUSPENDED; + usbp->state = USB_SUSPENDED; /* Notification of suspend event.*/ _usb_isr_invoke_event_cb(usbp, USB_EVENT_SUSPEND); @@ -683,12 +698,14 @@ void _usb_suspend(USBDriver *usbp) { for (i = 0; i <= (unsigned)USB_MAX_ENDPOINTS; i++) { if (usbp->epc[i] != NULL) { + osalSysLockFromISR(); if (usbp->epc[i]->in_state != NULL) { osalThreadResumeI(&usbp->epc[i]->in_state->thread, MSG_TIMEOUT); } if (usbp->epc[i]->out_state != NULL) { osalThreadResumeI(&usbp->epc[i]->out_state->thread, MSG_TIMEOUT); } + osalSysUnlockFromISR(); } } } diff --git a/testhal/STM32/STM32F7xx/USB_RAW/debug/STM32F7xx-USB_RAW (OpenOCD, Flash and Run).launch b/testhal/STM32/STM32F7xx/USB_RAW/debug/STM32F7xx-USB_RAW (OpenOCD, Flash and Run).launch index 29bc3e81d..efae86141 100644 --- a/testhal/STM32/STM32F7xx/USB_RAW/debug/STM32F7xx-USB_RAW (OpenOCD, Flash and Run).launch +++ b/testhal/STM32/STM32F7xx/USB_RAW/debug/STM32F7xx-USB_RAW (OpenOCD, Flash and Run).launch @@ -33,9 +33,9 @@ - + - + diff --git a/testhal/STM32/STM32F7xx/USB_RAW/debug/STM32F7xx-USB_RAW (OpenOCD, Just Run).launch b/testhal/STM32/STM32F7xx/USB_RAW/debug/STM32F7xx-USB_RAW (OpenOCD, Just Run).launch index 505471d29..c709f492b 100644 --- a/testhal/STM32/STM32F7xx/USB_RAW/debug/STM32F7xx-USB_RAW (OpenOCD, Just Run).launch +++ b/testhal/STM32/STM32F7xx/USB_RAW/debug/STM32F7xx-USB_RAW (OpenOCD, Just Run).launch @@ -33,7 +33,7 @@ - +