diff options
Diffstat (limited to 'src/host/hub.c')
| -rw-r--r-- | src/host/hub.c | 98 |
1 files changed, 32 insertions, 66 deletions
diff --git a/src/host/hub.c b/src/host/hub.c index 485e47147..a418774f6 100644 --- a/src/host/hub.c +++ b/src/host/hub.c @@ -67,76 +67,53 @@ ATTR_ALIGNED(4) CFG_TUSB_MEM_SECTION STATIC_VAR uint8_t hub_enum_buffer[sizeof(d //--------------------------------------------------------------------+
// HUB
//--------------------------------------------------------------------+
-tusb_error_t hub_port_clear_feature_subtask(uint8_t hub_addr, uint8_t hub_port, uint8_t feature)
+bool hub_port_clear_feature_subtask(uint8_t hub_addr, uint8_t hub_port, uint8_t feature)
{
- tusb_error_t error;
-
- OSAL_SUBTASK_BEGIN
-
- STASK_ASSERT(HUB_FEATURE_PORT_CONNECTION_CHANGE <= feature &&
- feature <= HUB_FEATURE_PORT_RESET_CHANGE);
+ TU_ASSERT(HUB_FEATURE_PORT_CONNECTION_CHANGE <= feature && feature <= HUB_FEATURE_PORT_RESET_CHANGE);
//------------- Clear Port Feature request -------------//
- STASK_INVOKE(
- usbh_control_xfer_subtask( hub_addr, bm_request_type(TUSB_DIR_OUT, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
- HUB_REQUEST_CLEAR_FEATURE, feature, hub_port,
- 0, NULL ),
- error
- );
- STASK_ASSERT_ERR( error );
+ TU_ASSERT( usbh_control_xfer_subtask( hub_addr, bm_request_type(TUSB_DIR_OUT, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
+ HUB_REQUEST_CLEAR_FEATURE, feature, hub_port,
+ 0, NULL ) );
//------------- Get Port Status to check if feature is cleared -------------//
- STASK_INVOKE(
- usbh_control_xfer_subtask( hub_addr, bm_request_type(TUSB_DIR_IN, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
- HUB_REQUEST_GET_STATUS, 0, hub_port,
- 4, hub_enum_buffer ),
- error
- );
- STASK_ASSERT_ERR( error );
+ TU_ASSERT( usbh_control_xfer_subtask( hub_addr, bm_request_type(TUSB_DIR_IN, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
+ HUB_REQUEST_GET_STATUS, 0, hub_port,
+ 4, hub_enum_buffer ) );
//------------- Check if feature is cleared -------------//
hub_port_status_response_t * p_port_status;
p_port_status = (hub_port_status_response_t *) hub_enum_buffer;
- STASK_ASSERT( !BIT_TEST_(p_port_status->status_change.value, feature-16) );
+ TU_ASSERT( !BIT_TEST_(p_port_status->status_change.value, feature-16) );
- OSAL_SUBTASK_END
+ return true;
}
-tusb_error_t hub_port_reset_subtask(uint8_t hub_addr, uint8_t hub_port)
+bool hub_port_reset_subtask(uint8_t hub_addr, uint8_t hub_port)
{
enum { RESET_DELAY = 200 }; // USB specs say only 50ms but many devices require much longer
tusb_error_t error;
- OSAL_SUBTASK_BEGIN
-
//------------- Set Port Reset -------------//
- STASK_INVOKE(
- usbh_control_xfer_subtask( hub_addr, bm_request_type(TUSB_DIR_OUT, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
+ TU_ASSERT( usbh_control_xfer_subtask( hub_addr, bm_request_type(TUSB_DIR_OUT, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
HUB_REQUEST_SET_FEATURE, HUB_FEATURE_PORT_RESET, hub_port,
- 0, NULL ),
- error
- );
- STASK_ASSERT_ERR( error );
+ 0, NULL ) );
osal_task_delay(RESET_DELAY); // TODO Hub wait for Status Endpoint on Reset Change
//------------- Get Port Status to check if port is enabled, powered and reset_change -------------//
- STASK_INVOKE(
- usbh_control_xfer_subtask( hub_addr, bm_request_type(TUSB_DIR_IN, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
- HUB_REQUEST_GET_STATUS, 0, hub_port,
- 4, hub_enum_buffer ),
- error
- );
- STASK_ASSERT_ERR( error );
+ TU_ASSERT( usbh_control_xfer_subtask( hub_addr, bm_request_type(TUSB_DIR_IN, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
+ HUB_REQUEST_GET_STATUS, 0, hub_port,
+ 4, hub_enum_buffer ) );
hub_port_status_response_t * p_port_status;
p_port_status = (hub_port_status_response_t *) hub_enum_buffer;
- STASK_ASSERT ( p_port_status->status_change.reset && p_port_status->status_current.connect_status &&
- p_port_status->status_current.port_power && p_port_status->status_current.port_enable);
+ TU_ASSERT ( p_port_status->status_change.reset && p_port_status->status_current.connect_status &&
+ p_port_status->status_current.port_power && p_port_status->status_current.port_enable);
- OSAL_SUBTASK_END
+ return true;
}
// can only get the speed RIGHT AFTER hub_port_reset_subtask call
@@ -156,36 +133,28 @@ void hub_init(void) // hub_enum_sem_hdl = osal_semaphore_create( OSAL_SEM_REF(hub_enum_semaphore) );
}
-tusb_error_t hub_open_subtask(uint8_t dev_addr, tusb_desc_interface_t const *p_interface_desc, uint16_t *p_length)
+bool hub_open_subtask(uint8_t dev_addr, tusb_desc_interface_t const *p_interface_desc, uint16_t *p_length)
{
- tusb_error_t error;
-
- OSAL_SUBTASK_BEGIN
-
// not support multiple TT yet
- if ( p_interface_desc->bInterfaceProtocol > 1 ) return TUSB_ERROR_HUB_FEATURE_NOT_SUPPORTED;
+ if ( p_interface_desc->bInterfaceProtocol > 1 ) return false;
//------------- Open Interrupt Status Pipe -------------//
tusb_desc_endpoint_t const *p_endpoint;
p_endpoint = (tusb_desc_endpoint_t const *) descriptor_next( (uint8_t const*) p_interface_desc );
- STASK_ASSERT(TUSB_DESC_ENDPOINT == p_endpoint->bDescriptorType);
- STASK_ASSERT(TUSB_XFER_INTERRUPT == p_endpoint->bmAttributes.xfer);
+ TU_ASSERT(TUSB_DESC_ENDPOINT == p_endpoint->bDescriptorType);
+ TU_ASSERT(TUSB_XFER_INTERRUPT == p_endpoint->bmAttributes.xfer);
hub_data[dev_addr-1].pipe_status = hcd_pipe_open(dev_addr, p_endpoint, TUSB_CLASS_HUB);
- STASK_ASSERT( pipehandle_is_valid(hub_data[dev_addr-1].pipe_status) );
+ TU_ASSERT( pipehandle_is_valid(hub_data[dev_addr-1].pipe_status) );
hub_data[dev_addr-1].interface_number = p_interface_desc->bInterfaceNumber;
(*p_length) = sizeof(tusb_desc_interface_t) + sizeof(tusb_desc_endpoint_t);
//------------- Get Hub Descriptor -------------//
- STASK_INVOKE(
- usbh_control_xfer_subtask( dev_addr, bm_request_type(TUSB_DIR_IN, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_DEVICE),
- HUB_REQUEST_GET_DESCRIPTOR, 0, 0,
- sizeof(descriptor_hub_desc_t), hub_enum_buffer ),
- error
- );
- STASK_ASSERT_ERR(error);
+ TU_ASSERT( usbh_control_xfer_subtask( dev_addr, bm_request_type(TUSB_DIR_IN, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_DEVICE),
+ HUB_REQUEST_GET_DESCRIPTOR, 0, 0,
+ sizeof(descriptor_hub_desc_t), hub_enum_buffer ) );
// only care about this field in hub descriptor
hub_data[dev_addr-1].port_number = ((descriptor_hub_desc_t*) hub_enum_buffer)->bNbrPorts;
@@ -194,18 +163,15 @@ tusb_error_t hub_open_subtask(uint8_t dev_addr, tusb_desc_interface_t const *p_i static uint8_t i;
for(i=1; i <= hub_data[dev_addr-1].port_number; i++)
{
- STASK_INVOKE(
- usbh_control_xfer_subtask( dev_addr, bm_request_type(TUSB_DIR_OUT, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
- HUB_REQUEST_SET_FEATURE, HUB_FEATURE_PORT_POWER, i,
- 0, NULL ),
- error
- );
+ TU_ASSERT( usbh_control_xfer_subtask( dev_addr, bm_request_type(TUSB_DIR_OUT, TUSB_REQ_TYPE_CLASS, TUSB_REQ_RCPT_OTHER),
+ HUB_REQUEST_SET_FEATURE, HUB_FEATURE_PORT_POWER, i,
+ 0, NULL ) );
}
//------------- Queue the initial Status endpoint transfer -------------//
- STASK_ASSERT_ERR ( hcd_pipe_xfer(hub_data[dev_addr-1].pipe_status, &hub_data[dev_addr-1].status_change, 1, true) );
+ TU_ASSERT( TUSB_ERROR_NONE == hcd_pipe_xfer(hub_data[dev_addr-1].pipe_status, &hub_data[dev_addr-1].status_change, 1, true) );
- OSAL_SUBTASK_END
+ return true;
}
// is the response of interrupt endpoint polling
|
