summaryrefslogtreecommitdiff
path: root/tinyusb/host/usbh.c
diff options
context:
space:
mode:
Diffstat (limited to 'tinyusb/host/usbh.c')
-rw-r--r--tinyusb/host/usbh.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/tinyusb/host/usbh.c b/tinyusb/host/usbh.c
index 7b358e2f2..de9e15164 100644
--- a/tinyusb/host/usbh.c
+++ b/tinyusb/host/usbh.c
@@ -370,14 +370,19 @@ tusb_error_t enumeration_body_subtask(void)
usbh_devices[0].hub_port = enum_entry.hub_port;
usbh_devices[0].state = TUSB_DEVICE_STATE_UNPLUG;
+ //------------- connected/disconnected directly with roothub -------------//
if ( usbh_devices[0].hub_addr == 0)
- { // connected/disconnected directly with roothub
+ {
if( hcd_port_connect_status(usbh_devices[0].core_id) )
{ // connection event
- osal_task_delay(200); // wait for port reset is complete & device is stable
-// hcd_port_reset( usbh_devices[0].core_id ); // port must be reset to have correct speed operation
-// osal_task_delay(50); // TODO reset is recommended to last 50 ms (NXP EHCI passes this)
- usbh_devices[0].speed = hcd_port_speed_get( usbh_devices[0].core_id );
+ osal_task_delay(200); // wait until device is stable
+
+ if ( !hcd_port_connect_status(usbh_devices[0].core_id) ) SUBTASK_EXIT(TUSB_ERROR_NONE); // exit if device unplugged while delaying
+
+ hcd_port_reset( usbh_devices[0].core_id ); // port must be reset to have correct speed operation
+ osal_task_delay(50); // USB Specs: reset is recommended to last 50 ms
+
+ usbh_devices[0].speed = hcd_port_speed_get( usbh_devices[0].core_id );
}
else
{ // disconnection event
@@ -386,8 +391,9 @@ tusb_error_t enumeration_body_subtask(void)
}
}
#if TUSB_CFG_HOST_HUB
+ //------------- connected/disconnected via hub -------------//
else
- { // connected/disconnected via hub
+ {
//------------- 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),