diff --git a/hw/mcu/nxp/lpc43xx/tusb_port/dcd_lpc43xx.c b/hw/mcu/nxp/lpc43xx/tusb_port/dcd_lpc43xx.c index 63f17c5e..36734d51 100644 --- a/hw/mcu/nxp/lpc43xx/tusb_port/dcd_lpc43xx.c +++ b/hw/mcu/nxp/lpc43xx/tusb_port/dcd_lpc43xx.c @@ -150,10 +150,9 @@ typedef struct ATTR_ALIGNED(64) { /// Due to the fact QHD is 64 bytes aligned but occupies only 48 bytes /// thus there are 16 bytes padding free that we can make use of. //--------------------------------------------------------------------+ - uint8_t class_code; // Class code that endpoint belongs to volatile uint8_t list_qtd_idx[DCD_QTD_PER_QHD_MAX]; - uint8_t reserved[15-DCD_QTD_PER_QHD_MAX]; + uint8_t reserved[16-DCD_QTD_PER_QHD_MAX]; } dcd_qhd_t; STATIC_ASSERT( sizeof(dcd_qhd_t) == 64, "size is not correct"); @@ -392,13 +391,13 @@ tusb_error_t dcd_pipe_clear_stall(uint8_t coreid, uint8_t edpt_addr) return TUSB_ERROR_NONE; } -endpoint_handle_t dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const * p_endpoint_desc, uint8_t class_code) +endpoint_handle_t hal_dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const * p_endpoint_desc) { // TODO USB1 only has 4 non-control enpoint (USB0 has 5) endpoint_handle_t const null_handle = { 0 }; - if (p_endpoint_desc->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS) - return null_handle; // TODO not support ISO yet + // TODO not support ISO yet + if (p_endpoint_desc->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS) return null_handle; tusb_direction_t dir = (p_endpoint_desc->bEndpointAddress & TUSB_DIR_DEV_TO_HOST_MASK) ? TUSB_DIR_DEV_TO_HOST : TUSB_DIR_HOST_TO_DEV; @@ -408,7 +407,6 @@ endpoint_handle_t dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const memclr_(p_qhd, sizeof(dcd_qhd_t)); - p_qhd->class_code = class_code; p_qhd->zero_length_termination = 1; p_qhd->max_package_size = p_endpoint_desc->wMaxPacketSize.size; p_qhd->qtd_overlay.next = QTD_NEXT_INVALID; @@ -423,7 +421,6 @@ endpoint_handle_t dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const { .coreid = coreid, .index = ep_idx, - .class_code = class_code }; } @@ -496,7 +493,6 @@ void xfer_complete_isr(uint8_t coreid, uint32_t reg_complete) { .coreid = coreid, .index = ep_idx, - .class_code = p_qhd->class_code }; // retire all QTDs in array list, up to 1st still-active QTD @@ -587,7 +583,6 @@ void dcd_isr(uint8_t coreid) { .coreid = coreid, .index = 0, - .class_code = 0 }; tusb_event_t event = ( p_qtd->xact_err || p_qtd->halted || p_qtd->buffer_err ) ? TUSB_EVENT_XFER_ERROR : TUSB_EVENT_XFER_COMPLETE; diff --git a/tinyusb/class/cdc_device.c b/tinyusb/class/cdc_device.c index b938b6c5..84027b5a 100644 --- a/tinyusb/class/cdc_device.c +++ b/tinyusb/class/cdc_device.c @@ -135,7 +135,7 @@ tusb_error_t cdcd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_int if ( TUSB_DESC_TYPE_ENDPOINT == p_desc[DESCRIPTOR_OFFSET_TYPE]) { // notification endpoint if any - p_cdc->edpt_hdl[CDC_PIPE_NOTIFICATION] = dcd_pipe_open(coreid, (tusb_descriptor_endpoint_t const *) p_desc, TUSB_CLASS_CDC); + p_cdc->edpt_hdl[CDC_PIPE_NOTIFICATION] = hal_dcd_pipe_open(coreid, (tusb_descriptor_endpoint_t const *) p_desc); (*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH]; p_desc = descriptor_next(p_desc); @@ -160,7 +160,7 @@ tusb_error_t cdcd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_int endpoint_handle_t * p_edpt_hdl = ( p_endpoint->bEndpointAddress & TUSB_DIR_DEV_TO_HOST_MASK ) ? &p_cdc->edpt_hdl[CDC_PIPE_DATA_IN] : &p_cdc->edpt_hdl[CDC_PIPE_DATA_OUT] ; - (*p_edpt_hdl) = dcd_pipe_open(coreid, p_endpoint, TUSB_CLASS_CDC); + (*p_edpt_hdl) = hal_dcd_pipe_open(coreid, p_endpoint); ASSERT ( endpointhandle_is_valid(*p_edpt_hdl), TUSB_ERROR_DCD_OPEN_PIPE_FAILED ); (*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH]; diff --git a/tinyusb/class/hid_device.c b/tinyusb/class/hid_device.c index 43f1546a..83c06411 100644 --- a/tinyusb/class/hid_device.c +++ b/tinyusb/class/hid_device.c @@ -280,7 +280,7 @@ tusb_error_t hidd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_int ASSERT_PTR(p_hid, TUSB_ERROR_FAILED); - p_hid->ept_handle = dcd_pipe_open(coreid, p_desc_endpoint, p_interface_desc->bInterfaceClass); + p_hid->ept_handle = hal_dcd_pipe_open(coreid, p_desc_endpoint); ASSERT( endpointhandle_is_valid(p_hid->ept_handle), TUSB_ERROR_DCD_FAILED); p_hid->interface_number = p_interface_desc->bInterfaceNumber; diff --git a/tinyusb/class/msc_device.c b/tinyusb/class/msc_device.c index 5ac927fa..d3ac68e8 100644 --- a/tinyusb/class/msc_device.c +++ b/tinyusb/class/msc_device.c @@ -101,7 +101,7 @@ tusb_error_t mscd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_int endpoint_handle_t * p_edpt_hdl = ( p_endpoint->bEndpointAddress & TUSB_DIR_DEV_TO_HOST_MASK ) ? &p_msc->edpt_in : &p_msc->edpt_out; - (*p_edpt_hdl) = dcd_pipe_open(coreid, p_endpoint, p_interface_desc->bInterfaceClass); + (*p_edpt_hdl) = hal_dcd_pipe_open(coreid, p_endpoint); ASSERT( endpointhandle_is_valid(*p_edpt_hdl), TUSB_ERROR_DCD_FAILED); p_endpoint = (tusb_descriptor_endpoint_t const *) descriptor_next( (uint8_t const*) p_endpoint ); @@ -152,6 +152,8 @@ tusb_error_t mscd_xfer_cb(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32 msc_cmd_block_wrapper_t * const p_cbw = &p_msc->cbw; msc_cmd_status_wrapper_t * const p_csw = &p_msc->csw; + VERIFY(endpointhandle_is_equal(edpt_hdl, p_msc->edpt_out) || endpointhandle_is_equal(edpt_hdl, p_msc->edpt_in), TUSB_ERROR_INVALID_PARA); + //------------- new CBW received -------------// if ( !is_waiting_read10_write10 ) { diff --git a/tinyusb/device/dcd.h b/tinyusb/device/dcd.h index 2fa8f1b8..d9b33974 100644 --- a/tinyusb/device/dcd.h +++ b/tinyusb/device/dcd.h @@ -60,21 +60,18 @@ typedef enum // TODO move Hal typedef struct { uint8_t coreid; - uint8_t reserved; // TODO redundant, cannot be control as control uses separated API - uint8_t index; - uint8_t class_code; + uint8_t index; // must be zero to indicate control } endpoint_handle_t; -static inline bool endpointhandle_is_valid(endpoint_handle_t edpt_hdl) ATTR_CONST ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool endpointhandle_is_valid(endpoint_handle_t edpt_hdl) { - return (edpt_hdl.class_code != 0); + // Control does not use this to check + return edpt_hdl.index != 0; } -static inline bool endpointhandle_is_equal(endpoint_handle_t x, endpoint_handle_t y) ATTR_CONST ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool endpointhandle_is_equal(endpoint_handle_t x, endpoint_handle_t y) { - return (x.coreid == y.coreid) && (x.index == y.index) && (x.class_code == y.class_code); + return (x.coreid == y.coreid) && (x.index == y.index); } @@ -95,7 +92,7 @@ void hal_dcd_setup_received(uint8_t coreid, uint8_t const* p_request); bool hal_dcd_control_xfer(uint8_t coreid, tusb_direction_t dir, uint8_t * p_buffer, uint16_t length, bool int_on_complete); void hal_dcd_control_stall(uint8_t coreid); -endpoint_handle_t dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const * p_endpoint_desc, uint8_t class_code); +endpoint_handle_t hal_dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const * p_endpoint_desc); tusb_error_t dcd_pipe_queue_xfer(endpoint_handle_t edpt_hdl, uint8_t * buffer, uint16_t total_bytes); // only queue, not transferring yet tusb_error_t dcd_pipe_xfer(endpoint_handle_t edpt_hdl, uint8_t * buffer, uint16_t total_bytes, bool int_on_complete); tusb_error_t dcd_pipe_stall(endpoint_handle_t edpt_hdl); diff --git a/tinyusb/device/dcd_lpc175x_6x.c b/tinyusb/device/dcd_lpc175x_6x.c index dbd25106..ac2e4017 100644 --- a/tinyusb/device/dcd_lpc175x_6x.c +++ b/tinyusb/device/dcd_lpc175x_6x.c @@ -412,7 +412,7 @@ bool hal_dcd_control_xfer(uint8_t coreid, tusb_direction_t dir, uint8_t * p_buff //--------------------------------------------------------------------+ // BULK/INTERRUPT/ISO PIPE API //--------------------------------------------------------------------+ -endpoint_handle_t dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const * p_endpoint_desc, uint8_t class_code) +endpoint_handle_t hal_dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const * p_endpoint_desc, uint8_t class_code) { (void) coreid; diff --git a/tinyusb/device/dcd_lpc_11uxx_13uxx.c b/tinyusb/device/dcd_lpc_11uxx_13uxx.c index 66fabec2..b0e73ac9 100644 --- a/tinyusb/device/dcd_lpc_11uxx_13uxx.c +++ b/tinyusb/device/dcd_lpc_11uxx_13uxx.c @@ -460,7 +460,7 @@ tusb_error_t dcd_pipe_clear_stall(uint8_t coreid, uint8_t edpt_addr) return TUSB_ERROR_NONE; } -endpoint_handle_t dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const * p_endpoint_desc, uint8_t class_code) +endpoint_handle_t hal_dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const * p_endpoint_desc, uint8_t class_code) { (void) coreid; endpoint_handle_t const null_handle = { 0 }; diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 4428948f..3a3bb622 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -221,11 +221,11 @@ static tusb_error_t usbd_body_subtask(void) OSAL_SUBTASK_INVOKED_AND_WAIT( usbd_control_request_subtask(event.coreid, &event.setup_received), error ); }else if (USBD_EVENTID_XFER_DONE == event.event_id) { - uint8_t class_index; - class_index = std_class_code_to_index( event.xfer_done.edpt_hdl.class_code ); - - SUBTASK_ASSERT(usbd_class_drivers[class_index].xfer_cb != NULL); - usbd_class_drivers[class_index].xfer_cb( event.xfer_done.edpt_hdl, (tusb_event_t) event.sub_event_id, event.xfer_done.xferred_byte); + // Call class handling function, Class that endpoint not belong to should check and return + for (uint8_t class_code = TUSB_CLASS_AUDIO; class_code < USBD_CLASS_DRIVER_COUNT; class_code++) + { + if ( usbd_class_drivers[class_code].xfer_cb ) 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 { SUBTASK_ASSERT(false); @@ -445,8 +445,10 @@ void hal_dcd_setup_received(uint8_t coreid, uint8_t const* p_request) void usbd_xfer_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes) { - if (edpt_hdl.class_code == 0 ) // Control Transfer +// if (edpt_hdl.class_code == 0 ) + if (edpt_hdl.index == 0 ) { + // Control Transfer osal_semaphore_post( usbd_control_xfer_sem_hdl ); }else {