diff --git a/demos/host/src/tusb_config.h b/demos/host/src/tusb_config.h index d5ba0b6d1..c43bb2898 100644 --- a/demos/host/src/tusb_config.h +++ b/demos/host/src/tusb_config.h @@ -60,14 +60,14 @@ //--------------------------------------------------------------------+ // HOST CONFIGURATION //--------------------------------------------------------------------+ -#define TUSB_CFG_HOST_DEVICE_MAX 1 +#define TUSB_CFG_HOST_DEVICE_MAX 3 // TODO be a part of HUB config #define TUSB_CFG_CONFIGURATION_MAX 1 //------------- USBD -------------// #define TUSB_CFG_HOST_ENUM_BUFFER_SIZE 255 //------------- CLASS -------------// -#define TUSB_CFG_HOST_HUB 0 +#define TUSB_CFG_HOST_HUB 1 #define TUSB_CFG_HOST_HID_KEYBOARD 0 #define TUSB_CFG_HOST_HID_MOUSE 1 #define TUSB_CFG_HOST_HID_GENERIC 0 diff --git a/tinyusb/host/ehci/ehci.c b/tinyusb/host/ehci/ehci.c index 9ba0871bf..b918c7131 100644 --- a/tinyusb/host/ehci/ehci.c +++ b/tinyusb/host/ehci/ehci.c @@ -154,11 +154,11 @@ void hcd_port_reset(uint8_t hostid) regs->portsc_bit.port_enable = 0; // disable port before reset regs->portsc_bit.port_reset = 1; -#ifndef _TEST_ - // NXP specific, port reset will automatically be 0 when reset sequence complete - // there is chance device is unplugged while reset sequence is not complete - while( regs->portsc_bit.port_reset) {} // TODO use task delay to remove blocking -#endif +//#ifndef _TEST_ +// // NXP specific, port reset will automatically be 0 when reset sequence complete +// // there is chance device is unplugged while reset sequence is not complete +// while( regs->portsc_bit.port_reset) {} // TODO use task delay to remove blocking +//#endif } bool hcd_port_connect_status(uint8_t hostid) @@ -570,6 +570,7 @@ static void port_connect_status_change_isr(uint8_t hostid) // NOTE There is an sequence plug->unplug->…..-> plug if device is powering with pre-plugged device if (regs->portsc_bit.current_connect_status) { +// hcd_port_reset(hostid); usbh_hcd_rhport_plugged_isr(hostid); }else // device unplugged { diff --git a/tinyusb/host/ohci/ohci.c b/tinyusb/host/ohci/ohci.c index 68954f83e..75688cfca 100644 --- a/tinyusb/host/ohci/ohci.c +++ b/tinyusb/host/ohci/ohci.c @@ -666,7 +666,7 @@ void hcd_isr(uint8_t hostid) { if ( OHCI_REG->rhport_status_bit[0].current_connect_status ) { - OHCI_REG->rhport_status[0] = OHCI_RHPORT_PORT_RESET_STATUS_MASK; +// OHCI_REG->rhport_status[0] = OHCI_RHPORT_PORT_RESET_STATUS_MASK; // reset port immediately usbh_hcd_rhport_plugged_isr(0); }else { 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),