|
|
@@ -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;
|