summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2018-10-24 00:44:26 +0700
committerhathach <[email protected]>2018-10-24 00:44:26 +0700
commit55427606ef7fbdafa5a9da6b8a0f798dcb619817 (patch)
tree0b76127b0de1ae08fa62359f959228b895101f73
parente7a63324dd02bb8c8193b26631b4b7ef5d08fd0b (diff)
replace dcd_xfer_complete by dcd_xfer_complete()
-rw-r--r--src/class/msc/msc_device.c8
-rw-r--r--src/common/tusb_types.h3
-rw-r--r--src/device/dcd.h26
-rw-r--r--src/device/usbd.c46
-rw-r--r--src/portable/nordic/nrf5x/dcd_nrf5x.c16
-rw-r--r--src/portable/nxp/lpc43xx_lpc18xx/dcd_lpc43xx.c22
6 files changed, 59 insertions, 62 deletions
diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c
index 4d2f9249c..b050ea705 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 ee9e849bf..8ce334e55 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 5a28296cd..662496701 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,15 +110,22 @@ 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);
+void dcd_event_handler(dcd_event_t const * event, bool in_isr);
-static inline void dcd_control_complete(uint8_t rhport, uint32_t xferred_bytes)
+static inline void dcd_event_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr)
{
- // all control complete is successful !!
- dcd_xfer_complete(rhport, 0, xferred_bytes, true);
-}
+ dcd_event_t event =
+ {
+ .rhport = 0,
+ .event_id = DCD_EVENT_XFER_COMPLETE,
+ };
-void dcd_event_handler(dcd_event_t const * event, bool in_isr);
+ 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 58581d609..f35671f17 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 f04acb6e3..d1ca91173 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 6e1d96168..8d53759e6 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);
}