From 07b3bc691805d6708d3010dddd61d01dab1af41f Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Wed, 18 Sep 2019 08:11:44 +0200 Subject: [PATCH] nrfusb: Fix data stage handling of control writes --- cpu/nrf52/periph/usbdev.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/cpu/nrf52/periph/usbdev.c b/cpu/nrf52/periph/usbdev.c index 6b6a1c3916..2cc8ba7024 100644 --- a/cpu/nrf52/periph/usbdev.c +++ b/cpu/nrf52/periph/usbdev.c @@ -498,18 +498,13 @@ static int _ep0_ready(usbdev_ep_t *ep, size_t len) } else { /* USB_EP_DIR_OUT */ - if (len == 0) { - if (usbdev->sstate == NRFUSB_SETUP_READ) { - usbdev->device->TASKS_EP0STATUS = 1; - usbdev->sstate = NRFUSB_SETUP_ACKOUT; - usbdev->usbdev.epcb(_get_ep_out(usbdev, 0), USBDEV_EVENT_ESR); - } - else if (usbdev->sstate == NRFUSB_SETUP_READY) { - return 0; - } + if (usbdev->sstate == NRFUSB_SETUP_READ) { + usbdev->device->TASKS_EP0STATUS = 1; + usbdev->sstate = NRFUSB_SETUP_ACKOUT; + usbdev->usbdev.epcb(_get_ep_out(usbdev, 0), USBDEV_EVENT_ESR); } - else { - usbdev->device->TASKS_STARTEPOUT[ep->num] = 1; + else if (usbdev->sstate == NRFUSB_SETUP_WRITE) { + usbdev->device->TASKS_EP0RCVOUT = 1; } } return len; @@ -577,6 +572,11 @@ static signed _ep0_esr(usbdev_ep_t *ep) event = 0; } } + else if (usbdev->device->EVENTS_EP0DATADONE) { + usbdev->device->EVENTS_EP0DATADONE = 0; + _ep_dma_out(ep); + event = USBDEV_EVENT_TR_COMPLETE; + } } else { if (usbdev->sstate == NRFUSB_SETUP_ACKIN) { @@ -649,8 +649,14 @@ void isr_usbd(void) } if (usbdev->device->EVENTS_EP0DATADONE && (usbdev->device->INTEN & USBD_INTEN_EP0DATADONE_Msk)) { - usbdev->usbdev.epcb(_get_ep_in(usbdev, 0), USBDEV_EVENT_ESR); - _ep_disable_irq(_get_ep_in(usbdev, 0)); + if (usbdev->sstate == NRFUSB_SETUP_READ) { + usbdev->usbdev.epcb(_get_ep_in(usbdev, 0), USBDEV_EVENT_ESR); + _ep_disable_irq(_get_ep_in(usbdev, 0)); + } + if (usbdev->sstate == NRFUSB_SETUP_WRITE) { + usbdev->usbdev.epcb(_get_ep_out(usbdev, 0), USBDEV_EVENT_ESR); + _ep_disable_irq(_get_ep_in(usbdev, 0)); + } } if (usbdev->device->EVENTS_EPDATA && usbdev->device->EPDATASTATUS) { usbdev->device->EVENTS_EPDATA = 0;