diff options
| author | hathach <[email protected]> | 2013-09-30 16:13:08 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2013-09-30 16:13:08 +0700 |
| commit | 5fb22e3f34db0d9e91df8ca306cc97518bb99792 (patch) | |
| tree | b680b1bf2656504714e4fc204503999990767d80 /tinyusb/host/hub.c | |
| parent | 821f85cb200c870b874c6681801d20410930dbc5 (diff) | |
refractor hub
Diffstat (limited to 'tinyusb/host/hub.c')
| -rw-r--r-- | tinyusb/host/hub.c | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/tinyusb/host/hub.c b/tinyusb/host/hub.c index ec033b868..672ac4c10 100644 --- a/tinyusb/host/hub.c +++ b/tinyusb/host/hub.c @@ -64,15 +64,25 @@ uint8_t hub_enum_buffer[sizeof(descriptor_hub_desc_t)] TUSB_CFG_ATTR_USBRAM; //--------------------------------------------------------------------+ // HUB //--------------------------------------------------------------------+ -tusb_error_t hub_enumerate_subtask(void) +tusb_error_t hub_port_clear_feature_subtask(uint8_t feature) { tusb_error_t error; OSAL_SUBTASK_BEGIN - hub_port_status_response_t * p_port_status; + SUBTASK_ASSERT(HUB_FEATURE_PORT_CONNECTION_CHANGE <= feature && + feature <= HUB_FEATURE_PORT_RESET_CHANGE); - //------------- Get Port Status -------------// + //------------- Clear Port Feature request -------------// + 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, feature, usbh_devices[0].hub_port, + 0, NULL ), + error + ); + SUBTASK_ASSERT_STATUS( error ); + + //------------- Get Port Status to check if feature 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, @@ -81,26 +91,22 @@ tusb_error_t hub_enumerate_subtask(void) ); SUBTASK_ASSERT_STATUS( error ); - p_port_status = (hub_port_status_response_t *) hub_enum_buffer; - if ( !p_port_status->status_change.connect_status ) SUBTASK_EXIT(TUSB_ERROR_NONE); // only handle connection change + //------------- Check if feature is cleared -------------// + hub_port_status_response_t * p_port_status = (hub_port_status_response_t *) hub_enum_buffer; + SUBTASK_ASSERT( !BIT_TEST_(p_port_status->status_change.value, feature-16) ); - if ( !p_port_status->status_current.connect_status ) - { // TODO HUB Disconnection + OSAL_SUBTASK_END +} - SUBTASK_EXIT(TUSB_ERROR_NONE); - } +tusb_error_t hub_enumerate_subtask(void) +{ + tusb_error_t error; - // 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 ); + OSAL_SUBTASK_BEGIN + + hub_port_status_response_t * p_port_status; - //------------- Get Port Status again to make sure Connect Change is cleared -------------// + //------------- 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, @@ -110,7 +116,17 @@ tusb_error_t hub_enumerate_subtask(void) SUBTASK_ASSERT_STATUS( error ); p_port_status = (hub_port_status_response_t *) hub_enum_buffer; - SUBTASK_ASSERT( !p_port_status->status_change.connect_status); // this has to be cleared + 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); + } + + // Acknowledge Port Connection Change + OSAL_SUBTASK_INVOKED_AND_WAIT( hub_port_clear_feature_subtask(HUB_FEATURE_PORT_CONNECTION_CHANGE), error ); + SUBTASK_ASSERT_STATUS( error ); //--------------------------------------------------------------------+ // PORT RESET & WAIT FOR STATUS ENDPOINT & GET STATUS & CLEAR RESET CHANGE |
