diff options
| author | hathach <[email protected]> | 2018-06-22 12:53:13 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2018-06-22 12:53:13 +0700 |
| commit | e3591ac682b403c1a3a7c4426056c9c37b1a9088 (patch) | |
| tree | 82f2f758c49580039696ba286bc33dc8c9f3d03a /src/device | |
| parent | af268ce951e9c7c4ea6d266b5ab6e189395f0916 (diff) | |
enhance usbd: add usbd_defer_func()
Diffstat (limited to 'src/device')
| -rw-r--r-- | src/device/usbd.c | 50 | ||||
| -rw-r--r-- | src/device/usbd_pvt.h | 17 |
2 files changed, 50 insertions, 17 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c index 59aa93c82..4332c2925 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -161,23 +161,30 @@ typedef enum USBD_EVT_XFER_DONE,
USBD_EVT_SOF,
-
+ USBD_EVT_FUNC_CALL
}usbd_eventid_t;
typedef struct ATTR_ALIGNED(4)
{
uint8_t rhport;
uint8_t event_id;
- uint8_t sub_event_id;
- uint8_t reserved;
union {
+ // USBD_EVT_SETUP_RECEIVED
tusb_control_request_t setup_received;
- struct { // USBD_EVENTID_XFER_DONE
+ // USBD_EVT_XFER_DONE
+ struct {
uint8_t ep_addr;
+ uint8_t result;
uint32_t xferred_byte;
}xfer_done;
+
+ // USBD_EVT_FUNC_CALL
+ struct {
+ void (*func)(void*);
+ void* param;
+ }func_call;
};
} usbd_task_event_t;
@@ -287,7 +294,7 @@ static tusb_error_t usbd_main_st(void) {
if ( usbd_class_drivers[i].xfer_cb )
{
- usbd_class_drivers[i].xfer_cb( event.rhport, event.xfer_done.ep_addr, (tusb_event_t) event.sub_event_id, event.xfer_done.xferred_byte);
+ usbd_class_drivers[i].xfer_cb( event.rhport, event.xfer_done.ep_addr, (tusb_event_t) event.xfer_done.result, event.xfer_done.xferred_byte);
}
}
}
@@ -582,24 +589,24 @@ void dcd_xfer_complete(uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, if (xferred_bytes) osal_semaphore_post_isr( _usbd_ctrl_sem );
}else
{
- usbd_task_event_t task_event =
+ usbd_task_event_t event =
{
.rhport = rhport,
.event_id = USBD_EVT_XFER_DONE,
- .sub_event_id = succeeded ? TUSB_EVENT_XFER_COMPLETE : TUSB_EVENT_XFER_ERROR
};
- task_event.xfer_done.ep_addr = ep_addr;
- task_event.xfer_done.xferred_byte = xferred_bytes;
+ event.xfer_done.ep_addr = ep_addr;
+ event.xfer_done.xferred_byte = xferred_bytes;
+ event.xfer_done.result = succeeded ? TUSB_EVENT_XFER_COMPLETE : TUSB_EVENT_XFER_ERROR;
- osal_queue_send_isr(_usbd_q, &task_event);
+ osal_queue_send_isr(_usbd_q, &event);
}
TU_ASSERT(succeeded, );
}
//--------------------------------------------------------------------+
-// HELPER
+// Helper
//--------------------------------------------------------------------+
tusb_error_t usbd_open_edpt_pair(uint8_t rhport, tusb_desc_endpoint_t const* p_desc_ep, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in)
{
@@ -623,4 +630,25 @@ tusb_error_t usbd_open_edpt_pair(uint8_t rhport, tusb_desc_endpoint_t const* p_d return TUSB_ERROR_NONE;
}
+
+void usbd_defer_func(void (*func)(void*), void* param, bool isr )
+{
+ usbd_task_event_t event =
+ {
+ .rhport = 0,
+ .event_id = USBD_EVT_FUNC_CALL,
+ };
+
+ event.func_call.func = func;
+ event.func_call.param = param;
+
+ if ( isr )
+ {
+ osal_queue_send_isr(_usbd_q, &event);
+ }else
+ {
+ osal_queue_send(_usbd_q, &event);
+ }
+}
+
#endif
diff --git a/src/device/usbd_pvt.h b/src/device/usbd_pvt.h index 067d7e937..4632fc52b 100644 --- a/src/device/usbd_pvt.h +++ b/src/device/usbd_pvt.h @@ -36,6 +36,7 @@ #ifndef USBD_PVT_H_ #define USBD_PVT_H_ +#include "osal/osal.h" #ifdef __cplusplus extern "C" { @@ -45,18 +46,18 @@ extern osal_semaphore_t _usbd_ctrl_sem; //--------------------------------------------------------------------+ -// INTERNAL API +// INTERNAL API for stack management //--------------------------------------------------------------------+ -tusb_error_t usbd_init(void); -void usbd_task( void* param); +tusb_error_t usbd_init (void); +void usbd_task (void* param); +/*------------------------------------------------------------------*/ +/* Endpoint helper + *------------------------------------------------------------------*/ // helper to parse an pair of In and Out endpoint descriptors. They must be consecutive tusb_error_t usbd_open_edpt_pair(uint8_t rhport, tusb_desc_endpoint_t const* p_desc_ep, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in); // Carry out Data and Status stage of control transfer -//tusb_error_t usbd_control_xfer_st(uint8_t rhport, tusb_dir_t dir, uint8_t * buffer, uint16_t length); - -// Carry out Data and Status stage of control transfer // Must be call in a subtask (_st) function #define usbd_control_xfer_st(_rhport, _dir, _buffer, _len) \ do {\ @@ -72,6 +73,10 @@ tusb_error_t usbd_open_edpt_pair(uint8_t rhport, tusb_desc_endpoint_t const* p_d }while(0) +/*------------------------------------------------------------------*/ +/* Other Helpers + *------------------------------------------------------------------*/ +void usbd_defer_func( void (*func)(void*), void* param, bool isr ); #ifdef __cplusplus |
