From 7aeb22a0e92afda3cb10fd40a57c9a952ba8aecb Mon Sep 17 00:00:00 2001 From: George Beckstein Date: Tue, 29 Jan 2019 22:14:47 -0500 Subject: [PATCH] Added data toggle clearing to removing endpoints. Reworked aborting endpoints in nordic driver to prevent an ASSERT when it is called on ISO endpoints --- .../TARGET_MCU_NRF52840/USBPhy_Nordic.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/usb/device/targets/TARGET_NORDIC/TARGET_MCU_NRF52840/USBPhy_Nordic.cpp b/usb/device/targets/TARGET_NORDIC/TARGET_MCU_NRF52840/USBPhy_Nordic.cpp index 6768d44764..bd26b7b94f 100644 --- a/usb/device/targets/TARGET_NORDIC/TARGET_MCU_NRF52840/USBPhy_Nordic.cpp +++ b/usb/device/targets/TARGET_NORDIC/TARGET_MCU_NRF52840/USBPhy_Nordic.cpp @@ -64,7 +64,6 @@ static USBPhyHw *instance = 0; static void usbd_event_handler(nrf_drv_usbd_evt_t const * const p_event); static void power_usb_event_handler(nrf_drv_power_usb_evt_t event); -bool mbed_nrf_feeder_ep0(nrf_drv_usbd_ep_transfer_t * p_next, void * p_context, size_t ep_size); #if USBD_DEBUG @@ -74,6 +73,11 @@ static uint8_t debug_evt_index = 0; #endif +// TODO remove this -- for debugging purposes +int nrf_usb_iface = 0; +void usb_phy_interface_was_set(int iface) { nrf_usb_iface = iface; } + + USBPhy *get_usb_phy() { static USBPhyHw usbphy; return &usbphy; @@ -365,6 +369,10 @@ bool USBPhyHw::endpoint_add(usb_ep_t endpoint, uint32_t max_packet, usb_ep_type_ void USBPhyHw::endpoint_remove(usb_ep_t endpoint) { nrf_drv_usbd_ep_t nrf_ep = get_nordic_endpoint(endpoint); + // Reset data toggle for bulk/interrupt endpoints + if(nrf_ep != NRF_DRV_USBD_EPOUT8 && nrf_ep != NRF_DRV_USBD_EPIN8) + nrf_drv_usbd_ep_dtoggle_clear(nrf_ep); + nrf_drv_usbd_ep_disable(nrf_ep); } @@ -381,6 +389,10 @@ bool USBPhyHw::endpoint_read(usb_ep_t endpoint, uint8_t *data, uint32_t size) { memset(transfer, 0, sizeof(nrf_drv_usbd_transfer_t)); transfer->p_data.rx = data; transfer->size = size; + + //if(endpoint == 8) + // return true; + ret_code_t ret = nrf_drv_usbd_ep_transfer(get_nordic_endpoint(endpoint), transfer); return (ret == NRF_SUCCESS); } @@ -444,6 +456,10 @@ void USBPhyHw::process() { events->sof(usb_event.data.sof.framecnt); break; case NRF_DRV_USBD_EVT_EPTRANSFER: + if(nrf_usb_iface == 2 && usb_event.data.eptransfer.ep == NRF_DRV_USBD_EPOUT1) + { + while(true); + } if(usb_event.data.eptransfer.status == NRF_USBD_EP_OK) { if(IS_IN_EP(usb_event.data.eptransfer.ep))