Skip to content

Commit b5b7a4b

Browse files
committed
hub check status before get 1st device descriptor
1 parent 093720f commit b5b7a4b

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

.idea/cmake.xml

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/host/usbh.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,7 @@ enum {
13701370
ENUM_HUB_RERSET,
13711371
ENUM_HUB_GET_STATUS_AFTER_RESET,
13721372
ENUM_HUB_CLEAR_RESET,
1373+
ENUM_HUB_CLEAR_RESET_COMPLETE,
13731374

13741375
ENUM_ADDR0_DEVICE_DESC,
13751376
ENUM_SET_ADDR,
@@ -1511,19 +1512,33 @@ static void process_enumeration(tuh_xfer_t* xfer) {
15111512
case ENUM_HUB_CLEAR_RESET: {
15121513
hub_port_status_response_t port_status;
15131514
hub_port_get_status_local(dev0_bus->hub_addr, dev0_bus->hub_port, &port_status);
1514-
dev0_bus->speed = (port_status.status.high_speed) ? TUSB_SPEED_HIGH :
1515-
(port_status.status.low_speed) ? TUSB_SPEED_LOW : TUSB_SPEED_FULL;
15161515

15171516
if (port_status.change.reset) {
15181517
// Acknowledge Port Reset Change
1519-
TU_ASSERT(hub_port_clear_reset_change(dev0_bus->hub_addr, dev0_bus->hub_port, process_enumeration, ENUM_ADDR0_DEVICE_DESC),);
1518+
TU_ASSERT(hub_port_clear_reset_change(dev0_bus->hub_addr, dev0_bus->hub_port, process_enumeration, ENUM_HUB_CLEAR_RESET_COMPLETE),);
15201519
} else {
15211520
// maybe retry if reset change not set but we need timeout to prevent infinite loop
1522-
// TU_ASSERT(hub_port_get_status(dev0_bus->hub_addr, dev0_bus->hub_port, NULL, process_enumeration, ENUM_HUB_CLEAR_RESET),);
1521+
// TU_ASSERT(hub_port_get_status(dev0_bus->hub_addr, dev0_bus->hub_port, NULL, process_enumeration, ENUM_HUB_CLEAR_RESET_COMPLETE),);
15231522
}
15241523

15251524
break;
15261525
}
1526+
1527+
case ENUM_HUB_CLEAR_RESET_COMPLETE: {
1528+
hub_port_status_response_t port_status;
1529+
hub_port_get_status_local(dev0_bus->hub_addr, dev0_bus->hub_port, &port_status);
1530+
1531+
if (!port_status.status.connection) {
1532+
TU_LOG_USBH("Device unplugged from hub (not addressed yet)\r\n");
1533+
enum_full_complete();
1534+
return;
1535+
}
1536+
1537+
dev0_bus->speed = (port_status.status.high_speed) ? TUSB_SPEED_HIGH :
1538+
(port_status.status.low_speed) ? TUSB_SPEED_LOW : TUSB_SPEED_FULL;
1539+
1540+
TU_ATTR_FALLTHROUGH;
1541+
}
15271542
#endif
15281543

15291544
case ENUM_ADDR0_DEVICE_DESC: {

0 commit comments

Comments
 (0)