summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-10-31 21:39:56 +0800
committersakumisu <[email protected]>2024-10-31 21:45:19 +0800
commita13bee0663731661eb8a2ba5daeb3fc8f3142d12 (patch)
treecb3b970565d953d93ef5042e18204d07283a3c9f
parentfd1baa62df717b5071ae699a028917123989809c (diff)
feat(core/usbh_core): add usbh_find_hubport api
-rw-r--r--core/usbh_core.c49
-rw-r--r--core/usbh_core.h1
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);