diff options
| -rw-r--r-- | demos/host/src/tusb_config.h | 4 | ||||
| -rw-r--r-- | tinyusb/host/ehci/ehci.c | 11 | ||||
| -rw-r--r-- | tinyusb/host/ohci/ohci.c | 2 | ||||
| -rw-r--r-- | tinyusb/host/usbh.c | 18 |
4 files changed, 21 insertions, 14 deletions
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), |
