mirror of
https://github.com/hathach/tinyusb.git
synced 2025-04-16 05:42:56 +00:00
remove class code in pipe open()
This commit is contained in:
parent
85511e288d
commit
c5cb58b2bb
@ -150,10 +150,9 @@ typedef struct ATTR_ALIGNED(64) {
|
|||||||
/// Due to the fact QHD is 64 bytes aligned but occupies only 48 bytes
|
/// 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.
|
/// 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];
|
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;
|
} dcd_qhd_t;
|
||||||
|
|
||||||
STATIC_ASSERT( sizeof(dcd_qhd_t) == 64, "size is not correct");
|
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;
|
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)
|
// TODO USB1 only has 4 non-control enpoint (USB0 has 5)
|
||||||
endpoint_handle_t const null_handle = { 0 };
|
endpoint_handle_t const null_handle = { 0 };
|
||||||
|
|
||||||
if (p_endpoint_desc->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS)
|
// TODO not support ISO yet
|
||||||
return null_handle; // 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;
|
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));
|
memclr_(p_qhd, sizeof(dcd_qhd_t));
|
||||||
|
|
||||||
p_qhd->class_code = class_code;
|
|
||||||
p_qhd->zero_length_termination = 1;
|
p_qhd->zero_length_termination = 1;
|
||||||
p_qhd->max_package_size = p_endpoint_desc->wMaxPacketSize.size;
|
p_qhd->max_package_size = p_endpoint_desc->wMaxPacketSize.size;
|
||||||
p_qhd->qtd_overlay.next = QTD_NEXT_INVALID;
|
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,
|
.coreid = coreid,
|
||||||
.index = ep_idx,
|
.index = ep_idx,
|
||||||
.class_code = class_code
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -496,7 +493,6 @@ void xfer_complete_isr(uint8_t coreid, uint32_t reg_complete)
|
|||||||
{
|
{
|
||||||
.coreid = coreid,
|
.coreid = coreid,
|
||||||
.index = ep_idx,
|
.index = ep_idx,
|
||||||
.class_code = p_qhd->class_code
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// retire all QTDs in array list, up to 1st still-active QTD
|
// retire all QTDs in array list, up to 1st still-active QTD
|
||||||
@ -587,7 +583,6 @@ void dcd_isr(uint8_t coreid)
|
|||||||
{
|
{
|
||||||
.coreid = coreid,
|
.coreid = coreid,
|
||||||
.index = 0,
|
.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;
|
tusb_event_t event = ( p_qtd->xact_err || p_qtd->halted || p_qtd->buffer_err ) ? TUSB_EVENT_XFER_ERROR : TUSB_EVENT_XFER_COMPLETE;
|
||||||
|
|
||||||
|
@ -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])
|
if ( TUSB_DESC_TYPE_ENDPOINT == p_desc[DESCRIPTOR_OFFSET_TYPE])
|
||||||
{ // notification endpoint if any
|
{ // 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_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
|
||||||
p_desc = descriptor_next(p_desc);
|
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 ) ?
|
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_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 );
|
ASSERT ( endpointhandle_is_valid(*p_edpt_hdl), TUSB_ERROR_DCD_OPEN_PIPE_FAILED );
|
||||||
|
|
||||||
(*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
|
(*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
|
||||||
|
@ -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);
|
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);
|
ASSERT( endpointhandle_is_valid(p_hid->ept_handle), TUSB_ERROR_DCD_FAILED);
|
||||||
|
|
||||||
p_hid->interface_number = p_interface_desc->bInterfaceNumber;
|
p_hid->interface_number = p_interface_desc->bInterfaceNumber;
|
||||||
|
@ -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 ) ?
|
endpoint_handle_t * p_edpt_hdl = ( p_endpoint->bEndpointAddress & TUSB_DIR_DEV_TO_HOST_MASK ) ?
|
||||||
&p_msc->edpt_in : &p_msc->edpt_out;
|
&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);
|
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 );
|
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_block_wrapper_t * const p_cbw = &p_msc->cbw;
|
||||||
msc_cmd_status_wrapper_t * const p_csw = &p_msc->csw;
|
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 -------------//
|
//------------- new CBW received -------------//
|
||||||
if ( !is_waiting_read10_write10 )
|
if ( !is_waiting_read10_write10 )
|
||||||
{
|
{
|
||||||
|
@ -60,21 +60,18 @@ typedef enum
|
|||||||
// TODO move Hal
|
// TODO move Hal
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t coreid;
|
uint8_t coreid;
|
||||||
uint8_t reserved; // TODO redundant, cannot be control as control uses separated API
|
uint8_t index; // must be zero to indicate control
|
||||||
uint8_t index;
|
|
||||||
uint8_t class_code;
|
|
||||||
} endpoint_handle_t;
|
} 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)
|
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)
|
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);
|
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);
|
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_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_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);
|
tusb_error_t dcd_pipe_stall(endpoint_handle_t edpt_hdl);
|
||||||
|
@ -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
|
// 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;
|
(void) coreid;
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ tusb_error_t dcd_pipe_clear_stall(uint8_t coreid, uint8_t edpt_addr)
|
|||||||
return TUSB_ERROR_NONE;
|
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;
|
(void) coreid;
|
||||||
endpoint_handle_t const null_handle = { 0 };
|
endpoint_handle_t const null_handle = { 0 };
|
||||||
|
@ -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 );
|
OSAL_SUBTASK_INVOKED_AND_WAIT( usbd_control_request_subtask(event.coreid, &event.setup_received), error );
|
||||||
}else if (USBD_EVENTID_XFER_DONE == event.event_id)
|
}else if (USBD_EVENTID_XFER_DONE == event.event_id)
|
||||||
{
|
{
|
||||||
uint8_t class_index;
|
// Call class handling function, Class that endpoint not belong to should check and return
|
||||||
class_index = std_class_code_to_index( event.xfer_done.edpt_hdl.class_code );
|
for (uint8_t class_code = TUSB_CLASS_AUDIO; class_code < USBD_CLASS_DRIVER_COUNT; class_code++)
|
||||||
|
{
|
||||||
SUBTASK_ASSERT(usbd_class_drivers[class_index].xfer_cb != NULL);
|
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);
|
||||||
usbd_class_drivers[class_index].xfer_cb( event.xfer_done.edpt_hdl, (tusb_event_t) event.sub_event_id, event.xfer_done.xferred_byte);
|
}
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
SUBTASK_ASSERT(false);
|
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)
|
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 );
|
osal_semaphore_post( usbd_control_xfer_sem_hdl );
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user