1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

usbdev_synopsys_dwc2: Mask RX FIFO irq with DMA

When using DMA to transfer endpoint data from the RX FIFO to the
endpoint memory, the RXFLVL irq is not needed as that is already handled
by the DMA. Furthermore, servicing this irq anyway can cause the event
handling to interpret data from the FIFO as the endpoint and status
marker during the DMA transfer.

This commit masks the RXFLVL irq while DMA is used for the endpoint
transfers.
This commit is contained in:
Koen Zandberg 2022-10-11 15:50:22 +02:00
parent b35a291332
commit 8cecb81517
No known key found for this signature in database
GPG Key ID: BA1718B37D79F51C

View File

@ -85,8 +85,7 @@
USB_OTG_GINTMSK_USBRST | \
USB_OTG_GINTMSK_OTGINT | \
USB_OTG_GINTMSK_IEPINT | \
USB_OTG_GINTMSK_OEPINT | \
USB_OTG_GINTMSK_RXFLVLM)
USB_OTG_GINTMSK_OEPINT)
#define DWC2_PKTSTS_GONAK 0x01 /**< Rx fifo global out nak */
#define DWC2_PKTSTS_DATA_UPDT 0x02 /**< Rx fifo data update */
@ -855,9 +854,14 @@ static void _usbdev_init(usbdev_t *dev)
_device_regs(conf)->DIEPMSK |= USB_OTG_DIEPMSK_XFRCM;
}
uint32_t gint_mask = DWC2_FSHS_USB_GINT_MASK;
if (!_uses_dma(conf)) {
gint_mask |= USB_OTG_GINTMSK_RXFLVLM;
}
/* Clear the interrupt flags and unmask those interrupts */
_global_regs(conf)->GINTSTS |= DWC2_FSHS_USB_GINT_MASK;
_global_regs(conf)->GINTMSK |= DWC2_FSHS_USB_GINT_MASK;
_global_regs(conf)->GINTSTS |= gint_mask;
_global_regs(conf)->GINTMSK |= gint_mask;
DEBUG("usbdev: USB peripheral currently in %s mode\n",
(_global_regs(
@ -1277,7 +1281,7 @@ void _isr_common(dwc2_usb_otg_fshs_t *usbdev)
uint32_t status = _global_regs(conf)->GINTSTS;
if (status) {
if (status & USB_OTG_GINTSTS_RXFLVL) {
if ((status & USB_OTG_GINTSTS_RXFLVL) && !_uses_dma(conf)) {
unsigned epnum = _global_regs(conf)->GRXSTSR &
USB_OTG_GRXSTSP_EPNUM_Msk;
usbdev->usbdev.epcb(&usbdev->out[epnum].ep, USBDEV_EVENT_ESR);