diff options
| author | hathach <[email protected]> | 2013-11-26 13:15:40 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2013-11-26 13:15:40 +0700 |
| commit | 8f70a6a886aa557dd87086b807367eef662a7e77 (patch) | |
| tree | 062c136d68c807be53bf74677c8210940bc5d661 /tinyusb/device | |
| parent | 51def3f7ed6b1ac849cb357a9868328d8c5e3117 (diff) | |
change endian conversion to native to be & be to native
completely deferred xfer isr event to usbd task
complete read10, write10 sequence for large data transfer
Diffstat (limited to 'tinyusb/device')
| -rw-r--r-- | tinyusb/device/usbd.c | 71 | ||||
| -rw-r--r-- | tinyusb/device/usbd.h | 2 |
2 files changed, 49 insertions, 24 deletions
diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 2ca0e01ce..90a7247e6 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -70,7 +70,7 @@ static usbd_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_STAR .init = hidd_init, .open = hidd_open, .control_request = hidd_control_request, - .isr = hidd_isr, + .xfer_cb = hidd_isr, .close = hidd_close }, #endif @@ -81,7 +81,7 @@ static usbd_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_STAR .init = mscd_init, .open = mscd_open, .control_request = mscd_control_request, - .isr = mscd_isr, + .xfer_cb = mscd_xfer_cb, .close = mscd_close }, #endif @@ -92,7 +92,7 @@ static usbd_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_STAR .init = cdcd_init, .open = cdcd_open, .control_request = cdcd_control_request, - .isr = cdcd_isr, + .xfer_cb = cdcd_isr, .close = cdcd_close }, #endif @@ -123,16 +123,29 @@ enum { }; typedef enum { - USBD_EVENTID_SETUP_RECEIVED = 1 + USBD_EVENTID_SETUP_RECEIVED = 1, + USBD_EVENTID_XFER_DONE }usbd_eventid_t; -typedef struct ATTR_ALIGNED(2) +typedef struct ATTR_ALIGNED(4) { uint8_t coreid; uint8_t event_id; - uint8_t data[ MAX_OF(sizeof(tusb_control_request_t), sizeof(endpoint_handle_t)) ]; // hold control request or endpoint handle + uint8_t sub_event_id; + uint8_t reserved; + + union { + tusb_control_request_t setup_received; // USBD_EVENTID_SETUP_RECEIVED + + struct { // USBD_EVENTID_XFER_DONE + endpoint_handle_t edpt_hdl; + uint32_t xferred_byte; + }xfer_done; + }; }usbd_task_event_t; +STATIC_ASSERT(sizeof(usbd_task_event_t) <= 12, "size is not correct"); + OSAL_TASK_DEF(usbd_task, 150, TUSB_CFG_OS_TASK_PRIO); OSAL_QUEUE_DEF(usbd_queue_def, USBD_TASK_QUEUE_DEPTH, usbd_task_event_t); OSAL_SEM_DEF(usbd_control_xfer_semaphore_def); @@ -190,6 +203,7 @@ tusb_error_t usbd_control_request_subtask(uint8_t coreid, tusb_control_request_t error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; } } + //------------- Class/Interface Specific Request -------------// else if ( TUSB_REQUEST_RECIPIENT_INTERFACE == p_request->bmRequestType_bit.recipient) { @@ -204,6 +218,7 @@ tusb_error_t usbd_control_request_subtask(uint8_t coreid, tusb_control_request_t error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; } } + //------------- Endpoint Request -------------// else if ( TUSB_REQUEST_RECIPIENT_ENDPOINT == p_request->bmRequestType_bit.recipient && TUSB_REQUEST_TYPE_STANDARD == p_request->bmRequestType_bit.type && @@ -242,12 +257,20 @@ OSAL_TASK_FUNCTION(usbd_task) (void* p_task_para) if ( USBD_EVENTID_SETUP_RECEIVED == event.event_id ) { - OSAL_SUBTASK_INVOKED_AND_WAIT( usbd_control_request_subtask(event.coreid, (tusb_control_request_t*) event.data), error ); + OSAL_SUBTASK_INVOKED_AND_WAIT( usbd_control_request_subtask(event.coreid, &event.setup_received), error ); }else { + uint8_t class_index; + class_index = std_class_code_to_index( event.xfer_done.edpt_hdl.class_code ); + if (usbd_class_drivers[class_index].xfer_cb) + { + usbd_class_drivers[class_index].xfer_cb( event.xfer_done.edpt_hdl, event.sub_event_id, event.xfer_done.xferred_byte); + }else + { + hal_debugger_breakpoint(); // something wrong, no one claims the isr's source + } } - //else {} OSAL_TASK_LOOP_END } @@ -381,36 +404,38 @@ void usbd_dcd_bus_event_isr(uint8_t coreid, usbd_bus_event_type_t bus_event) void usbd_setup_received_isr(uint8_t coreid, tusb_control_request_t * p_request) { - usbd_task_event_t event = + usbd_task_event_t task_event = { - .coreid = coreid, - .event_id = USBD_EVENTID_SETUP_RECEIVED + .coreid = coreid, + .event_id = USBD_EVENTID_SETUP_RECEIVED, }; - memcpy(event.data, p_request, sizeof(tusb_control_request_t)); - - osal_queue_send(usbd_queue_hdl, &event); + task_event.setup_received = (*p_request); + osal_queue_send(usbd_queue_hdl, &task_event); } void usbd_xfer_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes) { -// usbd_device_info_t *p_device = &usbd_devices[edpt_hdl.coreid]; - uint8_t class_index = std_class_code_to_index(edpt_hdl.class_code); - - if (class_index == 0 ) // Control Transfer + if (edpt_hdl.class_code == 0 ) // Control Transfer { if (usbd_devices[edpt_hdl.coreid].is_waiting_control_xfer) { osal_semaphore_post( usbd_control_xfer_sem_hdl ); } - }else if (usbd_class_drivers[class_index].isr) - { - usbd_class_drivers[class_index].isr(edpt_hdl, event, xferred_bytes); }else { - ASSERT(false, VOID_RETURN); // something wrong, no one claims the isr's source - } + usbd_task_event_t task_event = + { + .coreid = edpt_hdl.coreid, + .event_id = USBD_EVENTID_XFER_DONE, + .sub_event_id = event + }; + task_event.xfer_done.xferred_byte = xferred_bytes; + task_event.xfer_done.edpt_hdl = edpt_hdl; + + osal_queue_send(usbd_queue_hdl, &task_event); + } } //--------------------------------------------------------------------+ diff --git a/tinyusb/device/usbd.h b/tinyusb/device/usbd.h index d1e71c0dd..12b329aa8 100644 --- a/tinyusb/device/usbd.h +++ b/tinyusb/device/usbd.h @@ -71,7 +71,7 @@ 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) (uint8_t, tusb_control_request_t const *); - void (* const isr) (endpoint_handle_t, tusb_event_t, uint32_t); + tusb_error_t (* const xfer_cb) (endpoint_handle_t, tusb_event_t, uint32_t); void (* const close) (uint8_t); } usbd_class_driver_t; |
