refractor hub

This commit is contained in:
hathach
2013-09-30 15:34:22 +07:00
parent 3cc169f2fd
commit 821f85cb20
3 changed files with 101 additions and 89 deletions

View File

@@ -354,84 +354,7 @@ tusb_error_t enumeration_body_subtask(void)
if ( usbh_devices[0].hub_addr != 0) // connected/disconnected via hub
{
hub_port_status_response_t * p_port_status;
//------------- Get Port Status -------------//
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_DEV_TO_HOST, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER),
HUB_REQUEST_GET_STATUS, 0, usbh_devices[0].hub_port,
4, enum_data_buffer ),
error
);
SUBTASK_ASSERT_STATUS( error );
p_port_status = (hub_port_status_response_t *) enum_data_buffer;
if ( !p_port_status->status_change.connect_status ) SUBTASK_EXIT(TUSB_ERROR_NONE); // only handle connection change
if ( !p_port_status->status_current.connect_status )
{ // TODO HUB Disconnection
SUBTASK_EXIT(TUSB_ERROR_NONE);
}
// Hub connection
//------------- Clear Hub Port Connect Status Change -------------//
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_HOST_TO_DEV, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER),
HUB_REQUEST_CLEAR_FEATURE, HUB_FEATURE_PORT_CONNECTION_CHANGE, usbh_devices[0].hub_port,
0, NULL ),
error
);
SUBTASK_ASSERT_STATUS( error );
//------------- Get Port Status again to make sure Connect Change is cleared -------------//
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_DEV_TO_HOST, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER),
HUB_REQUEST_GET_STATUS, 0, usbh_devices[0].hub_port,
4, enum_data_buffer ),
error
);
SUBTASK_ASSERT_STATUS( error );
p_port_status = (hub_port_status_response_t *) enum_data_buffer;
SUBTASK_ASSERT( !p_port_status->status_change.connect_status); // this has to be cleared
//--------------------------------------------------------------------+
// PORT RESET & WAIT FOR STATUS ENDPOINT & GET STATUS & CLEAR RESET CHANGE
//--------------------------------------------------------------------+
//------------- Set Port Reset -------------//
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_HOST_TO_DEV, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER),
HUB_REQUEST_SET_FEATURE, HUB_FEATURE_PORT_RESET, usbh_devices[0].hub_port,
0, NULL ),
error
);
SUBTASK_ASSERT_STATUS( error );
osal_task_delay(200); // TODO Hub wait for Status Endpoint on Reset Change
//------------- Get Port Status to check if port is enabled, powered and reset_change -------------//
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_DEV_TO_HOST, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER),
HUB_REQUEST_GET_STATUS, 0, usbh_devices[0].hub_port,
4, enum_data_buffer ),
error
);
SUBTASK_ASSERT_STATUS( error );
p_port_status = (hub_port_status_response_t *) enum_data_buffer;
SUBTASK_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);
usbh_devices[0].speed = (p_port_status->status_current.high_speed_device_attached) ? TUSB_SPEED_HIGH :
(p_port_status->status_current.low_speed_device_attached ) ? TUSB_SPEED_LOW : TUSB_SPEED_FULL;
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_HOST_TO_DEV, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER),
HUB_REQUEST_CLEAR_FEATURE, HUB_FEATURE_PORT_RESET_CHANGE, usbh_devices[0].hub_port,
0, NULL ),
error
);
OSAL_SUBTASK_INVOKED_AND_WAIT( hub_enumerate_subtask(), error );
SUBTASK_ASSERT_STATUS( error );
}
else