From 4ddac8bc88822fc7439b8b2532fe8234d74fee8d Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 8 Mar 2018 14:38:06 +0700 Subject: enhance cdc device API --- tinyusb/device/dcd.h | 1 + tinyusb/device/usbd.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++--- tinyusb/device/usbd.h | 12 +++++++----- 3 files changed, 58 insertions(+), 8 deletions(-) (limited to 'tinyusb/device') diff --git a/tinyusb/device/dcd.h b/tinyusb/device/dcd.h index 3cf732d23..10704951e 100644 --- a/tinyusb/device/dcd.h +++ b/tinyusb/device/dcd.h @@ -53,6 +53,7 @@ typedef enum { USBD_BUS_EVENT_RESET = 1, USBD_BUS_EVENT_UNPLUGGED, + USBD_BUS_EVENT_SOF, USBD_BUS_EVENT_SUSPENDED, USBD_BUS_EVENT_RESUME }usbd_bus_event_type_t; diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 1ed854cae..5733704db 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -63,6 +63,8 @@ static usbd_class_driver_t const usbd_class_drivers[] = .open = hidd_open, .control_request_subtask = hidd_control_request_subtask, .xfer_cb = hidd_xfer_cb, +// .routine = NULL, + .sof = NULL, .close = hidd_close }, #endif @@ -74,6 +76,8 @@ static usbd_class_driver_t const usbd_class_drivers[] = .open = mscd_open, .control_request_subtask = mscd_control_request_subtask, .xfer_cb = mscd_xfer_cb, +// .routine = NULL, + .sof = NULL, .close = mscd_close }, #endif @@ -85,6 +89,8 @@ static usbd_class_driver_t const usbd_class_drivers[] = .open = cdcd_open, .control_request_subtask = cdcd_control_request_subtask, .xfer_cb = cdcd_xfer_cb, +// .routine = NULL, + .sof = cdcd_sof, .close = cdcd_close }, #endif @@ -117,7 +123,8 @@ enum { USBD_TASK_QUEUE_DEPTH = 16 }; typedef enum { USBD_EVENTID_SETUP_RECEIVED = 1, - USBD_EVENTID_XFER_DONE + USBD_EVENTID_XFER_DONE, + USBD_EVENTID_SOF }usbd_eventid_t; typedef struct ATTR_ALIGNED(4) @@ -128,7 +135,7 @@ typedef struct ATTR_ALIGNED(4) uint8_t reserved; union { - tusb_control_request_t setup_received; // USBD_EVENTID_SETUP_RECEIVED + tusb_control_request_t setup_received; struct { // USBD_EVENTID_XFER_DONE endpoint_handle_t edpt_hdl; @@ -213,8 +220,27 @@ static tusb_error_t usbd_body_subtask(void) error = TUSB_ERROR_NONE; memclr_(&event, sizeof(usbd_task_event_t)); + +#if 1 osal_queue_receive(usbd_queue_hdl, &event, OSAL_TIMEOUT_WAIT_FOREVER, &error); SUBTASK_ASSERT_STATUS(error); +#else + enum { ROUTINE_INTERVAL_MS = 10 }; + osal_queue_receive(usbd_queue_hdl, &event, ROUTINE_INTERVAL_MS, &error); + if ( error != TUSB_ERROR_NONE ) + { + // time out, run class routine then + if ( error == TUSB_ERROR_OSAL_TIMEOUT) + { + for (uint8_t class_code = TUSB_CLASS_AUDIO; class_code < USBD_CLASS_DRIVER_COUNT; class_code++) + { + if ( usbd_class_drivers[class_code].routine ) usbd_class_drivers[class_code].routine(); + } + } + + SUBTASK_RETURN(error); + } +#endif if ( USBD_EVENTID_SETUP_RECEIVED == event.event_id ) { @@ -229,7 +255,17 @@ static tusb_error_t usbd_body_subtask(void) usbd_class_drivers[class_code].xfer_cb( event.xfer_done.edpt_hdl, (tusb_event_t) event.sub_event_id, event.xfer_done.xferred_byte); } } - }else + }else if (USBD_EVENTID_SOF == event.event_id) + { + for (uint8_t class_code = TUSB_CLASS_AUDIO; class_code < USBD_CLASS_DRIVER_COUNT; class_code++) + { + if ( usbd_class_drivers[class_code].sof ) + { + usbd_class_drivers[class_code].sof( event.coreid ); + } + } + } + else { SUBTASK_ASSERT(false); } @@ -429,6 +465,17 @@ void hal_dcd_bus_event(uint8_t coreid, usbd_bus_event_type_t bus_event) tud_umount_cb(coreid); break; + case USBD_BUS_EVENT_SOF: + { + usbd_task_event_t task_event = + { + .coreid = coreid, + .event_id = USBD_EVENTID_SOF, + }; + osal_queue_send(usbd_queue_hdl, &task_event); + } + break; + case USBD_BUS_EVENT_UNPLUGGED : break; case USBD_BUS_EVENT_SUSPENDED: diff --git a/tinyusb/device/usbd.h b/tinyusb/device/usbd.h index 28923dfae..df6006c63 100644 --- a/tinyusb/device/usbd.h +++ b/tinyusb/device/usbd.h @@ -77,11 +77,13 @@ typedef struct { extern tusbd_descriptor_pointer_t tusbd_descriptor_pointers; typedef struct { - void (* const init) (void); - tusb_error_t (* const open)(uint8_t, tusb_descriptor_interface_t const *, uint16_t*); - tusb_error_t (* const control_request_subtask) (uint8_t, tusb_control_request_t const *); - tusb_error_t (* const xfer_cb) (endpoint_handle_t, tusb_event_t, uint32_t); - void (* const close) (uint8_t); + void (* init) (void); + tusb_error_t (* open)(uint8_t, tusb_descriptor_interface_t const *, uint16_t*); + tusb_error_t (* control_request_subtask) (uint8_t coreid, tusb_control_request_t const *); + tusb_error_t (* xfer_cb) (endpoint_handle_t, tusb_event_t, uint32_t); +// void (* routine)(void); + void (* sof)(uint8_t coreid); + void (* close) (uint8_t); } usbd_class_driver_t; //--------------------------------------------------------------------+ -- cgit v1.3.1