replace dcd_xfer_complete by dcd_xfer_complete()
This commit is contained in:
@@ -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
|
||||
*------------------------------------------------------------------*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user