From d7a37de795fecf91922a243719760adf74d50f98 Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Sun, 25 Sep 2022 17:58:30 +0800 Subject: [PATCH] config ep0 default mps in usbh_enumerate --- class/hub/usbh_hub.c | 2 -- core/usbh_core.c | 82 ++++++++++---------------------------------- 2 files changed, 18 insertions(+), 66 deletions(-) diff --git a/class/hub/usbh_hub.c b/class/hub/usbh_hub.c index c41c4ba0..e262f872 100644 --- a/class/hub/usbh_hub.c +++ b/class/hub/usbh_hub.c @@ -510,8 +510,6 @@ static void usbh_hub_events(struct usbh_hub *hub) USB_LOG_INFO("New %s device on Hub %u, Port %u connected\r\n", speed_table[speed], hub->index, port + 1); - /* Allocate ep info for control endpoint */ - usbh_hport_activate_ep0(child); if (usbh_enumerate(child) < 0) { USB_LOG_ERR("Port %u enumerate fail\r\n", port + 1); } diff --git a/core/usbh_core.c b/core/usbh_core.c index e4202f21..44ea7800 100644 --- a/core/usbh_core.c +++ b/core/usbh_core.c @@ -336,35 +336,29 @@ static void usbh_print_hubport_info(struct usbh_hubport *hport) } } -#ifdef CONFIG_USBHOST_XHCI - static int usbh_get_default_mps(int speed) { switch (speed) { - case USB_SPEED_LOW: + case USB_SPEED_LOW: /* For low speed, we use 8 bytes */ return 8; - case USB_SPEED_FULL: + case USB_SPEED_FULL: /* For full or high speed, we use 64 bytes */ case USB_SPEED_HIGH: return 64; - case USB_SPEED_SUPER: - default: + case USB_SPEED_SUPER: /* For super speed , we must use 512 bytes */ + case USB_SPEED_SUPER_PLUS: return 512; + default: + return 64; } } -#endif - int usbh_hport_activate_ep0(struct usbh_hubport *hport) { struct usbh_endpoint_cfg ep0_cfg = { 0 }; ep0_cfg.ep_addr = 0x00; ep0_cfg.ep_interval = 0x00; -#ifdef CONFIG_USBHOST_XHCI ep0_cfg.ep_mps = usbh_get_default_mps(hport->speed); -#else - ep0_cfg.ep_mps = 0x08; -#endif ep0_cfg.ep_type = USB_ENDPOINT_TYPE_CONTROL; ep0_cfg.hport = hport; @@ -374,9 +368,11 @@ int usbh_hport_activate_ep0(struct usbh_hubport *hport) int usbh_hport_deactivate_ep0(struct usbh_hubport *hport) { +#ifndef CONFIG_USBHOST_XHCI if (hport->dev_addr > 0) { usbh_free_devaddr(&g_usbh_bus.devgen, hport->dev_addr); } +#endif if (hport->ep0) { usbh_pipe_free(hport->ep0); } @@ -411,7 +407,6 @@ int usbh_enumerate(struct usbh_hubport *hport) { struct usb_interface_descriptor *intf_desc; struct usb_setup_packet *setup; - uint8_t descsize; int dev_addr; uint16_t ep_mps; int ret; @@ -419,30 +414,15 @@ int usbh_enumerate(struct usbh_hubport *hport) #define USB_REQUEST_BUFFER_SIZE 256 setup = &hport->setup; - if ((hport->speed == USB_SPEED_SUPER) || (hport->speed == USB_SPEED_SUPER_PLUS)) { - /* For super speed , we must use 512 bytes */ - ep_mps = 512; - descsize = 8; - } else if (hport->speed == USB_SPEED_LOW) { - /* For low speed, we use 8 bytes */ - ep_mps = 8; - descsize = 8; - } else { - /* For full or high speed, we use 64 bytes */ - ep_mps = 64; - descsize = 8; - } - -#ifdef CONFIG_USBHOST_XHCI - - extern int usbh_get_xhci_devaddr(usbh_pipe_t * pipe); + /* Configure EP0 with the default maximum packet size */ + usbh_hport_activate_ep0(hport); /* Read the first 8 bytes of the device descriptor */ setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; setup->wValue = (uint16_t)((USB_DESCRIPTOR_TYPE_DEVICE << 8) | 0); setup->wIndex = 0; - setup->wLength = descsize; + setup->wLength = 8; ret = usbh_control_transfer(hport->ep0, setup, ep0_request_buffer); if (ret < 0) { @@ -450,55 +430,31 @@ int usbh_enumerate(struct usbh_hubport *hport) goto errout; } - parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer, descsize); + parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer, 8); /* Extract the correct max packetsize from the device descriptor */ ep_mps = ((struct usb_device_descriptor *)ep0_request_buffer)->bMaxPacketSize0; - /* And reconfigure EP0 with the correct maximum packet size */ + /* Reconfigure EP0 with the correct maximum packet size */ usbh_ep0_pipe_reconfigure(hport->ep0, 0, ep_mps, hport->speed); +#ifdef CONFIG_USBHOST_XHCI + extern int usbh_get_xhci_devaddr(usbh_pipe_t * pipe); + + /* Assign a function address to the device connected to this port */ dev_addr = usbh_get_xhci_devaddr(hport->ep0); if (dev_addr < 0) { USB_LOG_ERR("Failed to allocate devaddr,errorcode:%d\r\n", ret); goto errout; } - - /* Assign the function address to the port */ - hport->dev_addr = dev_addr; - #else - - /* Configure EP0 with the initial maximum packet size */ - usbh_ep0_pipe_reconfigure(hport->ep0, 0, ep_mps, hport->speed); - - /* Read the first 8 bytes of the device descriptor */ - setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = USB_REQUEST_GET_DESCRIPTOR; - setup->wValue = (uint16_t)((USB_DESCRIPTOR_TYPE_DEVICE << 8) | 0); - setup->wIndex = 0; - setup->wLength = descsize; - - ret = usbh_control_transfer(hport->ep0, setup, ep0_request_buffer); - if (ret < 0) { - USB_LOG_ERR("Failed to get device descriptor,errorcode:%d\r\n", ret); - goto errout; - } - - parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer, descsize); - - /* Extract the correct max packetsize from the device descriptor */ - ep_mps = ((struct usb_device_descriptor *)ep0_request_buffer)->bMaxPacketSize0; - - /* And reconfigure EP0 with the correct maximum packet size */ - usbh_ep0_pipe_reconfigure(hport->ep0, 0, ep_mps, hport->speed); - /* Assign a function address to the device connected to this port */ dev_addr = usbh_allocate_devaddr(&g_usbh_bus.devgen); if (dev_addr < 0) { USB_LOG_ERR("Failed to allocate devaddr,errorcode:%d\r\n", ret); goto errout; } +#endif /* Set the USB device address */ setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; @@ -522,8 +478,6 @@ int usbh_enumerate(struct usbh_hubport *hport) /* And reconfigure EP0 with the correct address */ usbh_ep0_pipe_reconfigure(hport->ep0, dev_addr, ep_mps, hport->speed); -#endif - /* Read the full device descriptor */ setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; setup->bRequest = USB_REQUEST_GET_DESCRIPTOR;