diff options
| author | hathach <[email protected]> | 2018-10-24 00:44:26 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2018-10-24 00:44:26 +0700 |
| commit | 55427606ef7fbdafa5a9da6b8a0f798dcb619817 (patch) | |
| tree | 0b76127b0de1ae08fa62359f959228b895101f73 /src/device | |
| parent | e7a63324dd02bb8c8193b26631b4b7ef5d08fd0b (diff) | |
replace dcd_xfer_complete by dcd_xfer_complete()
Diffstat (limited to 'src/device')
| -rw-r--r-- | src/device/dcd.h | 26 | ||||
| -rw-r--r-- | src/device/usbd.c | 46 |
2 files changed, 37 insertions, 35 deletions
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;
}
}
|
