diff options
| author | sakumisu <[email protected]> | 2024-10-31 21:39:56 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2024-10-31 21:45:19 +0800 |
| commit | a13bee0663731661eb8a2ba5daeb3fc8f3142d12 (patch) | |
| tree | cb3b970565d953d93ef5042e18204d07283a3c9f | |
| parent | fd1baa62df717b5071ae699a028917123989809c (diff) | |
feat(core/usbh_core): add usbh_find_hubport api
| -rw-r--r-- | core/usbh_core.c | 49 | ||||
| -rw-r--r-- | core/usbh_core.h | 1 |
2 files changed, 50 insertions, 0 deletions
diff --git a/core/usbh_core.c b/core/usbh_core.c index c5f7729d..12b578f7 100644 --- a/core/usbh_core.c +++ b/core/usbh_core.c @@ -831,6 +831,37 @@ static void usbh_list_all_interface_desc(struct usbh_bus *bus, struct usbh_hub * } } +static struct usbh_hubport *usbh_list_all_hubport(struct usbh_hub *hub, uint8_t hub_index, uint8_t hub_port) +{ + struct usbh_hubport *hport; + struct usbh_hub *hub_next; + + if (hub->index == hub_index) { + hport = &hub->child[hub_port - 1]; + return hport; + } else { + for (uint8_t port = 0; port < hub->nports; port++) { + hport = &hub->child[port]; + if (hport->connected) { + for (uint8_t itf = 0; itf < hport->config.config_desc.bNumInterfaces; itf++) { + if (hport->config.intf[itf].class_driver && hport->config.intf[itf].class_driver->driver_name) { + if (strcmp(hport->config.intf[itf].class_driver->driver_name, "hub") == 0) { + hub_next = hport->config.intf[itf].priv; + + if (hub_next && hub_next->connected) { + hport = usbh_list_all_hubport(hub_next, hub_index, hub_port); + if (hport) { + return hport; + } + } + } + } + } + } + } + } + return NULL; +} void *usbh_find_class_instance(const char *devname) { usb_slist_t *bus_list; @@ -855,6 +886,24 @@ void *usbh_find_class_instance(const char *devname) return NULL; } +struct usbh_hubport *usbh_find_hubport(uint8_t busid, uint8_t hub_index, uint8_t hub_port) +{ + struct usbh_hub *hub; + struct usbh_hub *hub_next; + struct usbh_bus *bus; + struct usbh_hubport *hport; + size_t flags; + + flags = usb_osal_enter_critical_section(); + + bus = &g_usbhost_bus[busid]; + hub = &bus->hcd.roothub; + + hport = usbh_list_all_hubport(hub, hub_index, hub_port); + usb_osal_leave_critical_section(flags); + return hport; +} + int lsusb(int argc, char **argv) { usb_slist_t *bus_list; diff --git a/core/usbh_core.h b/core/usbh_core.h index ede1e574..eaddb304 100644 --- a/core/usbh_core.h +++ b/core/usbh_core.h @@ -275,6 +275,7 @@ int usbh_set_interface(struct usbh_hubport *hport, uint8_t intf, uint8_t altsett int usbh_initialize(uint8_t busid, uintptr_t reg_base); int usbh_deinitialize(uint8_t busid); void *usbh_find_class_instance(const char *devname); +struct usbh_hubport *usbh_find_hubport(uint8_t busid, uint8_t hub_index, uint8_t hub_port); int lsusb(int argc, char **argv); |
