usb/dwc: Fixed some issues with how interrupts were being handled for the H7's DWC2 variant
This commit is contained in:
committed by
Piotr Esden-Tempski
parent
76ba8900e3
commit
7da573f9eb
@@ -147,7 +147,8 @@
|
|||||||
#define OTG_GINTSTS_PTXFE (1U << 26U)
|
#define OTG_GINTSTS_PTXFE (1U << 26U)
|
||||||
#define OTG_GINTSTS_HCINT (1U << 25U)
|
#define OTG_GINTSTS_HCINT (1U << 25U)
|
||||||
#define OTG_GINTSTS_HPRTINT (1U << 24U)
|
#define OTG_GINTSTS_HPRTINT (1U << 24U)
|
||||||
/* Bits 23:22 - Reserved */
|
#define OTG_GINTSTS_RSTDET (1U << 23U)
|
||||||
|
/* Bit 22 - Reserved */
|
||||||
#define OTG_GINTSTS_IPXFR (1U << 21U)
|
#define OTG_GINTSTS_IPXFR (1U << 21U)
|
||||||
#define OTG_GINTSTS_INCOMPISOOUT (1U << 21U)
|
#define OTG_GINTSTS_INCOMPISOOUT (1U << 21U)
|
||||||
#define OTG_GINTSTS_IISOIXFR (1U << 20U)
|
#define OTG_GINTSTS_IISOIXFR (1U << 20U)
|
||||||
|
|||||||
@@ -346,6 +346,12 @@ void dwc_poll(usbd_device *usbd_dev)
|
|||||||
_usbd_reset(usbd_dev);
|
_usbd_reset(usbd_dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (intsts & OTG_GINTSTS_USBRST) {
|
||||||
|
/* Handle the /other/ USB Reset condition */
|
||||||
|
REBASE(OTG_GINTSTS) = OTG_GINTSTS_USBRST | OTG_GINTSTS_RSTDET;
|
||||||
|
dwc_endpoints_reset(usbd_dev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There is no global interrupt flag for transmit complete.
|
* There is no global interrupt flag for transmit complete.
|
||||||
@@ -374,45 +380,36 @@ void dwc_poll(usbd_device *usbd_dev)
|
|||||||
uint8_t ep = rxstsp & OTG_GRXSTSP_EPNUM_MASK;
|
uint8_t ep = rxstsp & OTG_GRXSTSP_EPNUM_MASK;
|
||||||
|
|
||||||
if (pktsts == OTG_GRXSTSP_PKTSTS_SETUP_COMP) {
|
if (pktsts == OTG_GRXSTSP_PKTSTS_SETUP_COMP) {
|
||||||
usbd_dev->user_callback_ctr[ep][USB_TRANSACTION_SETUP] (usbd_dev, ep);
|
usbd_dev->user_callback_ctr[ep][USB_TRANSACTION_SETUP](usbd_dev, ep);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pktsts == OTG_GRXSTSP_PKTSTS_OUT_COMP
|
if (pktsts == OTG_GRXSTSP_PKTSTS_OUT_COMP || pktsts == OTG_GRXSTSP_PKTSTS_SETUP_COMP) {
|
||||||
|| pktsts == OTG_GRXSTSP_PKTSTS_SETUP_COMP) {
|
|
||||||
REBASE(OTG_DOEPTSIZ(ep)) = usbd_dev->doeptsiz[ep];
|
REBASE(OTG_DOEPTSIZ(ep)) = usbd_dev->doeptsiz[ep];
|
||||||
REBASE(OTG_DOEPCTL(ep)) |= OTG_DOEPCTL0_EPENA |
|
REBASE(OTG_DOEPCTL(ep)) |= OTG_DOEPCTL0_EPENA |
|
||||||
(usbd_dev->force_nak[ep] ?
|
(usbd_dev->force_nak[ep] ? OTG_DOEPCTL0_SNAK : OTG_DOEPCTL0_CNAK);
|
||||||
OTG_DOEPCTL0_SNAK : OTG_DOEPCTL0_CNAK);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pktsts != OTG_GRXSTSP_PKTSTS_OUT) &&
|
if (pktsts != OTG_GRXSTSP_PKTSTS_OUT && pktsts != OTG_GRXSTSP_PKTSTS_SETUP) {
|
||||||
(pktsts != OTG_GRXSTSP_PKTSTS_SETUP)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t type;
|
const uint8_t type = pktsts == OTG_GRXSTSP_PKTSTS_SETUP ? USB_TRANSACTION_SETUP : USB_TRANSACTION_OUT;
|
||||||
if (pktsts == OTG_GRXSTSP_PKTSTS_SETUP) {
|
|
||||||
type = USB_TRANSACTION_SETUP;
|
|
||||||
} else {
|
|
||||||
type = USB_TRANSACTION_OUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type == USB_TRANSACTION_SETUP
|
if (type == USB_TRANSACTION_SETUP && (REBASE(OTG_DIEPTSIZ(ep)) & OTG_DIEPSIZ0_PKTCNT)) {
|
||||||
&& (REBASE(OTG_DIEPTSIZ(ep)) & OTG_DIEPSIZ0_PKTCNT)) {
|
|
||||||
/* SETUP received but there is still something stuck
|
/* SETUP received but there is still something stuck
|
||||||
* in the transmit fifo. Flush it.
|
* in the transmit fifo. Flush it.
|
||||||
*/
|
*/
|
||||||
dwc_flush_txfifo(usbd_dev, ep);
|
dwc_flush_txfifo(usbd_dev, ep);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save packet size for dwc_ep_read_packet(). */
|
/* Save packet size for dwc_ep_read_packet(). */
|
||||||
usbd_dev->rxbcnt = (rxstsp & OTG_GRXSTSP_BCNT_MASK) >> 4;
|
usbd_dev->rxbcnt = (rxstsp & OTG_GRXSTSP_BCNT_MASK) >> 4U;
|
||||||
|
|
||||||
if (type == USB_TRANSACTION_SETUP) {
|
if (type == USB_TRANSACTION_SETUP) {
|
||||||
dwc_ep_read_packet(usbd_dev, ep, &usbd_dev->control_state.req, 8);
|
dwc_ep_read_packet(usbd_dev, ep, &usbd_dev->control_state.req, 8);
|
||||||
} else if (usbd_dev->user_callback_ctr[ep][type]) {
|
} else if (usbd_dev->user_callback_ctr[ep][type]) {
|
||||||
usbd_dev->user_callback_ctr[ep][type] (usbd_dev, ep);
|
usbd_dev->user_callback_ctr[ep][type](usbd_dev, ep);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Discard unread packet data. */
|
/* Discard unread packet data. */
|
||||||
@@ -445,11 +442,13 @@ void dwc_poll(usbd_device *usbd_dev)
|
|||||||
REBASE(OTG_GINTSTS) = OTG_GINTSTS_SOF;
|
REBASE(OTG_GINTSTS) = OTG_GINTSTS_SOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(STM32H7)
|
||||||
if (usbd_dev->user_callback_sof) {
|
if (usbd_dev->user_callback_sof) {
|
||||||
REBASE(OTG_GINTMSK) |= OTG_GINTMSK_SOFM;
|
REBASE(OTG_GINTMSK) |= OTG_GINTMSK_SOFM;
|
||||||
} else {
|
} else {
|
||||||
REBASE(OTG_GINTMSK) &= ~OTG_GINTMSK_SOFM;
|
REBASE(OTG_GINTMSK) &= ~OTG_GINTMSK_SOFM;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void dwc_disconnect(usbd_device *usbd_dev, bool disconnected)
|
void dwc_disconnect(usbd_device *usbd_dev, bool disconnected)
|
||||||
|
|||||||
Reference in New Issue
Block a user