From 55427606ef7fbdafa5a9da6b8a0f798dcb619817 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 24 Oct 2018 00:44:26 +0700 Subject: [PATCH] replace dcd_xfer_complete by dcd_xfer_complete() --- src/class/msc/msc_device.c | 8 ++-- src/common/tusb_types.h | 3 -- src/device/dcd.h | 30 ++++++++---- src/device/usbd.c | 46 +++++++------------ src/portable/nordic/nrf5x/dcd_nrf5x.c | 16 +++---- .../nxp/lpc43xx_lpc18xx/dcd_lpc43xx.c | 22 ++++----- 6 files changed, 61 insertions(+), 64 deletions(-) diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index 4d2f9249..b050ea70 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -304,7 +304,7 @@ tusb_error_t mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, tusb_event_t event, u // Complete IN while waiting for CMD is usually Status of previous SCSI op, ignore it if(ep_addr != p_msc->ep_out) return TUSB_ERROR_NONE; - TU_ASSERT( event == TUSB_EVENT_XFER_COMPLETE && + TU_ASSERT( event == DCD_XFER_SUCCESS && xferred_bytes == sizeof(msc_cbw_t) && p_cbw->signature == MSC_CBW_SIGNATURE, TUSB_ERROR_INVALID_PARA ); p_csw->signature = MSC_CSW_SIGNATURE; @@ -434,7 +434,7 @@ tusb_error_t mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, tusb_event_t event, u } // simulate an transfer complete with adjusted parameters --> this driver callback will fired again - dcd_xfer_complete(rhport, p_msc->ep_out, xferred_bytes-nbytes, true); + dcd_event_xfer_complete(rhport, p_msc->ep_out, xferred_bytes-nbytes, DCD_XFER_SUCCESS, false); return TUSB_ERROR_NONE; // skip the rest } @@ -483,7 +483,7 @@ tusb_error_t mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, tusb_event_t event, u if ( dcd_edpt_stalled(rhport, p_msc->ep_in) || dcd_edpt_stalled(rhport, p_msc->ep_out) ) { // simulate an transfer complete with adjusted parameters --> this driver callback will fired again - dcd_xfer_complete(rhport, p_msc->ep_out, 0, true); + dcd_event_xfer_complete(rhport, p_msc->ep_out, 0, DCD_XFER_SUCCESS, false); } else { @@ -545,7 +545,7 @@ static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc) else if ( nbytes == 0 ) { // zero means not ready -> simulate an transfer complete so that this driver callback will fired again - dcd_xfer_complete(rhport, p_msc->ep_in, 0, true); + dcd_event_xfer_complete(rhport, p_msc->ep_in, 0, DCD_XFER_SUCCESS, false); } else { diff --git a/src/common/tusb_types.h b/src/common/tusb_types.h index ee9e849b..8ce334e5 100644 --- a/src/common/tusb_types.h +++ b/src/common/tusb_types.h @@ -197,9 +197,6 @@ typedef enum TUSB_EVENT_XFER_COMPLETE, TUSB_EVENT_XFER_ERROR, TUSB_EVENT_XFER_STALLED, - - TUSB_EVENT_BUS_RESET, // TODO refractor - TUSB_EVENT_SETUP_RECEIVED, }tusb_event_t; enum { diff --git a/src/device/dcd.h b/src/device/dcd.h index 5a28296c..66249670 100644 --- a/src/device/dcd.h +++ b/src/device/dcd.h @@ -49,6 +49,13 @@ extern "C" { #endif +enum +{ + DCD_XFER_SUCCESS = 0, + DCD_XFER_FAILED, + DCD_XFER_STALLED +}; + typedef enum { DCD_EVENT_BUS_RESET = 1, @@ -103,16 +110,23 @@ void dcd_disconnect (uint8_t rhport) ATTR_WEAK; /* Event Function * Called by DCD to notify USBD *------------------------------------------------------------------*/ -void dcd_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, bool succeeded); - -static inline void dcd_control_complete(uint8_t rhport, uint32_t xferred_bytes) -{ - // all control complete is successful !! - dcd_xfer_complete(rhport, 0, xferred_bytes, true); -} - void dcd_event_handler(dcd_event_t const * event, bool in_isr); +static inline void dcd_event_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr) +{ + dcd_event_t event = + { + .rhport = 0, + .event_id = DCD_EVENT_XFER_COMPLETE, + }; + + event.xfer_complete.ep_addr = ep_addr; + event.xfer_complete.len = xferred_bytes; + event.xfer_complete.result = result; + + dcd_event_handler(&event, true); +} + /*------------------------------------------------------------------*/ /* Endpoint API *------------------------------------------------------------------*/ diff --git a/src/device/usbd.c b/src/device/usbd.c index 58581d60..f35671f1 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -164,7 +164,7 @@ static osal_queue_t _usbd_q; /*------------- control transfer semaphore -------------*/ static osal_semaphore_def_t _usbd_sem_def; -/*static*/ osal_semaphore_t _usbd_ctrl_sem; +osal_semaphore_t _usbd_ctrl_sem; //--------------------------------------------------------------------+ // INTERNAL FUNCTION @@ -532,34 +532,6 @@ static void mark_interface_endpoint(uint8_t const* p_desc, uint16_t desc_len, ui //--------------------------------------------------------------------+ // USBD-DCD Callback API //--------------------------------------------------------------------+ -void dcd_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, bool succeeded) -{ - if (ep_addr == 0 ) - { - // Control Transfer - (void) rhport; - (void) succeeded; - - // only signal data stage, skip status (zero byte) - if (xferred_bytes) osal_semaphore_post( _usbd_ctrl_sem, true); - }else - { - dcd_event_t event = - { - .rhport = rhport, - .event_id = DCD_EVENT_XFER_COMPLETE, - }; - - event.xfer_complete.ep_addr = ep_addr; - event.xfer_complete.len = xferred_bytes; - event.xfer_complete.result = succeeded ? TUSB_EVENT_XFER_COMPLETE : TUSB_EVENT_XFER_ERROR; - - osal_queue_send(_usbd_q, &event, true); - } - - TU_ASSERT(succeeded, ); -} - void dcd_event_handler(dcd_event_t const * event, bool in_isr) { uint8_t const rhport = event->rhport; @@ -603,6 +575,22 @@ void dcd_event_handler(dcd_event_t const * event, bool in_isr) osal_queue_send(_usbd_q, event, in_isr); break; + case DCD_EVENT_XFER_COMPLETE: + if (event->xfer_complete.ep_addr == 0) + { + // only signal data stage, skip status (zero byte) + if (event->xfer_complete.len) + { + (void) event->xfer_complete.result; // TODO handle control error/stalled + osal_semaphore_post( _usbd_ctrl_sem, true); + } + }else + { + osal_queue_send(_usbd_q, event, true); + } + TU_ASSERT(event->xfer_complete.result == DCD_XFER_SUCCESS,); + break; + default: break; } } diff --git a/src/portable/nordic/nrf5x/dcd_nrf5x.c b/src/portable/nordic/nrf5x/dcd_nrf5x.c index f04acb6e..d1ca9117 100644 --- a/src/portable/nordic/nrf5x/dcd_nrf5x.c +++ b/src/portable/nordic/nrf5x/dcd_nrf5x.c @@ -414,14 +414,12 @@ void USBD_IRQHandler(void) } } - dcd_event_t event = { .rhport = 0 }; - /*------------- Interrupt Processing -------------*/ if ( int_status & USBD_INTEN_USBRESET_Msk ) { bus_reset(); - event.event_id = DCD_EVENT_BUS_RESET; + dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_BUS_RESET }; dcd_event_handler(&event, true); } @@ -439,7 +437,7 @@ void USBD_IRQHandler(void) NRF_USBD->WINDEXL , NRF_USBD->WINDEXH , NRF_USBD->WLENGTHL, NRF_USBD->WLENGTHH }; - event.event_id = DCD_EVENT_SETUP_RECEIVED; + dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_SETUP_RECEIVED }; memcpy(&event.setup_received, setup, 8); dcd_event_handler(&event, true); @@ -461,7 +459,7 @@ void USBD_IRQHandler(void) }else { // Control IN complete - dcd_control_complete(0, _dcd.control.actual_len); + dcd_event_xfer_complete(0, 0, _dcd.control.actual_len, DCD_XFER_SUCCESS, true); } } } @@ -475,7 +473,7 @@ void USBD_IRQHandler(void) }else { // Control OUT complete - dcd_control_complete(0, _dcd.control.actual_len); + dcd_event_xfer_complete(0, 0, _dcd.control.actual_len, DCD_XFER_SUCCESS, true); } } @@ -506,7 +504,7 @@ void USBD_IRQHandler(void) xfer->total_len = xfer->actual_len; // BULK/INT OUT complete - dcd_xfer_complete(0, epnum, xfer->actual_len, true); + dcd_event_xfer_complete(0, epnum, xfer->actual_len, DCD_XFER_SUCCESS, true); } } @@ -535,7 +533,7 @@ void USBD_IRQHandler(void) } else { // Bulk/Int IN complete - dcd_xfer_complete(0, epnum | TUSB_DIR_IN_MASK, xfer->actual_len, true); + dcd_event_xfer_complete(0, epnum | TUSB_DIR_IN_MASK, xfer->actual_len, DCD_XFER_SUCCESS, true); } } } @@ -563,7 +561,7 @@ void USBD_IRQHandler(void) // SOF interrupt if ( int_status & USBD_INTEN_SOF_Msk ) { - event.event_id = DCD_EVENT_SOF; + dcd_event_t event = { .rhport = 0, .event_id = DCD_EVENT_SOF }; dcd_event_handler(&event, true); } } diff --git a/src/portable/nxp/lpc43xx_lpc18xx/dcd_lpc43xx.c b/src/portable/nxp/lpc43xx_lpc18xx/dcd_lpc43xx.c index 6e1d9616..8d53759e 100644 --- a/src/portable/nxp/lpc43xx_lpc18xx/dcd_lpc43xx.c +++ b/src/portable/nxp/lpc43xx_lpc18xx/dcd_lpc43xx.c @@ -398,10 +398,11 @@ void xfer_complete_isr(uint8_t rhport, uint32_t reg_complete) if (p_qtd->int_on_complete) { - bool succeeded = ( p_qtd->xact_err || p_qtd->halted || p_qtd->buffer_err ) ? false : true; + uint8_t result = p_qtd->halted ? DCD_XFER_STALLED : + ( p_qtd->xact_err ||p_qtd->buffer_err ) ? DCD_XFER_FAILED : DCD_XFER_SUCCESS; uint8_t ep_addr = edpt_phy2addr(ep_idx); - dcd_xfer_complete(rhport, ep_addr, p_qtd->expected_bytes - p_qtd->total_bytes, succeeded); // only number of bytes in the IOC qtd + dcd_event_xfer_complete(rhport, ep_addr, p_qtd->expected_bytes - p_qtd->total_bytes, result, true); // only number of bytes in the IOC qtd } } } @@ -418,13 +419,12 @@ void hal_dcd_isr(uint8_t rhport) if (int_status == 0) return;// disabled interrupt sources - dcd_event_t event = { .rhport = rhport }; if (int_status & INT_MASK_RESET) { bus_reset(rhport); - event.event_id = DCD_EVENT_BUS_RESET; + dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_BUS_RESET }; dcd_event_handler(&event, true); } @@ -434,7 +434,7 @@ void hal_dcd_isr(uint8_t rhport) { // Note: Host may delay more than 3 ms before and/or after bus reset before doing enumeration. if ((lpc_usb->DEVICEADDR >> 25) & 0x0f) { - event.event_id = DCD_EVENT_SUSPENDED; + dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SUSPENDED }; dcd_event_handler(&event, true); } } @@ -445,7 +445,7 @@ void hal_dcd_isr(uint8_t rhport) // { // if ( !(lpc_usb->PORTSC1_D & PORTSC_CURRENT_CONNECT_STATUS_MASK) ) // { -// event.event_id = DCD_EVENT_UNPLUGGED; +// dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_UNPLUGGED }; // dcd_event_handler(&event, true); // } // } @@ -463,7 +463,7 @@ void hal_dcd_isr(uint8_t rhport) // 23.10.10.2 Operational model for setup transfers lpc_usb->ENDPTSETUPSTAT = lpc_usb->ENDPTSETUPSTAT;// acknowledge - event.event_id = DCD_EVENT_SETUP_RECEIVED; + dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SETUP_RECEIVED }; event.setup_received = p_dcd->qhd[0].setup_request; dcd_event_handler(&event, true); @@ -480,10 +480,10 @@ void hal_dcd_isr(uint8_t rhport) if ( p_qtd->int_on_complete ) { - bool succeeded = ( p_qtd->xact_err || p_qtd->halted || p_qtd->buffer_err ) ? false : true; - (void) succeeded; + uint8_t result = p_qtd->halted ? DCD_XFER_STALLED : + ( p_qtd->xact_err ||p_qtd->buffer_err ) ? DCD_XFER_FAILED : DCD_XFER_SUCCESS; - dcd_control_complete(rhport, p_qtd->expected_bytes - p_qtd->total_bytes); + dcd_event_xfer_complete(rhport, 0, p_qtd->expected_bytes - p_qtd->total_bytes, result, true); } } @@ -496,7 +496,7 @@ void hal_dcd_isr(uint8_t rhport) if (int_status & INT_MASK_SOF) { - event.event_id = DCD_EVENT_SOF; + dcd_event_t event = { .rhport = rhport, .event_id = DCD_EVENT_SOF }; dcd_event_handler(&event, true); }