From 1158fc3d8c1a71ae89cb9dbd7504712114352af2 Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Sat, 6 Jan 2024 22:16:58 +0800 Subject: [PATCH] support multi USB IP for host --- README.md | 1 + README_zh.md | 1 + cherryusb_config_template.h | 7 +- class/hub/usbh_hub.c | 113 +++---- class/hub/usbh_hub.h | 11 +- common/usb_hc.h | 10 +- core/usbh_core.c | 235 +++++++++------ core/usbh_core.h | 40 ++- docs/source/api/api_host.rst | 17 +- docs/source/porting_usbip.rst | 10 +- docs/source/quick_start/img/stm32_18.png | Bin 60139 -> 54057 bytes docs/source/quick_start/img/stm32_19.png | Bin 56795 -> 52543 bytes docs/source/quick_start/index.rst | 26 +- docs/source/quick_start/other_chip.rst | 10 +- .../source/quick_start/rt-thread/rtthread.rst | 43 ++- port/dwc2/usb_hc_dwc2.c | 248 ++++++++-------- port/ehci/usb_ehci_priv.h | 20 +- port/ehci/usb_glue_aic.c | 29 +- port/ehci/usb_glue_bouffalo.c | 6 +- port/ehci/usb_glue_hpm.c | 51 +++- port/ehci/usb_glue_intel.c | 8 +- port/ehci/usb_hc_ehci.c | 281 +++++++++--------- port/musb/usb_hc_musb.c | 195 ++++++------ third_party/rt-thread-5.0/msh_cmd.c | 7 - 24 files changed, 752 insertions(+), 617 deletions(-) diff --git a/README.md b/README.md index 79699c66..d0fa6fde 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,7 @@ CherryUSB Host Stack has the following functions: - Support Remote NDIS (RNDIS) - Support Vendor class - Support USB modeswitch +- Support multi host with the same USB IP The CherryUSB Host stack also provides the lsusb function, which allows you to view information about all mounted devices, including those on external hubs, with the help of a shell plugin. diff --git a/README_zh.md b/README_zh.md index 08cb4f76..b41f1c8e 100644 --- a/README_zh.md +++ b/README_zh.md @@ -109,6 +109,7 @@ CherryUSB Host 协议栈当前实现以下功能: - 支持 Remote NDIS (RNDIS) - 支持 Vendor 类 class - 支持 USB modeswitch +- 支持相同 USB IP 的多主机 同时,CherryUSB Host 协议栈还提供了 lsusb 的功能,借助 shell 插件可以查看所有挂载设备的信息,包括外部 hub 上的设备的信息。 diff --git a/cherryusb_config_template.h b/cherryusb_config_template.h index 95c199dc..27733348 100644 --- a/cherryusb_config_template.h +++ b/cherryusb_config_template.h @@ -91,6 +91,7 @@ /* ================ USB HOST Stack Configuration ================== */ +#define CONFIG_USBHOST_MAX_BUS 1 #define CONFIG_USBHOST_MAX_RHPORTS 1 #define CONFIG_USBHOST_MAX_EXTHUBS 1 #define CONFIG_USBHOST_MAX_EHPORTS 4 @@ -137,18 +138,16 @@ /* ================ USB Host Port Configuration ==================*/ -// #define USBH_IRQHandler USBH_IRQHandler -// #define USBH_BASE (0) // #define CONFIG_USBHOST_PIPE_NUM 10 /* ================ EHCI Configuration ================ */ -#define CONFIG_USB_EHCI_HCCR_BASE (0x20072000) -#define CONFIG_USB_EHCI_HCOR_BASE (0x20072000 + 0x10) +#define CONFIG_USB_EHCI_HCOR_OFFSET (0x10) #define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 // #define CONFIG_USB_EHCI_INFO_ENABLE // #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE // #define CONFIG_USB_EHCI_CONFIGFLAG // #define CONFIG_USB_EHCI_PORT_POWER +// #define CONFIG_USB_EHCI_PRINT_HW_PARAM #endif diff --git a/class/hub/usbh_hub.c b/class/hub/usbh_hub.c index 5ef20c6e..52894e02 100644 --- a/class/hub/usbh_hub.c +++ b/class/hub/usbh_hub.c @@ -15,15 +15,8 @@ #define EXTHUB_FIRST_INDEX 2 -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hub_buf[32]; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hub_intbuf[CONFIG_USBHOST_MAX_EXTHUBS + 1][CONFIG_USB_ALIGN_SIZE]; - -usb_slist_t hub_class_head = USB_SLIST_OBJECT_INIT(hub_class_head); - -usb_osal_thread_t hub_thread; -usb_osal_mq_t hub_mq; - -struct usbh_hub roothub; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hub_buf[CONFIG_USBHOST_MAX_BUS][32]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hub_intbuf[CONFIG_USBHOST_MAX_BUS][CONFIG_USBHOST_MAX_EXTHUBS + 1][CONFIG_USB_ALIGN_SIZE]; extern int usbh_free_devaddr(struct usbh_hubport *hport); extern int usbh_enumerate(struct usbh_hubport *hport); @@ -67,17 +60,7 @@ static void usbh_hub_class_free(struct usbh_hub *hub_class) } #endif -static void usbh_hub_register(struct usbh_hub *hub) -{ - usb_slist_add_tail(&hub_class_head, &hub->list); -} - #if CONFIG_USBHOST_MAX_EXTHUBS > 0 -static void usbh_hub_unregister(struct usbh_hub *hub) -{ - usb_slist_remove(&hub_class_head, &hub->list); -} - static int _usbh_hub_get_hub_descriptor(struct usbh_hub *hub, uint8_t *buffer) { struct usb_setup_packet *setup; @@ -100,7 +83,7 @@ static int _usbh_hub_get_hub_descriptor(struct usbh_hub *hub, uint8_t *buffer) setup->wIndex = 0; setup->wLength = USB_SIZEOF_HUB_DESC; - ret = usbh_control_transfer(hub->parent, setup, g_hub_buf); + ret = usbh_control_transfer(hub->parent, setup, g_hub_buf[hub->bus->busid]); if (ret < 0) { return ret; } @@ -144,11 +127,11 @@ static int _usbh_hub_get_portstatus(struct usbh_hub *hub, uint8_t port, struct h setup->wIndex = port; setup->wLength = 4; - ret = usbh_control_transfer(hub->parent, setup, g_hub_buf); + ret = usbh_control_transfer(hub->parent, setup, g_hub_buf[hub->bus->busid]); if (ret < 0) { return ret; } - memcpy(port_status, g_hub_buf, 4); + memcpy(port_status, g_hub_buf[hub->bus->busid], 4); return ret; } @@ -233,7 +216,7 @@ static int usbh_hub_get_portstatus(struct usbh_hub *hub, uint8_t port, struct hu setup->wValue = 0; setup->wIndex = port; setup->wLength = 4; - return usbh_roothub_control(&roothub_setup, (uint8_t *)port_status); + return usbh_roothub_control(hub->bus, &roothub_setup, (uint8_t *)port_status); } else { return _usbh_hub_get_portstatus(hub, port, port_status); } @@ -251,7 +234,7 @@ int usbh_hub_set_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature) setup->wValue = feature; setup->wIndex = port; setup->wLength = 0; - return usbh_roothub_control(setup, NULL); + return usbh_roothub_control(hub->bus, setup, NULL); } else { return _usbh_hub_set_feature(hub, port, feature); } @@ -269,7 +252,7 @@ int usbh_hub_clear_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature) setup->wValue = feature; setup->wIndex = port; setup->wLength = 0; - return usbh_roothub_control(setup, NULL); + return usbh_roothub_control(hub->bus, setup, NULL); } else { return _usbh_hub_clear_feature(hub, port, feature); } @@ -287,17 +270,12 @@ static int usbh_hub_set_depth(struct usbh_hub *hub, uint16_t depth) setup->wValue = depth; setup->wIndex = 0; setup->wLength = 0; - return usbh_roothub_control(setup, NULL); + return usbh_roothub_control(hub->bus, setup, NULL); } else { return _usbh_hub_set_depth(hub, depth); } } -static void usbh_hub_thread_wakeup(struct usbh_hub *hub) -{ - usb_osal_mq_send(hub_mq, (uintptr_t)hub); -} - static void usbh_hubport_release(struct usbh_hubport *child) { if (child->connected) { @@ -341,6 +319,7 @@ static int usbh_hub_connect(struct usbh_hubport *hport, uint8_t intf) hub->hub_addr = hport->dev_addr; hub->parent = hport; + hub->bus = hport->bus; hport->config.intf[intf].priv = hub; @@ -354,6 +333,7 @@ static int usbh_hub_connect(struct usbh_hubport *hport, uint8_t intf) for (uint8_t port = 0; port < hub->hub_desc.bNbrPorts; port++) { hub->child[port].port = port + 1; hub->child[port].parent = hub; + hub->child[port].bus = hport->bus; } ep_desc = &hport->config.intf[intf].altsetting[0].ep[0].ep_desc; @@ -394,10 +374,12 @@ static int usbh_hub_connect(struct usbh_hubport *hport, uint8_t intf) hub->connected = true; snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, hub->index); - usbh_hub_register(hub); + + usb_slist_add_tail(&hub->bus->hub_list, &hub->list); + USB_LOG_INFO("Register HUB Class:%s\r\n", hport->config.intf[intf].devname); - hub->int_buffer = g_hub_intbuf[hub->index - 1]; + hub->int_buffer = g_hub_intbuf[hub->bus->busid][hub->index - 1]; usbh_int_urb_fill(&hub->intin_urb, hub->parent, hub->intin, hub->int_buffer, 1, 0, hub_int_complete_callback, hub); usbh_submit_urb(&hub->intin_urb); return 0; @@ -423,7 +405,7 @@ static int usbh_hub_disconnect(struct usbh_hubport *hport, uint8_t intf) if (hport->config.intf[intf].devname[0] != '\0') { USB_LOG_INFO("Unregister HUB Class:%s\r\n", hport->config.intf[intf].devname); - usbh_hub_unregister(hub); + usb_slist_remove(&hub->bus->hub_list, &hub->list); } usbh_hub_class_free(hub); @@ -461,7 +443,7 @@ static void usbh_hub_events(struct usbh_hub *hub) } portchange_index = hub->int_buffer[0]; - hub->int_buffer[0] = 0; + hub->int_buffer[0] &= ~portchange_index; for (uint8_t port = 0; port < hub->hub_desc.bNbrPorts; port++) { USB_LOG_DBG("Port change:0x%02x\r\n", portchange_index); @@ -602,9 +584,10 @@ static void usbh_hub_events(struct usbh_hub *hub) child->connected = true; child->port = port + 1; child->speed = speed; + child->bus = hub->bus; child->mutex = usb_osal_mutex_create(); - USB_LOG_INFO("New %s device on Hub %u, Port %u connected\r\n", speed_table[speed], hub->index, port + 1); + USB_LOG_INFO("New %s device on Bus %u, Hub %u, Port %u connected\r\n", speed_table[speed], hub->bus->busid, hub->index, port + 1); /* create disposable thread to enumerate device on current hport, do not block hub thread */ usb_osal_thread_create("usbh_enum", CONFIG_USBHOST_PSC_STACKSIZE, CONFIG_USBHOST_PSC_PRIO + 1, usbh_hubport_enumerate_thread, (void *)child); @@ -622,7 +605,7 @@ static void usbh_hub_events(struct usbh_hub *hub) child = &hub->child[port]; /** release child sources */ usbh_hubport_release(child); - USB_LOG_INFO("Device on Hub %u, Port %u disconnected\r\n", hub->index, port + 1); + USB_LOG_INFO("Device on Bus %u, Hub %u, Port %u disconnected\r\n", hub->bus->busid, hub->index, port + 1); } } } @@ -638,9 +621,11 @@ static void usbh_hub_thread(void *argument) struct usbh_hub *hub; int ret = 0; - usb_hc_init(); + struct usbh_bus *bus = (struct usbh_bus *)argument; + + usb_hc_init(bus); while (1) { - ret = usb_osal_mq_recv(hub_mq, (uintptr_t *)&hub, USB_OSAL_WAITING_FOREVER); + ret = usb_osal_mq_recv(bus->hub_mq, (uintptr_t *)&hub, USB_OSAL_WAITING_FOREVER); if (ret < 0) { continue; } @@ -648,55 +633,41 @@ static void usbh_hub_thread(void *argument) } } -static void usbh_roothub_register(void) +void usbh_hub_thread_wakeup(struct usbh_hub *hub) { - usb_slist_init(&hub_class_head); - - memset(&roothub, 0, sizeof(struct usbh_hub)); - - roothub.connected = true; - roothub.index = 1; - roothub.is_roothub = true; - roothub.parent = NULL; - roothub.hub_addr = 1; - roothub.hub_desc.bNbrPorts = CONFIG_USBHOST_MAX_RHPORTS; - usbh_hub_register(&roothub); + usb_osal_mq_send(hub->bus->hub_mq, (uintptr_t)hub); } -void usbh_roothub_thread_wakeup(uint8_t port) +int usbh_hub_initialize(struct usbh_bus *bus) { - roothub.int_buffer = g_hub_intbuf[roothub.index - 1]; - roothub.int_buffer[0] |= (1 << port); - usbh_hub_thread_wakeup(&roothub); -} + char thread_name[32] = { 0 }; -int usbh_hub_initialize(void) -{ - usbh_roothub_register(); - - hub_mq = usb_osal_mq_create(7); - if (hub_mq == NULL) { + bus->hub_mq = usb_osal_mq_create(7); + if (bus->hub_mq == NULL) { + USB_LOG_ERR("Failed to create hub mq\r\n"); return -1; } - hub_thread = usb_osal_thread_create("usbh_hub", CONFIG_USBHOST_PSC_STACKSIZE, CONFIG_USBHOST_PSC_PRIO, usbh_hub_thread, NULL); - if (hub_thread == NULL) { + snprintf(thread_name, 32, "usbh_hub%u", bus->busid); + bus->hub_thread = usb_osal_thread_create(thread_name, CONFIG_USBHOST_PSC_STACKSIZE, CONFIG_USBHOST_PSC_PRIO, usbh_hub_thread, bus); + if (bus->hub_thread == NULL) { + USB_LOG_ERR("Failed to create hub thread\r\n"); return -1; } return 0; } -int usbh_hub_deinitialize(void) +int usbh_hub_deinitialize(struct usbh_bus *bus) { - usb_slist_t *i; + usb_slist_t *hub_list; struct usbh_hubport *hport; size_t flags; flags = usb_osal_enter_critical_section(); - usb_slist_for_each(i, &hub_class_head) + usb_slist_for_each(hub_list, &bus->hub_list) { - struct usbh_hub *hub = usb_slist_entry(i, struct usbh_hub, list); + struct usbh_hub *hub = usb_slist_entry(hub_list, struct usbh_hub, list); for (uint8_t port = 0; port < hub->hub_desc.bNbrPorts; port++) { hport = &hub->child[port]; @@ -705,12 +676,12 @@ int usbh_hub_deinitialize(void) } } - usb_hc_deinit(); + usb_hc_deinit(bus); usb_osal_leave_critical_section(flags); - usb_osal_mq_delete(hub_mq); - usb_osal_thread_delete(hub_thread); + usb_osal_mq_delete(bus->hub_mq); + usb_osal_thread_delete(bus->hub_thread); return 0; } diff --git a/class/hub/usbh_hub.h b/class/hub/usbh_hub.h index 007bf40e..1f34c53b 100644 --- a/class/hub/usbh_hub.h +++ b/class/hub/usbh_hub.h @@ -8,13 +8,12 @@ #include "usb_hub.h" +struct usbh_hub; + #define USBH_HUB_MAX_PORTS 4 /* Maximum size of an interrupt IN transfer */ #define USBH_HUB_INTIN_BUFSIZE ((USBH_HUB_MAX_PORTS + 8) >> 3) -extern usb_slist_t hub_class_head; -extern struct usbh_hub roothub; - #ifdef __cplusplus extern "C" { #endif @@ -22,10 +21,10 @@ extern "C" { int usbh_hub_set_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature); int usbh_hub_clear_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature); -void usbh_roothub_thread_wakeup(uint8_t port); +void usbh_hub_thread_wakeup(struct usbh_hub *hub); -int usbh_hub_initialize(void); -int usbh_hub_deinitialize(void); +int usbh_hub_initialize(struct usbh_bus *bus); +int usbh_hub_deinitialize(struct usbh_bus *bus); #ifdef __cplusplus } diff --git a/common/usb_hc.h b/common/usb_hc.h index ae50352c..364a9096 100644 --- a/common/usb_hc.h +++ b/common/usb_hc.h @@ -14,6 +14,8 @@ extern "C" { typedef void (*usbh_complete_callback_t)(void *arg, int nbytes); +struct usbh_bus; + /** * @brief USB Iso Configuration. * @@ -59,21 +61,21 @@ struct usbh_urb { * * @return On success will return 0, and others indicate fail. */ -int usb_hc_init(void); +int usb_hc_init(struct usbh_bus *bus); /** * @brief usb host controller hardware deinit. * * @return On success will return 0, and others indicate fail. */ -int usb_hc_deinit(void); +int usb_hc_deinit(struct usbh_bus *bus); /** * @brief Get frame number. * * @return frame number. */ -uint16_t usbh_get_frame_number(void); +uint16_t usbh_get_frame_number(struct usbh_bus *bus); /** * @brief control roothub. * @@ -81,7 +83,7 @@ uint16_t usbh_get_frame_number(void); * @param buf buf for reading response or write data. * @return On success will return 0, and others indicate fail. */ -int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf); +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf); /** * @brief Submit a usb transfer request to an endpoint. diff --git a/core/usbh_core.c b/core/usbh_core.c index 224f3e16..99901478 100644 --- a/core/usbh_core.c +++ b/core/usbh_core.c @@ -8,33 +8,19 @@ struct usbh_class_info *usbh_class_info_table_begin = NULL; struct usbh_class_info *usbh_class_info_table_end = NULL; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t ep0_request_buffer[CONFIG_USBHOST_REQUEST_BUFFER_LEN]; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX struct usb_setup_packet g_setup[CONFIG_USBHOST_MAX_EXTHUBS + 1][CONFIG_USBHOST_MAX_EHPORTS]; +usb_slist_t g_bus_head = USB_SLIST_OBJECT_INIT(g_bus_head); + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t ep0_request_buffer[CONFIG_USBHOST_MAX_BUS][CONFIG_USBHOST_REQUEST_BUFFER_LEN]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX struct usb_setup_packet g_setup_buffer[CONFIG_USBHOST_MAX_BUS][CONFIG_USBHOST_MAX_EXTHUBS + 1][CONFIG_USBHOST_MAX_EHPORTS]; /* general descriptor field offsets */ -#define DESC_bLength 0 /** Length offset */ -#define DESC_bDescriptorType 1 /** Descriptor type offset */ +#define DESC_bLength 0 /** Length offset */ +#define DESC_bDescriptorType 1 /** Descriptor type offset */ #define USB_DEV_ADDR_MAX 0x7f #define USB_DEV_ADDR_MARK_OFFSET 5 #define USB_DEV_ADDR_MARK_MASK 0x1f -struct usbh_devaddr_map { - /** - * alloctab[0]:addr from 0~31 - * alloctab[1]:addr from 32~63 - * alloctab[2]:addr from 64~95 - * alloctab[3]:addr from 96~127 - * - */ - uint8_t next; /* Next device address */ - uint32_t alloctab[4]; /* Bit allocation table */ -}; - -struct usbh_bus { - struct usbh_devaddr_map devgen; -} g_usbh_bus; - static int usbh_allocate_devaddr(struct usbh_devaddr_map *devgen) { uint8_t startaddr = devgen->next; @@ -227,15 +213,18 @@ static int parse_config_descriptor(struct usbh_hubport *hport, struct usb_config cur_ep = 0; if (cur_iface > (CONFIG_USBHOST_MAX_INTERFACES - 1)) { USB_LOG_ERR("Interface num overflow\r\n"); - return -USB_ERR_NOMEM; + while (1) { + } } if (cur_alt_setting > (CONFIG_USBHOST_MAX_INTF_ALTSETTINGS - 1)) { USB_LOG_ERR("Interface altsetting num overflow\r\n"); - return -USB_ERR_NOMEM; + while (1) { + } } if (cur_ep_num > CONFIG_USBHOST_MAX_ENDPOINTS) { USB_LOG_ERR("Endpoint num overflow\r\n"); - return -USB_ERR_NOMEM; + while (1) { + } } #if 0 USB_LOG_DBG("Interface Descriptor:\r\n"); @@ -343,7 +332,7 @@ int usbh_free_devaddr(struct usbh_hubport *hport) { #ifndef CONFIG_USBHOST_XHCI if (hport->dev_addr > 0) { - __usbh_free_devaddr(&g_usbh_bus.devgen, hport->dev_addr); + __usbh_free_devaddr(&hport->bus->devgen, hport->dev_addr); } #endif @@ -368,12 +357,12 @@ int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *out setup->wIndex = 0x0409; setup->wLength = 255; - ret = usbh_control_transfer(hport, setup, ep0_request_buffer); + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); if (ret < 0) { return ret; } - src = ep0_request_buffer; + src = ep0_request_buffer[hport->bus->busid]; dst = output; len = src[0]; @@ -409,7 +398,7 @@ int usbh_enumerate(struct usbh_hubport *hport) uint16_t ep_mps; int ret; - hport->setup = &g_setup[hport->parent->index - 1][hport->port - 1]; + hport->setup = &g_setup_buffer[hport->bus->busid][hport->parent->index - 1][hport->port - 1]; setup = hport->setup; ep = &hport->ep0; @@ -431,16 +420,16 @@ int usbh_enumerate(struct usbh_hubport *hport) setup->wIndex = 0; setup->wLength = 8; - ret = usbh_control_transfer(hport, setup, ep0_request_buffer); + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); 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, 8); + parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid], 8); /* Extract the correct max packetsize from the device descriptor */ - dev_desc = (struct usb_device_descriptor *)ep0_request_buffer; + dev_desc = (struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid]; if (dev_desc->bcdUSB >= USB_3_0) { ep_mps = 1 << dev_desc->bMaxPacketSize0; } else { @@ -465,7 +454,7 @@ int usbh_enumerate(struct usbh_hubport *hport) } #else /* Assign a function address to the device connected to this port */ - dev_addr = usbh_allocate_devaddr(&g_usbh_bus.devgen); + dev_addr = usbh_allocate_devaddr(&hport->bus->devgen); if (dev_addr < 0) { USB_LOG_ERR("Failed to allocate devaddr,errorcode:%d\r\n", ret); goto errout; @@ -498,17 +487,17 @@ int usbh_enumerate(struct usbh_hubport *hport) setup->wIndex = 0; setup->wLength = USB_SIZEOF_DEVICE_DESC; - ret = usbh_control_transfer(hport, setup, ep0_request_buffer); + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); if (ret < 0) { USB_LOG_ERR("Failed to get full device descriptor,errorcode:%d\r\n", ret); goto errout; } - parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer, USB_SIZEOF_DEVICE_DESC); + parse_device_descriptor(hport, (struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid], USB_SIZEOF_DEVICE_DESC); USB_LOG_INFO("New device found,idVendor:%04x,idProduct:%04x,bcdDevice:%04x\r\n", - ((struct usb_device_descriptor *)ep0_request_buffer)->idVendor, - ((struct usb_device_descriptor *)ep0_request_buffer)->idProduct, - ((struct usb_device_descriptor *)ep0_request_buffer)->bcdDevice); + ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->idVendor, + ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->idProduct, + ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->bcdDevice); /* Read the first 9 bytes of the config descriptor */ setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_DEVICE; @@ -517,7 +506,7 @@ int usbh_enumerate(struct usbh_hubport *hport) setup->wIndex = 0; setup->wLength = USB_SIZEOF_CONFIG_DESC; - ret = usbh_control_transfer(hport, setup, ep0_request_buffer); + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); if (ret < 0) { USB_LOG_ERR("Failed to get config descriptor,errorcode:%d\r\n", ret); goto errout; @@ -534,18 +523,18 @@ int usbh_enumerate(struct usbh_hubport *hport) setup->wIndex = 0; setup->wLength = wTotalLength; - ret = usbh_control_transfer(hport, setup, ep0_request_buffer); + ret = usbh_control_transfer(hport, setup, ep0_request_buffer[hport->bus->busid]); if (ret < 0) { USB_LOG_ERR("Failed to get full config descriptor,errorcode:%d\r\n", ret); goto errout; } - ret = parse_config_descriptor(hport, (struct usb_configuration_descriptor *)ep0_request_buffer, wTotalLength); + ret = parse_config_descriptor(hport, (struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid], wTotalLength); if (ret < 0) { USB_LOG_ERR("Parse config fail\r\n"); goto errout; } - USB_LOG_INFO("The device has %d interfaces\r\n", ((struct usb_configuration_descriptor *)ep0_request_buffer)->bNumInterfaces); + USB_LOG_INFO("The device has %d interfaces\r\n", ((struct usb_configuration_descriptor *)ep0_request_buffer[hport->bus->busid])->bNumInterfaces); hport->raw_config_desc = usb_malloc(wTotalLength); if (hport->raw_config_desc == NULL) { ret = -USB_ERR_NOMEM; @@ -640,10 +629,53 @@ errout: return ret; } -int usbh_initialize(void) +struct usbh_bus *usbh_alloc_bus(uint8_t busid, uint32_t reg_base) { - memset(&g_usbh_bus, 0, sizeof(struct usbh_bus)); + struct usbh_bus *bus; + struct usbh_hub *hub; + if (busid > CONFIG_USBHOST_MAX_BUS) { + USB_LOG_ERR("bus overflow\r\n"); + while (1) { + } + } + + bus = usb_malloc(sizeof(struct usbh_bus)); + if (bus == NULL) { + USB_LOG_ERR("No memory to alloc bus\r\n"); + while (1) { + } + } + + memset(bus, 0, sizeof(struct usbh_bus)); + bus->busid = busid; + bus->hcd.hcd_id = busid; + bus->hcd.reg_base = reg_base; + + /* devaddr 1 is for roothub */ + bus->devgen.next = 2; + + usb_slist_init(&bus->hub_list); + + hub = &bus->hcd.roothub; + hub->connected = true; + hub->index = 1; + hub->is_roothub = true; + hub->parent = NULL; + hub->hub_addr = 1; + hub->hub_desc.bNbrPorts = CONFIG_USBHOST_MAX_RHPORTS; + hub->int_buffer = bus->hcd.roothub_intbuf; + hub->bus = bus; + + usb_slist_init(&bus->hub_list); + usb_slist_add_tail(&bus->hub_list, &hub->list); + usb_slist_add_tail(&g_bus_head, &bus->list); + + return bus; +} + +int usbh_initialize(struct usbh_bus *bus) +{ #ifdef __ARMCC_VERSION /* ARM C Compiler */ extern const int usbh_class_info$$Base; extern const int usbh_class_info$$Limit; @@ -658,17 +690,19 @@ int usbh_initialize(void) usbh_class_info_table_begin = (struct usbh_class_info *)__section_begin("usbh_class_info"); usbh_class_info_table_end = (struct usbh_class_info *)__section_end("usbh_class_info"); #endif - - /* devaddr 1 is for roothub */ - g_usbh_bus.devgen.next = 2; - - usbh_hub_initialize(); + usbh_hub_initialize(bus); return 0; } -int usbh_deinitialize(void) +int usbh_deinitialize(struct usbh_bus *bus) { - return usbh_hub_deinitialize(); + usbh_hub_deinitialize(bus); + + usb_slist_init(&bus->hub_list); + usb_slist_remove(&g_bus_head, &bus->list); + + usb_free(bus); + return 0; } int usbh_control_transfer(struct usbh_hubport *hport, struct usb_setup_packet *setup, uint8_t *buffer) @@ -695,16 +729,21 @@ void *usbh_find_class_instance(const char *devname) { struct usbh_hubport *hport; usb_slist_t *hub_list; + usb_slist_t *bus_list; - usb_slist_for_each(hub_list, &hub_class_head) + usb_slist_for_each(bus_list, &g_bus_head) { - struct usbh_hub *hub = usb_slist_entry(hub_list, struct usbh_hub, list); - for (uint8_t port = 0; port < hub->hub_desc.bNbrPorts; port++) { - hport = &hub->child[port]; - if (hport->connected) { - for (uint8_t itf = 0; itf < hport->config.config_desc.bNumInterfaces; itf++) { - if ((strncmp(hport->config.intf[itf].devname, devname, CONFIG_USBHOST_DEV_NAMELEN) == 0) && hport->config.intf[itf].priv) - return hport->config.intf[itf].priv; + struct usbh_bus *bus = usb_slist_entry(bus_list, struct usbh_bus, list); + usb_slist_for_each(hub_list, &bus->hub_list) + { + struct usbh_hub *hub = usb_slist_entry(hub_list, struct usbh_hub, list); + for (uint8_t port = 0; port < hub->hub_desc.bNbrPorts; port++) { + hport = &hub->child[port]; + if (hport->connected) { + for (uint8_t itf = 0; itf < hport->config.config_desc.bNumInterfaces; itf++) { + if ((strncmp(hport->config.intf[itf].devname, devname, CONFIG_USBHOST_DEV_NAMELEN) == 0) && hport->config.intf[itf].priv) + return hport->config.intf[itf].priv; + } } } } @@ -714,7 +753,8 @@ void *usbh_find_class_instance(const char *devname) int lsusb(int argc, char **argv) { - usb_slist_t *i; + usb_slist_t *hub_list; + usb_slist_t *bus_list; struct usbh_hubport *hport; if (argc < 2) { @@ -739,30 +779,38 @@ int lsusb(int argc, char **argv) } if (strcmp(argv[1], "-t") == 0) { - usb_slist_for_each(i, &hub_class_head) + usb_slist_for_each(bus_list, &g_bus_head) { - struct usbh_hub *hub = usb_slist_entry(i, struct usbh_hub, list); + struct usbh_bus *bus = usb_slist_entry(bus_list, struct usbh_bus, list); + usb_slist_for_each(hub_list, &bus->hub_list) + { + struct usbh_hub *hub = usb_slist_entry(hub_list, struct usbh_hub, list); - if (hub->is_roothub) { - USB_LOG_RAW("/: Hub %02u, ports=%u, is roothub\r\n", hub->index, hub->hub_desc.bNbrPorts); - } else { - USB_LOG_RAW("/: Hub %02u, ports=%u, mounted on Hub %02u:Port %u\r\n", - hub->index, - hub->hub_desc.bNbrPorts, - hub->parent->parent->index, - hub->parent->port); - } + if (hub->is_roothub) { + USB_LOG_RAW("/: Bus %u, Hub %u, ports=%u, is roothub\r\n", + bus->busid, + hub->index, + hub->hub_desc.bNbrPorts); + } else { + USB_LOG_RAW("/: Bus %u, Hub %u, ports=%u, mounted on Hub %02u:Port %u\r\n", + bus->busid, + hub->index, + hub->hub_desc.bNbrPorts, + hub->parent->parent->index, + hub->parent->port); + } - for (uint8_t port = 0; port < hub->hub_desc.bNbrPorts; port++) { - hport = &hub->child[port]; - if (hport->connected) { - for (uint8_t i = 0; i < hport->config.config_desc.bNumInterfaces; i++) { - if (hport->config.intf[i].class_driver->driver_name) { - USB_LOG_RAW(" |__Port %u,Port addr:0x%02x,If %u,ClassDriver=%s\r\n", - hport->port, - hport->dev_addr, - i, - hport->config.intf[i].class_driver->driver_name); + for (uint8_t port = 0; port < hub->hub_desc.bNbrPorts; port++) { + hport = &hub->child[port]; + if (hport->connected) { + for (uint8_t i = 0; i < hport->config.config_desc.bNumInterfaces; i++) { + if (hport->config.intf[i].class_driver->driver_name) { + USB_LOG_RAW("\t|__Port %u, dev addr:0x%02x, If %u, ClassDriver=%s\r\n", + hport->port, + hport->dev_addr, + i, + hport->config.intf[i].class_driver->driver_name); + } } } } @@ -771,19 +819,24 @@ int lsusb(int argc, char **argv) } if (strcmp(argv[1], "-v") == 0) { - usb_slist_for_each(i, &hub_class_head) + usb_slist_for_each(bus_list, &g_bus_head) { - struct usbh_hub *hub = usb_slist_entry(i, struct usbh_hub, list); - for (uint8_t port = 0; port < hub->hub_desc.bNbrPorts; port++) { - hport = &hub->child[port]; - if (hport->connected) { - USB_LOG_RAW("Hub %02u,Port %u,Port addr:0x%02x,VID:PID 0x%04x:0x%04x\r\n", - hub->index, - hport->port, - hport->dev_addr, - hport->device_desc.idVendor, - hport->device_desc.idProduct); - usbh_print_hubport_info(hport); + struct usbh_bus *bus = usb_slist_entry(bus_list, struct usbh_bus, list); + usb_slist_for_each(hub_list, &bus->hub_list) + { + struct usbh_hub *hub = usb_slist_entry(hub_list, struct usbh_hub, list); + for (uint8_t port = 0; port < hub->hub_desc.bNbrPorts; port++) { + hport = &hub->child[port]; + if (hport->connected) { + USB_LOG_RAW("Bus %u, Hub %02u, Port %u, dev addr:0x%02x, VID:PID 0x%04x:0x%04x\r\n", + bus->busid, + hub->index, + hport->port, + hport->dev_addr, + hport->device_desc.idVendor, + hport->device_desc.idProduct); + usbh_print_hubport_info(hport); + } } } } diff --git a/core/usbh_core.h b/core/usbh_core.h index 7cbcafa6..056b630c 100644 --- a/core/usbh_core.h +++ b/core/usbh_core.h @@ -31,8 +31,8 @@ extern "C" { #define USB_CLASS_MATCH_INTF_SUBCLASS 0x0008 #define USB_CLASS_MATCH_INTF_PROTOCOL 0x0010 -#define CLASS_CONNECT(hport, i) ((hport)->config.intf[i].class_driver->connect(hport, i)) -#define CLASS_DISCONNECT(hport, i) ((hport)->config.intf[i].class_driver->disconnect(hport, i)) +#define CLASS_CONNECT(hport, i) ((hport)->config.intf[i].class_driver->connect(hport, i)) +#define CLASS_DISCONNECT(hport, i) ((hport)->config.intf[i].class_driver->disconnect(hport, i)) #ifdef __ARMCC_VERSION /* ARM C Compiler */ #define CLASS_INFO_DEFINE __attribute__((section("usbh_class_info"))) __USED __ALIGNED(1) @@ -106,6 +106,7 @@ struct usbh_hubport { uint8_t *raw_config_desc; struct usb_setup_packet *setup; struct usbh_hub *parent; + struct usbh_bus *bus; #ifdef CONFIG_USBHOST_XHCI uint32_t protocol; /* port protocol, for xhci, some ports are USB2.0, others are USB3.0 */ #endif @@ -123,11 +124,41 @@ struct usbh_hub { struct usb_hub_descriptor hub_desc; struct usbh_hubport child[CONFIG_USBHOST_MAX_EHPORTS]; struct usbh_hubport *parent; + struct usbh_bus *bus; struct usb_endpoint_descriptor *intin; struct usbh_urb intin_urb; uint8_t *int_buffer; }; +struct usbh_devaddr_map { + /** + * alloctab[0]:addr from 0~31 + * alloctab[1]:addr from 32~63 + * alloctab[2]:addr from 64~95 + * alloctab[3]:addr from 96~127 + * + */ + uint8_t next; /* Next device address */ + uint32_t alloctab[4]; /* Bit allocation table */ +}; + +struct usbh_hcd { + uint32_t reg_base; + uint8_t hcd_id; + uint8_t roothub_intbuf[1]; + struct usbh_hub roothub; +}; + +struct usbh_bus { + usb_slist_t list; + uint8_t busid; + struct usbh_hcd hcd; + struct usbh_devaddr_map devgen; + usb_osal_thread_t hub_thread; + usb_osal_mq_t hub_mq; + usb_slist_t hub_list; +}; + static inline void usbh_control_urb_fill(struct usbh_urb *urb, struct usbh_hubport *hport, struct usb_setup_packet *setup, @@ -225,8 +256,9 @@ int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *out */ int usbh_set_interface(struct usbh_hubport *hport, uint8_t intf, uint8_t altsetting); -int usbh_initialize(void); -int usbh_deinitialize(void); +struct usbh_bus *usbh_alloc_bus(uint8_t busid, uint32_t reg_base); +int usbh_initialize(struct usbh_bus *bus); +int usbh_deinitialize(struct usbh_bus *bus); void *usbh_find_class_instance(const char *devname); int lsusb(int argc, char **argv); diff --git a/docs/source/api/api_host.rst b/docs/source/api/api_host.rst index c87166be..92274922 100644 --- a/docs/source/api/api_host.rst +++ b/docs/source/api/api_host.rst @@ -111,6 +111,19 @@ hub 结构体 uint8_t *int_buffer; }; +usbh_alloc_bus +"""""""""""""""""""""""""""""""""""" + +``usbh_alloc_bus`` 用于创建一个 bus,并且根据 reg_base 分配一个 hcd + +.. code-block:: C + + struct usbh_bus *usbh_alloc_bus(uint8_t busid, uint32_t reg_base); + +- **busid** bus id,从 0开始,不能超过 `CONFIG_USBHOST_MAX_BUS` +- **reg_base** hcd 寄存器基地址 +- 返回 bus 句柄 + usbh_initialize """""""""""""""""""""""""""""""""""" @@ -118,7 +131,9 @@ usbh_initialize .. code-block:: C - int usbh_initialize(void); + int usbh_initialize(struct usbh_bus *bus); + +- **bus** bus 句柄 usbh_find_class_instance """""""""""""""""""""""""""""""""""" diff --git a/docs/source/porting_usbip.rst b/docs/source/porting_usbip.rst index 401cb4b1..985a607c 100644 --- a/docs/source/porting_usbip.rst +++ b/docs/source/porting_usbip.rst @@ -216,17 +216,17 @@ EHCI 是 intel 制定的标准主机控制器接口,任何厂家都必须实 .. code-block:: C - //Host Controller Capability Register BASE - #define CONFIG_USB_EHCI_HCCR_BASE (0xxx) - //Host Controller Operational Register BASE - #define CONFIG_USB_EHCI_HCOR_BASE (0xxx) + //Host Controller Operational Register BASE 距离基地址的偏移 + #define CONFIG_USB_EHCI_HCOR_OFFSET (0x14) //是否打印 ehci 配置信息 #define CONFIG_USB_EHCI_INFO_ENABLE //是否关闭保留寄存器的占位,默认保留 9 个双字的占位 - #define CONFIG_USB_ECHI_HCOR_RESERVED_DISABLE + #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE //是否使能 configflag 寄存器中的 bit0 #define CONFIG_USB_EHCI_CONFIGFLAG //是否使能 port power bit #define CONFIG_USB_EHCI_PORT_POWER + //是否查看 ehci 配置信息 + #define CONFIG_USB_EHCI_PRINT_HW_PARAM 同时由于 EHCI 只是主机控制器并且只支持高速,一般配合一个 otg 控制器和一个低速全速兼容控制单元,而速度的获取一般是在 otg 寄存器中,所以需要用户实现 `usbh_get_port_speed` 函数。 \ No newline at end of file diff --git a/docs/source/quick_start/img/stm32_18.png b/docs/source/quick_start/img/stm32_18.png index 4a780b569fc6cce43fb3b7156f5c6071266d48fe..3c3800c1b94b64f7dc17f4857b30e7940e2c4009 100644 GIT binary patch literal 54057 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 literal 60139 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

Y8{BuXg1g3 zS|}h?sB{FrAxEC^b(lIwMO-`rD+;vwdXG+QZ9oFmEiK&oE*~hIT_j(Fa%&vH0~0}T z@~R}@7b4~g;z@w67v+r`=QQF<&?#5-kmJ)ZI9vmY|JTDv%>>p>{sydFEACo87Wyj? zGyzs;m>K!tYBcYb{7jll%9jv+rGdA?b(~f@!G?LB!#4IW#u!x(T8r9J;#yfJ5o*7!aJc?d5&m!O zqoRsVfa=#Ywv2taVl5A+jaPLQ_@?#S#~f?5+(bZO+hISdzG)j!kY33qGU=2J<^5j5 z!@s%FM%;3J6z%N16Wd*Gkgsb|0uqk8+L}BIF5~{X;A>6nlLJkiFQq8tO9ju8Ubcly zoYFxcbn~SXg<3Nf{Y*Ds$X*J?IP_r_qw7hV47TT!rI72rxt=&yT>~cVF}Ole>;p*r zb5yxqv4;`SZSjy#*@T+Mvyyx|7RSP8PJSMnm)kJdTNj?MIy`@>>H1TOJeKZI1&B z(+BCQen8j8h9(($!Zi|?9*(-6&weG&!Gci-PSQe1qfj8R6*)+h=_%@)kVui*FIWT4c$=cc%TTE_!E0^yjjdco_ANz@QDmX)4*%n7XJ1R1vIAz}B{RcJkg_bikN6 zY`a4Y(G640qtwT5l&#rwcDZ{*LSlV?#;{`;Qx6`|$z+!~I$MCT$6_m1|E@-YI9!Xi zu1xD*NiB6&hB|7Efw3zr6yxxqZ}sUA0rMD6{KQGzt)$@|?^l&_yaCsFtMbsR<2}ituB(um*jK;mQ_W=ai&vtc3<893{C7Q_m0#Nt2XkpBGNJO6ik zUO)H*SfL_K=0ZEr0BLawt*3&6S1`UAFTn)uRZ9V5Ld-3x|Giu0UBp91&EZ>Ud^aS| z5VLuyjOV|XWN%FjPRNb-QDJVq-tYjL z252-IF8KZHEFWs2S4#;*i~Bj1(Q z@2JLT(kNOFtWq7+^Ffz{E?*x{Q@)~4#@KC;b6tTA|FPPm{1kT$b!#8&_;B`Nl_1kjklEHKBk$`D!C&hzeoeJJH3eXM! z!wie9*}qy14Tu31?nXU(*phI1{kTX4o;2A&%jZ~&gu2@x^}4lwKREz4owOFP5d@v0 zM!f%ZAO0H`gS#3JEaGK42uxdQ&#i%i^zdPL;o+WWDk;j?I^&nLFDfo z^G4FC|3=M8az1I1AT6N#k6#C$ZPkc>tUF&^=G(A=F4cL&DU}wAy3&IVFxDmC zF#<<2y{7P07-aSmq}mo=NN&Z&n{+_Dq#x5ik?;j{;X$&_B_BYT^7S1eQR$1~v` zDYI=yNo77t<>lZH!dQi44BpWf+`WQN$tckR=gV_a$eTM`W~3gg>;tC^1|DC_oxK{o zuV3<-Ul=OR4VAf9Ia>+;g$`F60CdQ;e+PJ;L?&gP+Zu^V-?Vs@LoEi7{8|%JXuQm2 zeR{9C+(rngpk0gaPhx_KcJWvnQ3X?O4ug?mh3>OlQxO44UN=w=?|5~>V(oPl(&{IQnK66Dm@q0U+6^^q;J{+)Lp9Yy?56n zi>;nvW=LiwDWT9q1=^+TZ8sgbsdaZ^ZSOvo;ZdtGtj~;sATj)xNynQnacX-65*hS1qRYn4|5>??NwUl_1I$Y#n_ajNvvqd=CZF~kl zgyRW=Q%rlXaq}pgbNrKJZUj#wAzhtHuHG@PqWLNT!Mc_E7rtj;aLmr6MCs7uexLEo zpevxz2zBe!MIogYwm+X?C4yaMGI$G->;4d(4J@8+PdbREhO`10a9nkpTOr>zlH6Mm zd3hvI1u`N!B*7r)=(I*pt9zGmO6p$svrM6-RpwCV(iS%}!?4Zy>DL0Z(DXmFaPco% z=xvP3p|Gp`zi8q0|DlE0>Z1Rqh1kW-g?1HxXrYd&n&JPZh2h7K$ut}LaVCI~nWqaK zV62fY=&+=(iCw6?7(1A(i5S>WqA>3QXcT$Y^8ZIi*F z4-*qlQ7|!%H=HUAeI^U9ok$O}CjifBrWwrR`tJ6_BbGcOpg?C{?KCI6)`Bd8EfYs@ zhmh(SJvJ?`CH%63Z;lzP%+F@?%$Dj4FC$1ax(^rD zML;YUf4X!Sh5PO>NY^VRzVz@BaC8-^&M@5!Gfw{56LCcPonXoLmZt+yyP}EqLiF1|XQH8?_n&kfoJYkNI^JpY0;Q$LkG=pXK7T8`liU{p?}%=i<(}bp$7Uk6gie z8_S}M6B-?KZZx8Mlk137S?{!IqSensv?JXhPs3mr;tHp1Epwrl<(t)LB=HzrU0Wnw zV);SKXX?)P*O=ufFQ(c>l#z$)Dm^P%N4cw==<%XO?a397k14YGy70VQ7Aej4QL23N zeaRQDDlf*(%S6i-%Gxl8AYp(9e#~8@NxqHOGQ2eaEe-LLEprnVd~(9RCh8>N#Y@lm ztAasMgg3%-3sq^Fl-(s;*W*rNnW4gI>iy?z4p8MV!pwpA_Y|y~Zwtm=zz~y^+J@N% zKMKIGt?^!V=XBr%m#1hnbZ4uVxWPAp`YlbRwr1kT&UXCi?R2l_iAOo8-?x|KJG1US z3?67nl{2hs4Sd3m7L^l=(x{cqDBO8oE-RGnxODtcSVt>}t?+E~1V%kogx`?jEDIzp z>3n8};7s${U8HFOD)An0Bs}g3vsSyZ(A4lWM>)9jR?SUui_Y;D-KzRC7V4$f`)Stb z3iG%V&n2Q(MDrWt$Ez(u+?x{h%{ANX2<$#LO3AtJ?ZQz`sXP4*_|*RZKGwO;C;P+s z?!*T3qFJc~dz_LVRPQz4Xn1d$E!bWO5(G5XLUpREYo*jPj)V;A-=+H*Ry5k{ZH%D- z;-yP(Ip`@$hYoF@aK$GGKNEa3z*q3T4%V0wV?SkR!a5O!I=;SG?qg&>M|Rq8?27WzCd`)c!?>K!GXZIFqXzju`yvzyb_tDlvMub^bwdqN01;GV`} zqw4q&PRpvddY%%pTjKa%ev0y`b8#bTBoaTkijuuJW#1x}V%p}R&TZKToxhq2(*GOX zC6?FBi(7Yahi%9E;XUC_a5K{*+M_SSqP7%7}>eZigS89MHc<+H1Uig6zZc431i0O8Kl~`!s$lcBu_4sc-XGs1s zvo_o{Xq;>DO)KQt0!64iQGOh7YS%gETdrdU(hFQ|uRu)$rP-qJ$>)*i@`= zzk%+2(xEYrVFKvjjh<2z$51>)Rju$bs@~TJ2F2*d`)=hSR*V`mWI`rnUXrlYQ~Hy# z_{Ln+D~UV%u2(ut{_q!x1L4kaD`(mgwyRXU`1T&^X9ZtKF+g_q!$@(>e`m(O=|Tnk z+-lw(Wa|L|Hfsj@96^rd*3SlNlO@EHHTb229qOW68mjg2jFf3kbiTx*;nqiF!<*Km2M=Y6Bj@{ zje1}O#o3G`dzeeCl;mxNQvI6j-J`BQW9N?DH7txo`$JuJS#Z|2 z`?yzQ=9)n9(U}78j(ER2f1EvGXi8WKzqr{9_F*&G%X147p$!=;eSKSgqS3V zAXGvtLf9rj4r_kG5zHP(yoV>$Vxt=Uv5YDjEPx?fN_{w^e@}4VV~?L9VF$RdD$B^H zzq#U9MEVZN|Cv zH@f;ka;3+mqZ<1f$|cEG4@dWN?S()na%A-78JVxk+l1Cm3KsEmIAMot#23#W^!1bJ z>!on5PRfS$9R(zof~gA3r?FQ2PI4m^UO$)CB>$2)lYf;sd-+G=EHEb=H7#v>?V9b4 zr1vW{vv?aRtXKM(pnVpf@cc|aa@F-loVQuNP7i{bQKRTNg7m4L^>MQ(Og&dNpcAVZ%b(9w#J$?=Bl90o$FiCg87+H zdRIke31>Tm_Hfc(l9KBaf#qJy0Xe7p#q)cXqj}ScQjg;mof9!70fbZ0|57lfzbIJV z9|~p|W8Lc@Xt1Nk#|Wcw-nd|cIWY03jo<*GZkK3FqKN-THSDF%>7~?i+YGNy0Gav% zQ*)Vg*p*IohQ}}H$Sz-&5xT3E+uz4eiG;&k*4BpdlS(#{A#TG&r>!8P*LUQE-@2++ z3i;!+2%LxbQO5lOk;#OW*`}Y{^vn2+R~aI5Ow+K#wfbcU(oQd*PR80A*29lh1B#Aa zp~0Nw&hGQfpT`!pI`;&=<3_X{3TuQKa0T{hs?etjY@I%^&xZX*N@hX9Q}I z)({=0Nt^I3Ggivjc7{bcN5q+}Km)g8$=v}1^$T%) z7v$$@pKEsr@roSgqmyk&q}1Mkfqle~cI}6cJ=7B6a@5J2dcUM}Dx#C5Sj#i@9OG~v zchr%0O#8VZi;_ZMVmx#W`mctWSkC++?AGJ^Gn1^yBWB#Vl9XQ;qq^xzBh0}Q*()CQ zPk~HFdO!Lfq>f_5CzI|!{esoj5!=*ifyeYsq9!#wRO| zoU{D47tB5n)YH~9!Iy*pE(MGlIN=)H7AFNu^Vf*jc2D;7{s9}myKIE1Q8pUt=FdCzW!~{SQ`Zzesq>ua*@|hX*7bTWxO2QEvnH z>(6YqTsn7hVz{m4P~@ttsXL*bx?7KFgwz%(Wtl$TZx|gN&DNLe>1@S`wUd>S`Sf=w z8RAtK##tY?dS~O=9xo4YrL7viUBlkTQ@hs`wRz$;d*%tOT6jzWcW4hCTDyVQZ2ao? zI3Oc%n6AhCtX-z_ELvu@2Tb(9z-ptCd>;$ZFH{8L#5;jLXtTF%^#DmfA^fLG64HSF zH#%_I>&tKVcaf(_xBu?0_g`ypTBr$r=gX-qh#`E_67AZ;Be-hnU>A5pvBJ+ z`>Vv?#=P89yt*n|<{xe9RFtTeZ}{m6P777&sF;?k4V`!b#UFj35aY;K#?ttvrt)M^ z!&QdXEH5vCjt5o{b;&D}#u2r`-o*i`$xXS3&f^mAl@_=sFw<(DN+I16yxV{q%hJ(8ext$l?~x^+D9G1bh>O}u$Y0gGM$oA6!i z8RaVD;KBRPFmve{0e`vyYhC`-xHc0}rs=>}!U8K=f}ed&U8sJk)U&OF!5g0LJ0A)Q z(_0)2L<=IofgTz>do*p9zq)VXAy-x2ba8k0NZfqG`*(Ax`MH;_7z${whApwLI@uDG zTuDjH|9xF9OoKh(L?%7#NRqKaN>8<#a8({6<8Oy4lR$o!i$D!T*8SboazjB=igcPy z3(6d;v;=jut;@1YM@4K_1&XmpR;+o;4zAqAHRMk_;!nR1X|_9lcZqaRegYbAoxW+$ z<)&}Y z{^vw>d0(kaRn)Y8{PS8sc&ul^N14~Dq~3&Dqj;Is-c>bK;_uo=+2$6%mauea!3Wg& z>8$<(HUoqQwQ)K49_X$CH7^S}e3muO>kIQ=U2xgqUTZEioRT#}ZSt5k%WzqyaB0PV pws)+dI84LQHg@Xv};D2RlJuU@@Ek&zZxdG+c|@~c;`SK(oy?}VNzXTN$y z{z^t%M9m}fxWiwbNW1kG;_AM^-+hqFf|zBF`HpDd_|to{GyP1AX@wc>yxfiUT1thR z=bE>vB9Vr6T%%Viy^DF<&+m zI3D!+P2T9`n?ZfU{TBBQC0vx2) zH85vbHu%lRv4^J1V3~#47ZbCRc(M*gg>OPACT&$1vDR#I^kp}6&XQ`Muxjr9oP z+}aSXlNG-d*7Zl8@CHAtn!MfNICsP2I=|uY(^OF*WVwv24S$xV zYu?>M&@SS#O*8vx(L4*XlV|{$Djxf741N)xeZjS!7zsJiXX=__Z4%?W^cZ1J6kYe4Ubkhimgs|pvTNv5(+{RtE<;Np`eJTSb?13ZW&JkrfsME)qsoh|~;j1qjX7bP_Ssw*8hf49D+1|pr z9L%O3_R^P$Z&bQZy8~_;8EGfmV9k~hQ2K|a2i=s<&2bu8rQlcrsPNJu3&YJFXC8a!%L|bB^hY9 z$5Q>fsx#P?Du#)_zmC|C=G$4RCT(3v>8W|tTq~o{j~D2wCw!TqlRFwsTQq)CPDwB9 zi^CIUu{KBfa<|Fqk>BF_^(Zw+{&OuigSF)&Idys1Dxi)>D>}N8JWuX6p(i=3ik^0) zXo=SW39*U1=1QMU(6Hh0L3`=edYH6NqawhvL0{NSrb4Njts>_dLAirtJ*>8{rCxE- z%Tr6L5^*?LT_b08dF0Z<*0XY?U2w6mKa>Wnw1y{yx^iXk!^R3_?^wjj#Eik4NVTHS zPU{W6KqBea5>Iv&s zxct;3t{FEnPVC60bTB7X7YL}rJPI*eQkyR9LJp_C)s$zhdwgH4zs0X5<$v?z3TxAq zp3zbMb9TCF$kU?ZBI}{uuYm2lA=BqWNFc&+{$U(3|Av^Ar_Y=RF&o2+D)9JrvS7Dk zYHzUBxZ7qvR-Xf`J;3){4CG%iYe7W{1~xH`>>)tXoA>QKd`oBG7CGB4k4C{J8N^j> z2;(bPq(;UBQW>XPcj?!m5iSLD90n${8pPX&Ph*?UGU$ETVqwFJvrJ(k$K$Hfw>3BU zC-t9`(_#k_GE9`uzod50*bZDVDbT9R?YZTkIa2GXgt%#g+)TaXTx{fmLXppNXp$T<@b`4sTI({u##L##-US@m(a_VN%4OVms{Uys>_mE0~awP$Lg42nf2U% z_@?%W`-8gUGieOy;bJs}t@>>NDt9-Yw)+4z_o$c+1X$_6!-G z&ttVFv!DljyUppRvFksxVeo$JVI>SGaS)Y{lXciwb3-2mEI`e3{!Jg^{TSkzocE^_ zTatY~o%mS%52xk1!j{)*Jv#HKk_shB8(-@Ty1fvF(saC zyNNiLU$6sW6o^9-{C{Q~wi|~`L{`PE#ZxM~r-)l-%gDc76a@~g4jr48Obqc7yAL_- znz?GOt1uOz>D935S)+KLK*;mzj=R62fr&=N_E7cFU>W+=!guHtC17KWCr78oavzUU zH_QR@e0u6I*Qinh0ZZl(?WF>D^w7ik9>blZoJQo&AGs%i!=`Z_!K-nQ7Wt#Shp)}oQ#dT^-tp_i z&%@#IqffKt>~31w;x-Z}%$~@adWJaj!yfJ^s7lPB%$$gqS-uD8~#kH zN7DLj{~6v+p?@-8HJQq+WH-A`0478`l%GKCL}va#U$cVxfinhiwfDxE*dojL`q*!N z2)Ce5rWuaoNDuXb4Gg)EZn$1uwdYAPcTX$#@lr?^EYXpc5BZH4(7$z}=U|3Em2~a# z{g5+*NZ1_zVaC&Qb}>T7De`^#*M^p19BP|jDM+ncjZUJcuGK`MVV+go;NWa{_v8^} zws~uBLPRHu?e=84_pt{vMW&j{5f5v#KU-~aMaHdWJffvq`%pFgHAf`TxY+t zwI?b5fC}hXUxR-Y5@R8u#C*%m@K*#AezEqyT1=`C?8QHQx8L8~v@V-Y1O${|Q+(9W zK(aR;eJ4~u#NR&xOBp=aP83J-Jb=Kxu&&PUxXbK^eRdjU4DfMU)Z~Gub*A>bKar=L z$&+5KR43*n<|k~CqYO>}gf~RX_)-IO2>HbJ;G66mV^44m=l4F;ZC4AHfm0T<@wW}w zv88c9z@Pih7~FlbVkl`uXxrV#tm68fpV^!RR@#zw|Kz7k8LVXbEo&!cGl$<+-;>#J zJHtNH2FIsexSK@a#VUv8O;@X3e(Lyi0_T=fyOj6@R~}URB-r%%4S5p}HU+9opU3Eu z&XD+IgpUP2zp|@&)?gUE#m_<8@&o*`ah!bs1_aIE(c|8`%O zG9LcE>f6i>D{q9gQ-@S^lShI|wOXa2-6tQf{`B6VzzpMHHDz*|t0NhttweO~=?8VC zXGTXmZ3fQQT__rjGBA=#Nrot2Z8=uyHP1J-2)wZ6e$g>Z5Yr{_8Vy~!@)73%g{+-% zdpZOT0TBh@)V@>CjB z+!T?C%B$b@>kz#L>DZl8!aRYb6jY&yke* zzH!|h+4&2F568CMxt6Tgy63n#wzdFy-4cVhOyd0TYRVWxTY_G;!>M_6LaKnF_Va9< zM9)rI7ltEpVs93p!}@vM2A-LG!d9P=)16V9`>i=Eu5(#VISdEn+g-JNt^A&Qw7^Y8 z@?f)&XK|XTw?mF8zY7Cd+ljVqERjCSrE#~>H|lu1aNq^OsBVR3N57ouZylUXrdBGf zBQ#t$f|0yG0#n&?Iw&WUB`>S2XA^z2NacRY*%iLYv;$Pth}KEiG$+56RvdL_h7#xe+|rI5vlF2>y(M+%Tr1ln3&ol~q+ zEqoQ)ZC2efXu4Y5&YRSXZn>};6AFrx0N7>Wp~2zU8!2pBP<%oO-9#3ptSGOkcP^Yy zUOl40A`s=MIkLt+9rW_Ni=!%=h($h393^m#_ z-aul&ZN(@_^^#E2EGS{L>8c@|tVQTgq=Pq98c_63hq@8|PvM1)omCuVygMxr*iEiz zcrw&p*wh7=c)``zquT6tkfH_Gp1Z}N2yV>f?A3{uuq{F6tR4R*Y=$>@UW8~!UlFcL z?BOFq{id-QynBj^D$hjZf}3%0knVBL>>u8%dQcXBtZOhLq?Vp$(u{D%q10tY`=i;l zxG`k#(<)2(`*D7@d68^m%49eLA?=~@fSf8v$UAv_;^eBs4$Hg_Sxu4hW)m91 zhhVnnj^gf-vA0PK5ZwylPEi%L?7{C!u%dWiHCl^w%8oxF!Xt3u;Zqa`=d%;dE&pw2 zbCVnv78dz7RHrNFrRO4s;e57Z?h}0AqF|C4@)eOulJqBNp7hwNslRE;z-|CK=G?^z#7I*Z|DnaM58(PIZ$+1UdWJH7Nw zkx$0(Fu2A-5T>2A=aDqY|9Lku@SK~M1UM_7Cz{(BCb9l zIW8lz%=+c+bt4iF-gn+QPjmXin%w~4^~ zdoUIw3q1Vcj;z?JV;Gqa8b5?~1c`MJgm$R^Qjz(K&eYsi*XNB-=UuPMU}bGtN0=y~ zqeOzx5if30EO~qpI|M62NO%7EHg9-2pztKQkhq-!MWIrBnms|^0aur~6h7X{VA3r{ z)EL7Vr3qBaN;&^ptO@;h4tO8emKm}fDWBw#W5|gU`AxPkg1e>OVZxjCMcJ64&b-slP3fXMz%|5-Fx_WMlK1LEe zpjeaNge{~**C`gBVt2v(KlcOrmWJtRlDg9WJ8q5zr-@xXY-IhF7<5d0erMQE>C$n+ z9K|ge3XuH!83VQzjLyOk#MaU}6{|2tQ8H6$Ofi@BJBEK7fFCJ4hRBbHjAO>2=z7^@ z(#(O$e)o)RmyR5p_)i~=Y3bD&%nDuGb%CYg1uw+RrKj7OTKIVEFyb`-M9q7_JI^~x z@w*{tS}s&U)Cpx}=ZJ;Mzk%fp*1{E%!#d#pUO-`)6#s2BOg#JFBSG#I!kFB+6bqgdu{m>Ng+8GddTI|N!b8J! z=lNd{NHu?I_wxX$!_pdj1ke~jM`B4Yf2aWBHng6lv;*082Up1_c_7$kU-*|$Ahl!@ z=TxXU+{^ZY&|&`>uQ;7-%KfJbSgX)r3IYa2WbgEvR&ogigoakckOLSp9Gp61Y8KZK5v_%l#2=Ob zU4wf9NoK-jS3!5Ovqf#T8wAX&{%q?T(2ld^VvjlpB4&vHlm@fL=8F+ z`$nZ_ZLg#&K|^xWapw?G%xEh|byU#Cpv>ujhC@x)=$jmNr8o-Qv2FPE*siB`=nmH& zR`+yXv!g$iL@^uI-z{rnIdkcvFEs1slT9hvS!xVvGG&&SBe~fKY!q1b$%VA{AMQKD zP*>#Svg#psgadKy4;@=emHpla=4-l;@bGVhN`m;Cf&7O05KlspAe9@#y4s?B+bX}~ zo%Uz6ZFDSDy4lNik1XHtS6o}WK3PUZ9XKgZTGm^8I=!!NhHT^O*KVoJ+dOG zhfbaopPnVrVdBGsi;)f0V1Vdx9RLYpyM}hRnDD`0_{$j-FnM|{H8{QO?7un3+z>(E zA21N+b2XZZpkS{ZOS^~uJ4aqP8qUeco!Ufb;!Qr_vg8Y*W=WNd%lRJnzA`sefB#M_ zA^NT7-(b)7KVXkBUCSh};Qs>ls{c>0XSGUM|9=O2C{3ULA7JmMCd)q(P3bU4r`+NJ zWK9ryV$1TGt0Bbc=0{ykZE^=nvBpd=&JxLL`wRZspBXvv+iARvlUio$nB$ZoG@kEbpYd@wlm=UQ(1!LgxtySf_ zafFDqX4K%vV3Y71&E{*o`(#(1Q=!417P;08Z=SWTKH0_4~dunxBk^*ynWuuB#$Tkfcn=*uB&!-z^PZ^ws zR9-nz?ToQkGO#o0)C%UHpGeISdpGjnu)!LCE161mq`8mG$jNmy$mMp`q&?9%u|PP! zvO@Z`;UQmP1Q)AJLv=3V_)X=yKk}dTjn0J;!&g(HD+-f$r6&5B`Xc|t<#T&R>_9E3 z7;$zS0lCORqc&yuM2Ku#zPTU_i`pPY-u`v@jvgWMwlU!OJ6wdMy1Xx<^%r9BA$;-BaJw}25Y#L9W~QCKr3e+c`t4mY*BnqX5S|( zncyzu3HT~o^YJu?E*&twN7phi6l0#zUliMS^-klZi3=_cW?ij~-AFcjzOc4;VZewi ze&|=G(JCSlNxLH0BFWZL~F~EXD<3` z?c0sUMAe>ow!i8zJ{TetLe%W?!rJjyv;Ssp9f=Aq)D=n4jh0(cB_c&us4tWV<7(?Y zwcE{_wpg-~4lE3Vb#c4uT}(+}vKWs{J;&yj8MfMNWsVxLh{mz2hj4>$apI-YVMv^;OBi4|v3H<8w86j6}g3Pc@CXC4r z(ecUw({`Fd-h-m;ABQ~Uj(dl3hr7R_zKnzxES7mIq@Ssgk1XsGf49;GE%x(C%?FIt zYVsZ##rS+ob%eLcKT;47Fs=^rZ5pQ~mixrtH^xLIbfDLpC0fa!rPLzKsTYrd#06vR zB8Qx+ier4#4+J{O_7Ps>fXn*UkD}nRT@h^LvLDK4A^+3#d{zYFS|DZ4b+SNY^(=Cc416oUm!8UJ zSfs-f9ndW2JxR9B4zG6Ntz=qTHXMq_Pe1BGuD`Q+t2F#fLw=1LsK;oF>u8oXee$@( zS*d3%Dskc9PQz6yR^He&#G=gkYv;>hpV4nu45hk9$x-pm-&GgXs97z8F(Awy8LEb7 zEU|}v*~;4-n_F(E6w0tn`Leqew4Iio{w@tu`IT04K(7EtWQi8G<&H zYo)pRspqE$V;(JzTaaq(XW5dolzD1>b7ywuS+1cMEJ}Z+J-XE9iIiOa9w`&V(jTb> zpOJ}_@y<=bjp@q;q`UqFlNzd(!BDBZm^)p}a&{yfd=t;$!MOb2IML-h}z zkbC!&sOU<*Z-*XY5 z7KYBP(l?nvN3p-Y`>n`oD+I`^^e|PEq8R zS3%Vu0|0lwt1vI7+5XN@B}|beg-;7ztbV}m3Kt_ghsd;1$zHZGW)V>C8{?t5*kW3) zvdOE_Q&=@xq4ca4#|V^4%Ln7Dh!^`Y+34oc5sVl6v?PVRP4>vtUoRgKEZiP|@Y&dh z8+#MrlgQerIF~II!uyeJvg|dl`1*~yskhb!&a8JIJ`El`MU%r*vVTdD4KV+fg|viC z)ze&2(C~v!u1BTCFCC%a0LOx4?hmxWj(>N+_=AQiSgB{4ro$S%JAnyGX<#F$)(ak< zI#Ku!wyL)M=`8j8Z!ZAHBZDUVmKMP>w%ja&R5~XyT@A1K(5L-*$2}jCCT=j_m7DKp zjHZDa$)*Rwi}S*D$`-oJAVRukFFxE;Vcx$)2%FJgRR*ZfVSdYoUu+{YuL(L1T!d?v zlcV9gnY^S<)P%C*BD!b%AuaXjLWGXo9*k6iXPFl45sakgOUKC_1qjCP%avjjHHJV7 zPCTgy$t@Y2vIdtvW)M{|Tm&@BXURSpdDJ4ImL+mxVI!_Syf{!JX(`4P2bL?l5$+Xh z)BTVlGlZt9jSear5XVjF)n7Bu+bq~r z38&4R^>azMLT4RN6)yxWwZq&hF@wZ@aU~~UMUF>yX}`^9z-|Mopup&HP;gO$COt0G z;B7Ix#qPtl&NE6b5(jP63Q^%(vOJPkC!pFw5OF`Y{u zTS&az6+CPZk8cCbNMICV08(1oD=TXzAhVsES#i9p!6RK~bBHiR#YSN@&+*392GU-x zyB2u+U(zHAB~6-I_j@dk9`wEqiM}J&OQDKb&Zk^kS^Eb~$nQ{_gy!a}O`Jvmf=<6_ zwc&h1!qrF@A*NLPaDJTwdw3tW965$#mi7nhu)be)1vyGnCEQSq7Ho>xppwQH&aHaqO+MjRdDpIRS&aMPRb{#P zE=O;TpwtXFTFuKQuP1GOLDFPU&3Ouy&#JU)?A9|0hVS=NwIQGVp=bA+=G) zohDx~5nZ73PdTBb^RS{2v8>Yax!IUD(1QZw$jteuAd}$>en!GCwEuht-`gJ)56Dr4 z^5o77S&<=-tJ`ND@;?>on?DsQE%9ni>6hDiIvVIcbNN3-D_wK(zf33S?>bt1ykM*( zs=p_#)eWIZT>c6+vvV@CQKRe2sBHQ(7jE)|YY|(~zXh_`dwLUm1kQZnyfqS$0$=2( zZbf-L64;ptx?q-&Ng-UBHJ*X#_hGr|GWbkHivQHkQh+;tA7zXry-(w#y|k8hg*9!{`gfTc~=RmEc2&di;(gif0Nzyo`dklEy>k2rF|9F!1BG@X z$N=|jQEMGc;blc6^>BzKqpM~$YD1y6RJCQbIrG1trd!|W=5r4J75+gjk1PN-P3yf$ z7$Qv$c~tHDe|SZ&igfOOkAEwQ5}avzSzWD>x8j|h?94&$#H9WQqXZXUBh|g<7ElE8 zFMQb7g>`Hl%UNCLiy{zOVw?UC^|{bwUrx_Mc2hJm=kX=a68mT5LhIEUZ)7cqsnIjU zWJXM&$A+JsyVy2V>^-B54^x;k<3vrLxl#ZFaR1J&7{T++UqmUXUVy8KAuwSu>sX;d zpfH47MGSGwNK}i(6Fv`J5^(Up&#)IIgrX(X(9wkOO)c?$kf4^b2g)Of6r7&tH(02k zMqWWu7E~y85&uPO($2G6HFUb(A*`!Nqe$##t;v{jkp!aXH3G|uV!x*#mdnHn|Dq)M zj;`K?-AQ+c-=(>DO{)KX%}3ni?^`EGk`c9y20R1*bmc2C1fWLi!R93kQ4 zXLrO7+luoHpY*>MjW=3W@$LmZ&6Ek`$nQ?q+o;wfhT?A$wCMfUD*m^JwEvHV_cvz> z{6+A0XVH0~Gr#h`b}|@|W_a*fO9C~$NzF$|<`5{vT#$$gHVKhqB>%ueY z+Ug{{A+lC8X!lJk@~v4`qJLcVBoSn-$Wa-5I%-=>tx!nD?055b$bA`G?84HR>??^f z{xFMN(*p?n9~YO-)3UGIjGXL>%8;MUAb0}gW_DZL0U(L5(PrhdzIV!H|khjOG z=_4)nw;kb2%q-rT;ZVbtqh)UWB?w&Ce@Js`0`>>u53AZNmXSRi$YlkEt=kxZGFmyI zHVEMt4kmEqf}hK5ZR6DTAKK%GmhCN6d8WzPKHj+5(P^_BnuOZ#?*FUeWo*3*Ye`0n zz84QC;McpYQRMB5Kj*KLbn|zlV%}F0!JLNm83w?=Tvc_!>crXdb|ZH5sr%O|f0>dV z$Dp-U?b;{xvM)K{A`e{%-d6wvT1}hHEhP8{V;4sEMWOfQ9EQkFmO}6Ktltfni*Fa!@JUzYx-ccfU8D&% zXrM4c1rnIkg9B>1I$coaC+wxrH`x`ViES(EPt>!${&JzqhMVG8|78gPn6tX4dh_wr z#d)Ob6}GNtn0~OU5KXhX6;iV5_nY?WaKyR|riPpj6#b3ufw|{}AO1AN6pYDGD1n~8 zm{kt%20L~Zrj)8 zqkB*FjAEXb7Gg@1Xm7DmmH^9LpGsw3>jDLmTZik%8GXO|rPvddEPMmQ9y8Ex+art4 z)A@BHnu>sHz3t|;as3zx_Osa#QE_Th@i2G&N@iL?9o!;06 z@Oh!$pC8uX-b)WydSEi_VY52!&GZr|} zuif>?wXf6I*LNB5={+tS1ifJxw-nZIEPFscq--hnXv>2Ws{E&128{5@XT#tayRdZ# z&!MIIMf`*mzgNHUGeWcGR)&__Nybm!~ zYbPStGQ02w?--aq$DlvntjbAI7eNZ$7BX|nEvq~GGSK)CgAj^&YJ{F9U%}8a_CvsJ znTCJjx6~XRs(fC>o&ekE^2Hc=icfhAf8#mh9)7#Pu@1qy+;Q@T-xIBAN2lUQRT6_K z_&M|JYV7vu!vqAh_+oytfuIYoe1PVlj4rY}j|~tMJhxW;u&)H&ofJ-MG7RK~wCN%3 z(J7q7y!JlM(&H;%(%^kMz*4wX(4svcfOFN1}n#s#bX0rZd6Z}DT57WH{V=; z>9M_AGoat4zF#=_!MSsSd*e3I^x5ix&SWL~LMX8*ccf(v&H2>7?)og)_kSq{@f+&O zn=pq@HRtf-4Yv$eG%P;`t9(Z6yikB+o}6vXMJ~Kh6j8rD*rFy>S`8qx@O)L8R?KC7bxFdPMous5R8 zI%7`Wc7)0^E?M?0XtQ4325gcj{*;!S(>P%Tq~cFn6&qfD_Ly<;pj5uKYS7ojKJT2j3I?v#9<3It`wQ zEImn%9(^)*vz%WtfY6kd`!_QA%s-I!*~b2KfeHzFN_LcB!tI*?B_@|-#EY?G$1=8T zAqL|qUHMBgF%9g3B+ zeIC6KKsdiA$y8uyBmOwMc}84_Ca>i@a#wx-usn zZ&-sKWv5q5+5soHcWygRhl6n#HA^MI3+@C`g=Mak3{4xFH}^yC5Kb+toOe7Mfon?b zls}qpxE+3v3K9=fjp#jW*g#V;{8*+eDJpHux)#2iYLlaP4Qkq%MIHvVhE&@D70{%_ zG}`eqtSD#BRc?bz+E0Gr4q(|UwKcjqnZaQJ{F~sm^&7tIxnH>j(d8QqFst9GK$|iQ zV)xHXQ$xeKOCHO&Yd_MCXpqWP)nMCDKzvY&CiYX(ONcXI5M%XYwHvm=gGCl+>N_H# zgH6gas^bo}%pB}V=D0cUIrE26t(Ve|ZW^;{^A10MtUjbHO{wm0?cF^LXSi3*UDDLd z3n4jndUob~=yRpoH{VE6g$7Yy03B&5gC=XL+>14IvNPlMi+fEJ?!9%U2#G|B)9qQC z`1oWD=~HAe0AJA%l1#&1r}CEt=IPD_Pb3<1=PmOa0?PQIRibDQXn={XyM`St=OX-p z^{T~#cTGOB$&axP;GCVeb}cdYoU{FtgRHQ8U|Yf7Nih$9TF-Hg_h)NdU$5 zQ(`osUG7ZE(9)T86Dh~^h<%gq{*}*_zi9@8CpAbCHnj4)4oOx43yK^SncG_{{$p5CGbKeRsv*d@zTSxgkDv^fQeW{Y z8FdEFpC(6ot2tR9u{JRtIfUb_{6gp8hl^Zce?>P66;zcbL}!HEWpo zkir4Ure>>~<7kJ(AN#N7P>*QV2wR&Lh3aNsG&$`MWUJuWO*FDE&7RJf{JU5z7MZ$& z9_8-+dhUCN%&19IljGrUGJao~G)9JxbeoKmNTI}-RJ^z@L&crPkVBbyeR8Z!witj|$k zoddG=w(t&!zGSGrD4Ogko@BGKF{K5`z#UtC95D56H{y$ z`P3%~o^4!kP1p%^zige8QQTaXWKqouX*1tb2I01SJ5Nwt<-P-}w`aRv;aojDIK|9e zt^jAxXw2lMr%BE#Wl+8w=3v*q%PJLp@?MuAdqy=B=WpVJ4UIFlD%iR1w<}S5o2wEQ zVDq8FUNuO*D!roQHqF9rGohkKST!t*PS(;3r)<6F#SctU+iJ1F&&U=x-OPL)FtOc`0jT3R`m zX;Nnbu()e`3WBx+8l2C72h`5lGGgX)j=LbGt$2e6@BaZf7zV+ zkQAQUJXo$z`Uc(a*Cp1NaYO%@FjfPh6}a-p&d}IF|F1Ep8tuKpYyptoN;0EsY6LlG zrIL5enx;x1=CMo2y!IV0hfvY*lf9C42!7JdG+qNRfn>kq>=l3_c;jvUaS|?P+r~p> zZ7l0OLyOXy+b#D`3%(Owcl_T%j8|U%Lbuygm+W+8pe)$UK5o^f3IW)Zr48WV!GY>z zW|x;=`gEr=ttX>j6#vp?Q)Jd9Pw>K*ldEfMkkH0}H}}S%<0Gc9;1!+FP6n=!#Na2+ zQ?%z-WH;ZY9QPu9@SrV)vN_4p;;3lyS;ka7wQ%ueRyS*S_C(n3v6Din3tjq+(l@0w zZ`C{ky{1op)B^9{Y)vJuv)i$WI5{;;>C9b+M zdL%s$-*4vJmiT*#us4eo20A?(Pma+~^P0m#X$M zfzQDYj@52w3%VjML%Xg#2xZSeA3mI#}jh* z%P<(1|G?-h&$z(HIDueB`xFoWR%e>HP{Bxkx8=srkCS~G~A|wL^D?6lgn4F@uA-YUCbteq>94Yd_|<()EeMV~kTJGv^-2 z8~0P8H##~hMaq9nd*b2bB(4Buc+jpz^qSdnAguLn z|A8!*=H|${ld8*>gagJ}M9PwAQUViqK8LJb^DCjc-$s6hEbSavl^X zF_GBgLC)vrug2X2$m)*zNP@~<7hR_0d3t154s7$mm z9DB5-FjULBCLXhwa>78S5q1QA9_a7_agv}SuE5uMM29Ej9USvHdD!!|e8qdkwj37yEBK-^m zUak~hki^^f$3a*wuYP>`GflXx@P65^@x(2lQ}Rt!E=!81yI7G=k9OYlPSG7eNs*&_ zfI+$pAtzu_rCQ_DdOAe)KH$2H6R%^2xo6%yZ!|*|<#w#PCDSCJVe#$!Nt55zr@J<% zMe>Az@W*HeSdhU<1~l`{9P;uV7fKyy(YGW=ph;Y!vrWrL>3~MXsn80>c2q8T-O5}A zKJuQgCknvKnnQd&V!PrER-I6d`BtsC?*+i#o_GNoAie$9@9nSix;1STg5gSms!Fqf z&O~7mxOZ}Y4o4zjc#EdVzMe0{FcP9!Gcyg7gIptYW7e(-W&2fzFveNc`Pl>}uSWAe z>Cg$@L42mM+IRSQaX(=+-lwHoJq}5{2a(_xILm#u+Lxa~gMM-?A9adWZh|xkH{^~*-<_@WUm%|!K>Re-`sqVugmtr>08+oOf&s0O^hlTF>+v~WpoAc{zJp&t+syHOmgN|6TU{rPJw$754I+_?2sNpQpjRd! z)6Fg;)u1aDkb#&(Fe3XG8KUB$wfNmL^g7~HnA;2kG$XOqyor{nwvVv_&Q@jbq%=4w z>&L{C>_AsN!Zqjub`c+~WUZRwVoIf1hKV$6F8Aqu~Q~XJe@K78LbOeL^lrsV@}z5$&whDIb$)5^!{&JQb@Q)pg#CL@eAxjVdE z$3zYNYQzy>{$R-Bt${dVMa?Lst$o_nk*Jm9f0qe@?rrh)eCwUZprzWh8Wk= zQ*_7Mq~QkM5zKE%&h_t$)m`KyeVUbAyV$zy!co+jWAeApWclNr#*RyU*&=)1>fIeA ztZ#TBc|Pqb9q>1R2tHp<%Cz5hMQ`T36eZp<^j57Xpglq+{JC&q*xA|dGP)o{y-zQG zyCFw3IRiqQB?w{xChUOAoR?Qcet?n9jQ%{STI& z7#_yC4X(b%W_I;l-fau>GvYn0XPMD4q9w6oK&nXPp9g~0L(AJk1G?_tI$YH>`jD1a zvq>D2Dha-TE+3!g7)i=J)Az5B3dEVJ3mDPE4?PwwZj zjr<+cS4z*ZFJJreqQPf?$Bif5cCIH@zGwD}Ux2^809horg|3gM(XXEOtIC$@#$ca! z#$JfxIf)GaEL!-~KiBjFV{$t$28aq%hP%5(kdcw`Pth9uy5jmjz~64YaneI|cF%!e zN8V4M)|MZ&1x#U~5&P%-B_MkY&YkgSfxO8uTl7dddHHWWSkP16I8a38Y`jXTat*4eUn<<+LxvSqE1$+aMx`fJk`)x-KQ^YsN3mxntFYn3k6pqTe^pN3?8?SvH zpUwiNAZmm0x1D9jCQ;9_r>aeBPblZzPnG-0(7D?-2^5Fc;{4EIoPe)(+hsa95W24;1 zmYx-#ilLU)k*16Fv0F#tu0Ev+ANmD3&^q|-T(j^mO%}xb-Wn`y=zwiOuR0MxNlyzI z##o_r0f|Xd$Vc|2L=i1Ek)_d83*@|*$YEqSMmM=VUG-0#w_25#o0S?`?S)H&skXtZ zO``@R>iose9W)j1PwW!bC(uaw-8C-MF9gzPIkalvs%m|Y7d__Qi^n0JEehMHjL`Fr zUmg@g#j?SnQ^Nh@UCa5Et}&?1GEOl?YG>2L8FcoF z23)dc2!*70OCj-=U3NXGjLCALUY`?7vRWL=JN;blNR8WfXjDFz%0I)bHE@4i2Ga={ zSoJ?}rF8tc#^LnW={YaWJ2MB%H=5sE*+S0y&Ff>q`4GS>$6g?w$q=}c>GN!gED7gh zwbkIARjIVdxv>&WJ2*7-+ubK!jUMD zuCgMmU5y)q*HG8_c8ACjcb%f#vqzK~%Iy?=r1t$Y_g>bo3VwLJkQ$QdVMtV!n!WY& zQmVTK4mn~Th2w?8dDhG+)zti2UZ(eUC@}{$Wmb%q&drA7G(PM5EV{y!aj$bC7u9>1 z!SB!rNl4wc6=xLSXG6pN8zpNIR9P!luB`C}4D~rQkyZ3!{ob`7w0mFv!bNt8$~khT zT>!mPCF8a^Q+}YQX_pX%a{_Wqe-1?%8aoRIcSbM3OwgS9(9qHH?*lobyVfo6&R*lO z9A_$ix4gzuAG-bj2z$ry$kuLcbfsh4ww;dAv2EM7lTOF!*tTt}W83W5sMz_c*SpvI z?){y8&bhAolhmx5bB^a3qwag)o{QT;hn|+x37-BB8ixW?%aqGCt{)vH?Sn@Y>-V0w zh87f52VT2_!m|tVb$!dhJ>Z?_V&(TUV1IzN>}#m!(K(_9?kBmQ9e3wDIREqSoVwFj zkappR+dux5nHM&ORct3|y5cEiA7vwYr4aj$-+zIoI!d2$f%OxNnT-`RZs1FiNm=C* z)aV*q*0y<1{0~_T+UJn|2%?B1cc_^#98stmyTYrEiZJ~u4Y}*|##qO38hzu;pVL|y z!`-*q2a^?=VCooKsA{SdeV3kS#A;w@itn8(K8TcB8n4{|`Ly6OA*@Gr4Ib|2E+O1ioydLpW5d}s)MH6K*N#sBk2@gM!lx&!dQKQw{;RXVxw!UEDBqPs#Ic_19`U{E^%p+CngQ;pwYOb8JA9Yrc zd)rM65ORJ$Kd*khQ;zaR23b;|I3wg7v75YVvNPW6=BA!f=5+S2O}x*a|2qD9a{bjW z-GA%X@j8#u>u}oC^H*};ig5CW+6n1S4Zk^JJIc1Gt|8pW?$pBS3(nUqnq+!9*|ye3 zm=7uiG(0x_=ut7!` z?Z-VnhL>_H7{ej?>jX;89`T9l`%U~hFZKGRcHLohr4h9^4N-f9D(;~7(GC1Y4*cGS zDGm#8yEzE`LGj;h#|w1-m~8;u1U<+9STWP3FbQV6{^7lHtHv`(Tb3vL+R!5g&i(Eb z!S9XzT6oFQ-vTX1;oim^zjI}H%3A&HAe+qv45QBbc^Hxk zqS;qv@|Ep_E3Y7?sq^P-kV~cq+5^58D>X@Zz(8}S16cQ8uL+Cw&$bIs(IYKJBX5|= znNdJr2qSx-OJWF{QmRvlxTe}zQ_psp8>K+&KsEL&%l_T*h4zec3~wyQiarHGIN`LG zu4SM+xyjUY>$i4jWP|?KT26pxEI53Q3X$H(3o}&ky=GbBCbItTgjszf*8^k%xVNA` zzpX)_N}@%u{p+h#=+fkvrbc2*9IBM~CU{PJ0XZ?Wc|I!g4#WLH4E;w`ZX3!WHu{^t zLb-ocgpBRn3O+k<`H$vlHOz1kY@LfW*V-%e=Gn9)!LH}@pR(_h-{nO)>|eWWLF%)!fZNQ|A*7Y~p- z7auO@pnIYcD5L+HpJz*y1)_fY51B~_#IxiC8@-bibwGW>q5WVe5?KRBv75c@yo zkhQd#R_Tl~xiiv>M6sCIQ@Egfku-MYE8`@ zr<8v-y^Y{Z8;~5M+rraB^>=Qc8AuoJ))H2!sMG9*1Ul z{|)6=J8STi;{24kK14lMt!fUV!8;n<2?+m12Oe^1m!v4n{L;gaQ{hnFjYWxW zh~2wVze)+DOXS?0s;Y-G^YsizApJn$riATaPgy` zAa+xWifvZ#x@;z%4r?W1HNWr{V_;K`XezYw*IVnF2 zm=!R3j-&unc<;a>eA6~~G0xE2@X;LB->qVxru&o1diB@^JjoFwJ`Lg8r@{>X->5x* z<^Kb=?}{EKol9;M0RaSXJ{{`+2et>H!Z6TCTgerT`}k-@d0K#Uf05>Nwwb`p!mQ%g zZ@g^+Lru;h+g0!jn6CEOVJf)V=^Cf+h15-d1FjAf51P-D_jb2$aUZ~3;1%2Nu7D8x z(!XL9U;Gc}1it!w&#T@qzWh(h`i9`0@aTo>mBMiz)*@dqIB~8KDGDdwmwbC${LeUdM5ta8mR>tXh5oGhhKs4h!MLyiV{bcGPFS zIo;p4velksS$gywE{wi8{qw)C?k{N~fT#%^^ zShORXymyGkVo{T6Wx!y7vADbC06fsG&$%G?9Ki!uqq5Df-&Ywl39B3T z=!Ug!1o0>j+G}5|%J0LRL{fOGmvd14p5_Rzw>#g=6M1^*k--%6Ekb&XvHpuFumUHD z0oXDwLY0tPKFpaflh>l63J_`EGYu`1?ux+~&R#vzBG3+;1=j^Rh ze!w1!{15^^+Zfj@X__s9^DGNWobqh%#h3I|nsN9wvp}q`O6zpeUlbD=va3*GPXHq@9VFM^-le(iw%N-D%6Z(c2AtecUl#0)5^> zJ6#4&d=t%~L^nu%w=#251LNA>eMFzUd#xY0;5o~bbkSw^{WbQw^ey|$f_`(oU&pi$U4;&rG>bOnx zn`lSx5*CcSKNB$$rsS5-nS+u-7x)5yE-%uft5lvWW#<~n>gc`^lEk9@LLU|TRzAe5 z3yvzSs>4)@UrpnZ8as9rn}G~0T`pVKdfWwAa`Bd*HOB31Gyta$g{s<( zvwQMN>qgpHLgTf=?}WrB{m0J(h!9&fKdTc<=&4Wd?@8%AbqQ=5C9GX2@o9k0H%i}&daK_cZ6osBe*x8BhyKjVd=gl&KTu zPU&0Yg8^2*c7Un(&RV%eYa%KxXlVpOl6_paUs9uGzjp()A+_DEuj?UQm+{@Y(+!nr z@r#KA3XPS;G_r1TDda>Bl3NJ~JPIIqDBH-}Yx&}>@2^m>&mf%;&I~mwUI*F^u8|Bd z`3YUBMIFCGALHlNb0PwsJNM}LUguB{N74DC#pXaj{ib)ROvoPUZ03vlKQZ7uT1~!;nP=ZVO_okLAS)r?l0atg2OH30RuF^9Co6n!I{#QM;0Y z^d$^<(@s6Rw-lelDWBhkJ1XZ}o0wmkNbpu)MfoFb(d^nrL>L7-sR|>;LcX!{n3(lp z&N95Yhd6xotuM-5pi7eH|53}Wg+Oe={Lat6UoqjIAjcgscp22RcU}yvILOAx0kFOk z%mSPOI5`kziI>v`LGLaKfATD85-`;{toB)zoI$K<6wq)DK+77a2vBgAfAS`m+^r(_ zU#fyihSDPM-PMbSRX4GR7JND90a2}V1lig}R-6332&ock18!g`SH;}~igDPD^Cq%Rv|S*D}}>@J6cUNBK* zT9K&XW_F-NbhRVKj7Ssu!F#E+jUK=X`dDk0wMR@5@~q?-qcXlK8}m!Szza{{o<|4n z057MuH@V7$S25|XHR^#W+Br2c(Bga53*$FWDg3}0o$#F}zOg*TrQ{C2>u587D4?{{ z=dwUgdKZ9&skAEFz6>2`a^<3dDj%hs9a!+7pX&wq zQWN}y`kVc0?x%Lw?mW*wYs^tzSt(asE0m3ODRy-(8RSlT6s~gti1uqX6~T?Xv{>9Y z=&)nL%4%PnK8jY~me^9m_`Qa z1pf8=ttlvSDINCkDyN|=8O0BA?F+VhpyC$SdYZ^j<+yw(e{5y8HqEFSjl-dtE_|Kp z&rIgB95f%FkIJSKoN$dQO+VO6<4cRib&D+f`n)Cmyy77TkdeXP{;#3-zjHp`B2uqX z!{`0!`kw_ZP>U8m1BwASJLX?8IFS4r1RG#M4zWq92ugw%Nlv8vc zuT4}1K}-o$l8Jk|Z;?_BuahQiC%$H?mSi>23d+Xl`mVO7H0iBJQpit1#DI(A$^ zv6FW+uWVW76pRW$vI^e?ELkZ<{J`&*lZJoGLNdicex$QK;d>=vK<4BL-H{_$k3|(o z>z2<7Odp>q4tpP#(567eRude8hXKkH7NGr4hN;bhvHWU7f|Gdd-gQBDPDf*$U!kzw;+wjKg@x&{aRFM zqMil5xOkb{5zEa6ge!Wn? zEkz$P%a%9h*}7iXPhq`i?)nvM@K7Qx!-r%3nRC>!Ycg)g;0IsS9G*}rshlugVy>t- zr^~vBk~a{ql`91l!e#XZ!}wcL_rx)n;aam4acDtiBsnVdMC}PKM&b1XsGOk*5xfc? zZ!6tOh945aNT1rrvS-vWn*fqdB(40isJ@rWqfI;N6G-vnI z;P`m<6nn)WjratkW#^9GP6>6@5O0!_((mF6MQB?%8 zBW7pKBpyk*2~t->*2DGOdIZXF;v;xow`w2idxq*JNLnIKf@=y;9Ox+hFh4uQS}Xe$ zN(@aX%}J=2>3r9)MBL(;+o9H{?KSD>_JN5wd8YX_&MGTA`%ji2x75;p;7rJ$U6E zPEO9SfB=yG_q?U6qaFtzDjEaf^A%ZnU_l7&y*_p|IlS?ED!XIf^COU7H=_B-rcp3D zhnk)vCe7y-LyWFe*PEvyu`7)XLxq*2IoCPBvl3X6!>CueB>p11QReoj?%@cNw5=Oa z#p_0We}l;ro%N^PLx##DQR|;Ut#dwLmf=5hWJJx-J z`nxL? zQ1mB+5y<0b{W{KvQIoeZUfqAcIJK8}{=cjLfD$Mb{v!b{mo`z8EZ)yTyFN#Ov}tm% z-sm5Jy;3a@cHdAlz6aQo!CnZ6`0%+JP+)E=*o6FZQ%G!w7? zkRNj2udLh&o3$sQ)OmV0>l6UiJI`&E{s_e69r}r|WstSRyR{J2Z8g!P@^d>sgBI%G;dRo_AGje`#w~!& zT%<>Z-{25rf0x(F4Iy=}L_XB{vFXDdC+ooN6wN&*IIMx#@NdwKtM>6GZ-^+xrT66aTNVM!z{qk^4Ch(y{cz zIgyC_8>YO1|B?W2AO623z!By939t%t7a~4Pp7#QyIGNJ)1k@aFAFW;fSji(!qQxL6 z@th0?<}6OLmK?a>KUzEd zZK7ZQ=?bLovaS2W?hAhoK)ARe@XCJ-N3vnBSSrQ;{5}ntVrLPE%xeUn#u@4CjLL|o#DzR2A_S+3NBs+Mp z2np+XZ^sft@RWLLP4|UC(;AV<^APZ?mFTirYsQ4$mVyW$YD(6zW)ZZ6m)DM)$u1*N zb|NvIAYH#^dE2ROw!7M^ZoY^oJ^QxP7MD-)J-Sc5KUQsX^=y|79pybcf~Rr;V5;2` zsR;7>;>zf%Ivd~~7m25SKzFUQ1*?+IHMh0?Y^DU|J7z3z0F_Q5$1ip8&)|;ayD?3C zv^=?{gBcXC%25v9w(==L0LRpy@s96%un;Z9mX?>3oVBIdt(RT-;4vLtclNHp+hshz zKYL--`PA`DU&G~Qur#s480=DpAW%S=QKnwX8ai9P{^(_byA8@i@R#qcuox2)v6Sk& zL~@?u#d>^}G+sL}r`J7ZDRU7jtHhbQIlj7?Q>G3{%#fhtz=BEv&B+r33-7!q8L|qz zeTi5Io#o6V+>q+Ow#Y9MjCZR&M z4?9W z>HVrae8*RXi};O3S{EP77k+2nel2VCE)l+af$EH>Zsvi-$?L8mP-!2PShLOfuLTH~ zP}DqOnij`~ylSOP)EZ&E91J21X`{IvS8jvj@TcxXBG`jW36r^in$pA#z1`>A;McAy zG;q9Z557u-Qhjzv7xq%l88A8-W$t97bAlU#+T|${#X9rn!^5|2RaF=v6AEB~q{nea zPE?eDqZ@satGts(NyPEcEz_;=F*72U^cHHP{8~sHQ)qAiIZstd9uxON_TBOzUAicHq57XohO^F=Vx6^g&$Fib&Oq+?!oSe+nCFMeWDu)FRl}P^;-ppx z#q8|>|E$=ZB(ec1$oQLOawaEC;T`TP*`<#?eL<*=8XW>DNv`C#YSp=#6-UzJHr@_6 z)e!37Nad4MMNXEAscgE~HmDO2dlh>%rfa%l+=_SOsAHe>U&ic9pAm+a)B6|DhuI79 zS_Gp=E>q~TNwF*F$Oj3QV~gdX)g=gDN#3&1rdw2Mwmtr3<;W3JoTQx#mD>JA7Bnep zmrkDc<~M-KSg86r8Zk>Ok(o)U#8JY{wFOOB=pL4yRcdnF{9W&3G2SL`D2W#m4?dtg91^Z@j8D%qu4)(7_N$1|xi zx`367`$VI75l~1QI#=OHCgO$}G#&*l{BeA7^sl-FZmf=_0aZa zJK<@w+RiwrNg$t)Fo`4!S-v#9;2}^c;-*VsbFxr|6Q?8>iYH6lV>Y!X4=4KiWtqv{ zi0PV)3S}=$!J33QbBgL2jlWGS^FwAS0oOc-<+F&Jorl+zQ+3+Cp3hqB_#*uRGOU;h6a=yS_VjoJiopMT2p0&)6pm!K1A4C zu4r2}!Lg_q#AjoHv z2xlV~8BZ;Hq`v!{`TiYSRH zS@D*Zh%M5^*Jk~Iphs!`wIg<(?zMc&E6J`s1@bWKOco_xDJz{7Wq+Yr_95f9>bgMbqDWez}Kj;}y!E+wMZV5K?4EFen`?;>NykaE1SNEOnP9ETeg1C+y2B3jOb+MN|||hOcw+ z?(8;p=FlDUni|qS9(FRz%3TU%6%(V5RmRf$v;Sp|)ZkDW8p_|QY^J37Y~+USDm4DX zzJC2uKl-<#Ky_Cz%tO!r%Tk&i5{f5}hB|LmZuuLfDs8BJpFjjA;*W{{frN%*^|8ss|*VFrTGxmqwc|rurm9}D{!M{HyQeA57{%yeBn^!MP z0k5NbAxND<)P0PJ;E~#O5r3NKVG&*|`F>>iXZO?GwINX|EMF z{Aqye0`63wxZNh+_LOBq+*b)0YVJX#?TztKtRYX~wL&pg!Kjo5ziCIbF_qkYDX``Vc8A!4(q1Vd$efmq_? zZrz&^7%6-^Fc<4vL*GHEICRoO|Jl;8af7pjtA_4Pxj*$J4c&>8Ax!@9%t^BUH@{AY!jLX1N+U8ne~g;$KGeG$v+Nrg9+Sv6R6|3oJ&2p z@RJNSnD&we-K&kbeCC=OfBa~PS%P{$wBr>m8nOJ$_sR#iik@MzK58xBu9b44oI$*8 zoS(Hdcd6h$x{@i z#~X`{{EbcTRs*DBpuB_2GIk~=p)OBgNI!Y&MjfvBL&vPc&C4G9ADnH{;0Dc^b!a#J_yS%uc=L20c@)Aoy1TI*9WsY|Z115CGe#tQmEYEh z$tP>>VAB^IC>%2`1ax_d?U_Hi4_)#wW2aLfkq}>?z{HqmpiKF$Wo_*?i~ZmbBj(5m z#KoC$?oU~CXx}6sRSsFUGJ4sdi8jC~Sc$&VE%pd`fybztm4490T0aDpt^|_Go-uE( zhtDtP_dH~ui+rMmADIzAm;)CCg>t{_&iyKI*Tn{}S3z0^@7m0Nsl?cBrbSY=YE6Bg`PGns!@Y?Y|73Iy><6_!OA4LmMH8qeK9|UI_aTa@#Zz%&PdH_nmE=b_0A+ALWeW`}^(WdL zI^IAuFMOHr>WRR6SaP0>8t>C?yN|NL9sSXZtuUk%CRYK~cq>^}ueUb=jpzfP#31ubFBf4LV?nKe5#f*<$ zkFDx(FPWD4lGgRX5zs;3#RAaJzK^Tkrar9A-G1Uk9Fg*8AgnkH(2ZrJyHrYn z`GU37?ZBY(Vv+tOB7#C#h9caTZd*Oa&KlmrNMWMf;VkdcZ{%!s|22KjRw(xq&JXDa)-Gna{zCA;L?LFZ z$6ttXdLxMX*T3{+Nt}+>S9bpLIf^!}oeu1NkUhRdAeuqHc+d&U9_w0|fItbIceibQ z180)VvGo)bv7IhBQpIKWFW)vI2$it;KK7{J1QOh9h643<%JZ&YgDpwPmro@JiC^5@ zhDw`KR8ckw-uuc-pq`WTVa83pw3{gZQ-n~r4VQt%mC|)Ra9CQ~9U6KcWohT($QQHHgIGNV#tG~JOR0~H=%8~qJgV<3ai45GP@j+eB^nYea1FpdwWOqI zup@D~-k(+~9Nkfm9eu#S%z&w-wb&@)J3PB7b>)hF*j_TnVzOq2^4BhizsOz`w*V;t z(7+LSaD-x$`UN+{SLjK6zRDg=HdMrpZI8uziIcRJ!PT*U!Fz(7T#-R936lk}*EE@G zs+f%stQ{ICAVD+g*U18I@FOYXD{C3(M((!yjd^UzCXPL#aPewn08xUkDu^Z5{4g=K zOBiv*5_JMd)CAKp6%X@{s~sd+0xU}fiGEB&k1BTGG*7&q=^NI{d9Ddo;1Sw^TE}`1wn#A zUEo*l2u8{skb(VvjmIhnLU$?<$jXq7BnNEa$@3JZH9mQ`#f21pSl`>IU{~@(l7b!3 zg=b@ebs8uYM~2K$67zdVUj#z^TJXGe5v*Zns|667`58Z~`;*d++Y&KB=Q=Xp39)~i zac$B_Gf;8-Cg#rhAh4Ef@%=a^{&G7C%c;2RwAkP3<41si5?LWBQ!Sf2 zW-qC&=Xr9TH#Ckw6iHmbq{PcZ^aP8grx<)#$hMc=P+56(-l^()~S><@35B<`lE;UELSt zZvrqc<~C!zv*`yh(+tR9MH7?vIIv?(?08*Zx1Mp#44AaPIHsJKb6Dzfvvt0~xwp{! zeP1gf5cT;$%}`0y+G+LDgBki=>sk&){EUc*xwBDF;(#w-q(=-4d<6L)k#2_Kq%+Hu zPKs{7if~sSDipb-UWfo&n<2i#!*#dsd8J$lYd2yfY&pQdx18pGlm#6j{u~6uFl&y{ zszi})a&wKDEl0r$wWC%5(?Z%Vani+D`1@TN*|8hSz9m&HRw7pcJ6=cL#{x{98^P$d z8J^RZUQH_xex+R$Z1e5Hm~c!Ej2LUsp(XB{j`%L%%HKuc;`NRXMR@(^NmE!b84&BS zjkC1}m6N?hyY~|+4n!$Cm1QX)Nb>}#&j&szzZBs%9aPjgXYie_zg??LRrE({^#^dk zhZF~69hdlV6{BYAp+JZymFfky6CHMmE|VXP$Cb(m2eBGYU>snrIXs))WsXh8j7zu4 z>5}SzAr3-Iq1;kLO;dX^=xuSujMog6?-=Xgfk-vC8ZrLT*y%e|LXpLE5{P)66y4sd zkpVMpM;5xN@z;p_Ja{#)Jqj&4_Pt|+{R5ekt|N)nX%mB;c`sI$57iRVI%aj%8E+NX zFQFJ`vFO&-W7_T9C4ycyH!Wb3{MToGrk!PvK`%;c2qV7C2&+$0V`sZ#4ta|g7Nm(! z!iM=s)Ih;v733L_k7<*N1PbQ}Y257tdx_!;%SC+%PjY%5n%T2uhray0Gg0 z(YyM5st?aJmxn3^ggw!(<=kf-usX7@chWjf_>1K6Av{Npny<9q_AAkhY(3A*pij(R zVRxKG!MyNUs8Ep`h28MmXcDHD6}EMjvIL9}>^DZPtj(`?M(psctcJICC^DC((<;3Y zL#-@(LZ>x2F$W!oKg?0Z=xDvl!f~~rrLo0;suuo3K{L1BiPEjnE^ypVL601W zC4K~^h?vyMN>b6sD?j=R_9^f#sE>#&zJP6zC>*`PWUx@m!%0U#o}r^qWA=n)Ke9{a zAC5JAL$sYI{o%bdIR`_>LFM2jY1`6x4Mq6%pq;S&N7lKt85Lm<^!q}sN9zH zPU9Rf_FP=Y+Xgtr6u@EMhFhlgW0MKz&10QgrwqxL4#u1pNtF%XF^6^5Lp_^bu@b#H z!MJtDy&Q8^3D-l+7T{PMc>v?|H$WVl$`n^7Wb(O3eY z+Sqwb3bo(uKk4VZ5PUwA-FZ!nI&^k{s1d`_RI+MP$& z>KwCqnGnqXtSG)sbm-}QcOm#H*d;M z_q@|Tft*|t-FkF-{u{ps5IctdUc+W%`^y{Oj{2{fHh>``lOv0!AXP|jz=!)BBUQ^P zL9QzRks8t6`IHb?BbbPDRZKf`rnyZs<}uwp4`R|Nj`jRPY>1ux>VbbGKP1J9_LHOb zQH1_F`WN0L8xe1~uE0v|FZP%mIrvpx>UOC%A1%;}`aD27G+>Q14)zZ5Qk zw`U1_Gpq=gBR2L88d{c^J!iN8OPf{3uFm%}8|{#jRptTs?FnLAy>%a(rDfUBJ0V%mbsoH|=&auJl&b`mr=BUnOT1(+Cg(rg z)gI=2_xWt5=U>R7w-80$Li%(5a#ZUvO4T8mQ$D#8%hDhhzl|GKj_Lj-7m3hBW$l+C zw0>D}RbY$DJY%XC&zEF4pfx#`K3$u4uJnaA&m_Q@A=k{)q*oYz)t!GTePQbT!h)(R z;3LExo;MLy>dRI7!F(#3Egb*Mtu3n^*y{?}(;`0X9`QNphVWH3n;KxZ20VPtS04<{2k1 zN8u5 z$L!eL%m)JD+akU@?hx9sa+b4M1=C$oZ2&~mBcGLh^jrS)SMSsnlNS%bb1XqOS0Ey& zOO6+@@YbEoat(RhEAbBBYWN3reHj-lJF`qgkVsLFH{n_l&49vB>3gX^O!50n(lHMt zt7h5elF8^5(s|j!w@E83F!qkPxaZJ}pC@8>HoFHc5vJ6V`+D7F&(|4GJu59eO&KD; zDW7JHqWe$mDf7>~3|nZZ9&-)fj6HhVEC8kA&Mf1#TrHU%y>0+lS1)D>&hoY(GQI7j?|)q^Krf4Y8D$-Whu+Ab4?H z&Qu8f!#T0bq?pg?(a9lpsikU5oOS>}zBvb9_o&Vs1aOsskuMl^a8HG&(q{Pl>MPEu zATT6acgem)dse{;OcAoM3JEYR8{e+MdHS;I`u9Bw!!K{N(sd?jZ;!;v!X*%>C~|?+ zw?#+bN#*%IL=7MYvCf)hR_!xm77o)u4I zfT@fa)b))&@@LPY92UY<;=dTL!}NN8PKW%cq5VtqTnD0SgmpJc5|4ZCSGFJm$!c$! z$9NVy4Fn+Qv?-f|s9JFd_ERIki`k;Ua&SHOCw&W{8%o-gQjjE zM{VhW!J{d5GMNUiKa)tR*Hly0X`ptMdZ?oXbRH+lV!+2ikYYs0E*!!mb(xd+el`g$Ls zi^)5{*xYm40$>rDci8cfv>o%n?*)ez+!c|bJr{<4(n3sfr zA_Z&;e2sBsuFF6|!MbBHZQq=iU`XG+MI{ffmqhh#15${P{6M#xer2v0VY14BmlgFd zPOJSW%mQ&i#sVawX#~_#MG_g^8QtWl()vU@TD6F8IqRrSJ!-x|E3dAf`d^yZgVej>T|627o- z&^yLj#>rk%(k*M+9xviRYH-WOvJqWw~S5wiIMgvMzYpKRx@WQE@@5knGh+l{-Mxf5}8CBagywN}&i z3R%{Bdb;%hv{?hL#20T<&-Qb|Cvu*njIT!7JM%8KGwoE^smqK13i^@s!dMCLGSX&K z(i4}%L%SXovkb$nS3{^0G+*aR7+M2M`}gi0dQLkBsE$etmgPrUsQ_)sdRTysv#Zx5 zxt#O#oXLHrc>3*2_82@Btt#JgQ{6O3h$JP%=(I5sN>+MrHb_-2T38t1F>m0(1A_TH zrjkT}H_0XNNr(eamcpmh13xH?b*tFq*=OIug&SG~c5&iBaU7(ZnE2Kbl^yZ&m*N#= z#E}X>XGkhF8;Z3j-ZJ72aR$tR2juoMUOm{$MzMO?P& zhYL8<3?i7X0F7b`a%X@Uv4;cbyZZe@Y-}gZIPPRm)7n<1A;s$LyqEW_rUH!yTxp%p zyH=S%-Yr+g4B#s7^$;!mxSz{!iWN3OLa_|ao>J(%mw=eg)FuW}Z?o0H&x6Lc)q-e+ zqC2V~E#O)jQ{74PTkzCGpCU2@@<|3i zEDB7&ob0UTdKF7$yBGbg@&O&zxgqu)p;nI({5FBli^2T35LU^{$RL!T@R78Asg*=!An^>d(2WggELX1n+%J zGZHkvCz&6bz_KTcgyQ-PPUE=ahCcjHaA>w)T&iEqiQ4B}yF9K9p%iye3o8BdQl4G-=(E7AY z3bwb4_;M8A;SN{f-*%Zw2^pcG?foQo9_}WV;GawovLVB_{mPcS_Da>9q$tkj%jp}3 zzzo6vVe2cS>PnWjlK{cpJ-7x7?(XhR(BSSG+}+*X-66OJcXxNU1K%NYXXd`^erx4N z2#|fcyLNR|Khgx4H6*C#+2Y2{4Ep0gYh}aT>tYyLeORi5%G{{0OxI@e)geD~?tp!U z+)z2`O6{8@Nsm9zUeCW*)l%`vjz}SmWl0echOgh>wKlQWdy=HjcKs#S+V zO+3G*+4c08Z0_biPovuD^kNl1TN3xB3;;LO`t@6FAF;-7T5CU(b+X?oqEAf-r*FxA)}WlBXt|;7iLl>KyV%W! zzaqCm!N+njQuv=3V`BYO2^#EhH9wk;D>>^e@`MytK^Nv2s4iah?Rb(p2z^1D9md+a zE5h9iESxIXNi=izz=IWs8?dgiiT2~v3BZTbjvtyJicKDw5tL)YSJ+&_bZ4!>4ondZ zf??UThqCi*+fHYFGH;Cu5!fMU(?or27e%w+T-4^oFpD>shOKOMI0dL$oI7Yftim!z zVNlq}uPzl<4MIZD2TI{SNi};RRS&R-s0>j6&p}RJ*b2@=;v}LF+f*bba%CF0u4y7F zj`Lqvq;{PIf?((aX~<;@K)lSN@PeKQc^wtrSOjl6`A{4S5M3k)V#P%=;Rz4xXlj^> z@1Pj$fb*Ey`t)CjP+<>?uJEduS#d_v<P5ARCY5NgW27W@xyf`%2x$J(GTT}as6g%(`G*PMs7osbI` zF!7J{2H2k09N4a;VfXbR=4u8Fm8_aPUSQ)dshPRDr64SC*Xu-&AE%a^xUZdvO)a<1 zVuYHA1OfAJl8*P=gFN{C$!|8x?$cIp8B1=lORb_7l`9oL^ay9xDu2Au7iH2I{$D^E6y9c`WQ z=!;gry>-op;@ESqWM6M)9=Jm+(>{GO9>6X86>>flQ7Od#82bQ^j3>4FhMW#kdVrH8 zJYGn4xqh~m>ljLvIV>ah=5>WnZ+_V}QCk%C^w4E>fb)F*dB3(AprgQ(p|sp~fa$^w zBggX^AIufps3Ia9ky!r}%f?e)r*iiO>udMO%&D`U_ga`5VnJW|tMfK=9tVZWAy@-FMG@(qJZI3jzqvV7FA zBiw3^_2NoK{2;8!cRdZj;cOK9&0DwZJ2dF0>&wvmNG7wnBv(ofc6RHB3*DacV@;ml zAs*R=So+jbgGpa3e*$ci3S3n1_S*F^NUh`&BsDXd(^8WwctRLgWd1rBf?AJEF4O%A zywP?rku6>lNfU_W21HJ*Z|`Aa^w6mpc7dH}+HLo&DSBpw5?E)w;iAP!-c>c+IbjV( z0)Kugs%od11E$9y9hf^Xcat@O2&QjEY=9>}q#V%)uqRw{&~33xI8Fi8;&XwWiPUO( zlsIokm9J1Zbi5s?os;fic0eQYS@1rvSLS?U(GZrxt)SoY%k0x0bf+w@l!dcUP z6+b-{DcR?k^zvp=@hj3W${3o^A9SJ7&J87?YJlz%8=HmTonSwflmgUNY%lF)3G0>aJKPA#q+0=mqk5>~`=I5M@=FDXexARZQd<+C>B zlI1z{RA~HHT60OHda}hkhGv02JRB4C$ip?RfJ6Bn z{N40m?nOXdh1K7~jGyQ0ArxeYG;B2F$pTF~SG!oxf)>0GEAE!O^8Hz(^$^3;2VN?$ zv2y!{17Ekro+ahD#uTfEZWKA3k`jP{7w5Yc&T;ejMa%fKtf13_bzj*1WtEktzfUa9 z5i>7A(>P<;z0kb*g~NmFsWtTD<+@88&3J)O@~)WKdG|J~d2#;s{B!BTNRhVP_7w_X zaN$X~0Y)FlOWu+b+68S3DKP&7yhn)do;Qu-H}W@b<(CQnD7C4%0^2W^L^W-g4l!y_ z=Z1?dajG}cx^dd)0b_<=vbHAmc$R1cD2p|>i!EhdFe@LajO;1q*%d@u`Qwr_d5`p5 z`dC+NclTlQT9k*uyz>zlBGMEN@A;AgjOf7SvsWNDOK+U}sQFr5EC^_KmyPKu5`Z9y zK8Mf-thGJDWCj8fVPff?_fObV9w`eR!jgt;U^)9E<%sL5_|m$0_R3XI(Ka%+q0>yD z)@W?Q1xYqA8(_89o?37A?o{c{X|2elc~9UV7x*#kMVJQsr-gT;k_06Zk5AD zt-)#aj5h4@&?`%5eHRyV2{tPd5hXkOmqFpX9@#q6Wemz=rr?%>kAt>NDWnV ze+n~10Zc%AdBeQ5hG?sN!+^M3u6dRJoeCi+@VcJy+I|4Aj4TX1Lf1P#2!k~|&MT@Y zuF*YT742MTcopES9ruT@rA@iUwd+GMqAiX*Fg-!P|aNu+?@6@iK-M}!ZPk#-2+>3xyo*C%0 zfE=&UE07A><*&$i)^Y)&N_!D;ng@tkSmds_jFF#a31#zCd<`1wX_^=E2{T9PaWlFe z(Ss64r9G|OEC|YIpxDauJK+%Q-j!-6lLM^-1@l2*nUNuJV#>_VZO0PVjyg1#Y*!gt z(9ds=0-#TOF1;?Ww|iWRt7k*B0%3c=2Ufvdmdbj6LBk@?^!w)*=PJ({J0VrS&miG~ zj{!104wIjz?D39cYUWs~)jTdoR3<%DU2S$JyziCT)a5^SF zOrIqW^>hX28M7Wn^QqWw%DZ7}u!k4_>pOm@ z`H(K^hsy?v=kBcCk?aZ>#^L@Q0_@zIT@hs$;X!0MH3J>Rt(I;YZ+>-Py7i%Lf*nDQ zH7iW-5HmQ*erc23w+hi!PQBWQWD&%LmpGl(`!dSlZQ`c#h0&SaWWuR?+hrnej0$q; zE79-1s;0CN>{!-2az0VD2+c-=&J2S{E0f?W5UR6C4v}D(qe~Li^NCjD!E1vxDMct>zS_r`&3e_isiKcqjbfXk=?PBN8w zlNE2)6oz}Qc)vu@{<`S^EF>do*8>*;fe8vYk5U{v6Cdic7*XQM1s;9i#V)fLL7x!g zIr%;{s-=ri2qt4NbE6Plg8)MZTg3r_=n^k z5Z^RD1ctp0>j4cUmSbXlQsHtRt2Z?`LN6v`K%Z>l{~jE)yvK*ltl$;eY*Tpnkpoqq z<2+1q;%k6eU+E$hr~8yZ-F%UoU)GDFD`X@@E-JjHJw1u8v(3$fYl~<@dvdqDTPI=+ z=&;LoRc%3Ch35#&n^L9WEU|=2FA`&!=03rjW!Nc75()mhLf>pe%`R8-wFUy|uD=KX zVbo38Ctmdj1g}Sj=ha@9@DJ04p1)+!)X?L6yxwN+oqyj6Ji!`Z>;;q9Q`w3s1$S(( zUWlLsv(%ji%*0&=c7Q!@6r-dm@0ATbe(%aY4>h?+1KaNn*0pb+x32Y`mmUp0DfHwj zK>nb2aBIv9C6Q~e+6}!k8;4rj7su-GiIH6XOTZKComSE7w&hj#FH^T~;z+0Qcp|Y^ zW=i8WP^5k0O*9dJ-SlgqE7(J=>YX|LtvuFDCx3ycIBMx#;n+YED?iT_kQy+4TW+mu zN0EMyj;4)rfAKQ?5DG4{y^OM5qwQ&mCz9#;^R@53`uE)zu6`ijSP=QuY%4x(XG*Ydd<4vu!i_25y{ZJ{P<36TqUkZcrxYIuwakB43ZegCqf+fl}6KN+8USE^28?aN>8}}{$eiC zzVfhJVul&zgUnxi{PbokVTTc~J$&!{mg@Nn_KN8b#vz%U@&}C&*u7>r6Aur(fW!2? z#vdfXh&*ArSEiI;llJh#gSI11e_j`OQ(}3N*?Fbpe532c0LObFH`Jv-&>r)ZdCLkK z$)s`3f~f>Dc8GmRWd|Y>vOhZe2c47-6mUxwA4!K{l{W`nOf((3OW;0k6{8HM#a{t0 z!&)cv{b>-=vSt5w>#3+fGb9*KQ?Z&CWT`=+B2y4d%QBtW!D8#pzeq8R_e8 zXt|0D2x^SI)SDbX<42tIXBRl0;97Q@0Mdq9?yZXwmOLK9z~EakXuPCc)6Kjh+EMXE z=2P`G2Na6lUNK(=3OfhzlR&ps`GQ6Op*vAeULHVdKDVZ1A>??g0S2i}##0}yrw#E- z1I+S~S3o8}4$_n7_N!-|Bh}rjAq)3YX!%367}(o7OP@6WcuPh0li|xkSyVtEJbnt) zz~rP{+soBR!1|k%lNI}t8DurWN+(U-X6m`cgH`6pJ-ynevVwVBSL;@>Fn0^tony5P ztAowAQ6%i!V%W|{b>gaq?D!)fB}-N4{sNyzK+jxRe?Zb1J9@+oEFO8;Lo{cD=OBj& z4OJc&-aLtret*&s<}!-Ui`OCO=keiUl}C;zf#@0K?R28zy_Kg3|52s|>ot#F-Tm@l zgL|&!{5Ql3j^w)vS7CR{m4GDT?=lRh0AP_O!9!;$-$~;ttniAw@itSgNA!&UP*`cq zzbTny>F82mPpYMH?iF79m&=FqFt>;-NBy?$gzV8P(@|7=311JOT0%u;| zmU{8N5;9HTnvU>{VP%dFEo9zY&faxBQaSIfzu>@X;5I#GzHz%-D4+1X>AcY^hv5kH z=x9Jzw*1|$R{4yD{MD{*TirH2t{L_81%_6wF-J}@LP&VC_URO~0QnQWM~@;++?^2j zdWI%I<(^zM*eCBYBT4OAqwwOwn%rCv;EFK6bd23jo2LxXNmdYn8g%09S*|&J)&@Ki zm)M`33ymjGiCMj|B0iG6IolWoRJ>KGzh@76&O|vpI6!=G9YI3{}%)fXV&CA5Q`cP&0T4jLc9b zZ1Ix9KMbtud)nwDX6S?BGV8sHXb80Kg?v?>LX2)QPu~x+3DEuX;My;UTW4Nw7ep`5 zeehL}#Udez40D=;UR{JQq23ECKLde>cG%`qtrVQ8uGJI?p)XFM_**g=u0gs;iEq1; zdimS|x*6093MR>hOhw}aEY-Qsx#Arh!yGPydSrvq}r z`14Jlt%mLfTgq=E9b(SkW>qD+DSd3^5)W!=H-B*vPp=s?b-tl$T2KbPRMmm%*OLs_ z$2>h|EvksmtGpa1is4c)D}5ZI;s#0?{Dl>t{wC|URXURah;dk=t<47tn880S1_benodl=-aHn#A|*VxRR87;+N&+Rdi6wNPZEybBXDW8bV$o)WLs&lJxDMK zu9KHTLyB`HhX?(e3*g_rZ4D=3Lw`LY4k`{!cR9jPw!(yIXw_uSD3J?_9L$77OyzO4 z>J%~iP|_?|%rkKb1?8Sea@vf%!YwD|gA~$ew$0($x9pJlw74wi!yz?$A!Y0bRnJ0B z4lPmy+wH4Vjm1*jj$CjGyVMzGu2WFmj%BwCv^=nVQys7c)aN&;*-&+PHmt4r5%AH1 zeKDugB!>t8*XIEt@Hds68@|tg8_Ezz@20k7aYldUGilW^cgF->3VB^L& zxjGVAPWehjVnp1em-nj%B79h^zPi&ODak_7^Tz9+Kbt&8!)fi$rqP^ooZDeXHl2SoCeVq7CjU$s+eDa85pXj|-J@dOza%HR#nTInB(@5qxyaVS! zjo$9ky=jC6ak!cUdKaipK5JY*nh`rDXeJ3&&wcyG6q*BlKgF;<21PXl=f5QG?y1Lg z_QPaB%i66J3xeTq;eVk692j@*xm6e6r`!_0^xS>&Aeb@w+`13zB(l^qP881SwL)EB zhxJm15A3<8vy%FBNH6aS{}8voqM}QEtHuU@NZ6qx|6O^yy)d&D@g#MM*jIuLe&Lzu zJ%a3VP^^dtBz$@Oa<)v3>Cab#>(Mohz`Nl;2ps6;;1+V&02F6csfI`qLkv`3Qbfk||_?~uyD^;}_`D6nZQx~Qyihg)peiET{b8oJ!>`T^Eax{}% zDCBl4Inju})b1go7gS>|(^U^MPi8u=d`(d1Vm3@^dRnrFMw8-U?6txuCZDH=nWDwH zinVlXDsp>-9jm`9w1fBNPI$FfJ>wHFiJ8;Ck?*Z;OubQwr#gI!SvdE{jjbNbQKMVUqly zx@mHEw3>sbzV~Rj=%?GO2i_fY|t_Lkx7FWFG?+@eC;04^N@A?{F$Y+&s^7 z=FW5V=xhD!okD8%OkikB|L|%_j_Ds4$FG$V$M4vr9za(j80t3RDUMH*A(J8gXdRaB zBlwxJH;fbY(0z)IGlg?&lOrGztH5xF5fZ^_c=ER$c@B8H0H_I$Y;MqR`TIOncG4g3 z8vefj*6`c&?(0ORp(l&_wNjXvoinU(Y7`S|po?87+^ZJadXU)u3Cu&FSh7_>O&$Ebymy8pm!L-Gwzp)loX-`1-0k8l3>v{&%MGA(s4rI z+M20A?SB4;=2}AsERb)Ox>|Hz2DM$D()(qC6uVtrJsARJcy@|1`Oq8&0oMnbaR^otPH zM@$vzblesSlGi4kd|DP}IPZ zR?)uJDNQIf@Ba2a^9&gz z2c);ue7c-p)e4ki@BvRRpY+{kJ1ANNLX?!K z@S-6JBD;UrWezbzu9-^c~bGQ zY!qSv{e>nah`~=tA+t9jFDcwu#iHI(7FmCys?_G zt`<}94oFk2{q$slx+akQPZEsln0eIldm(5W*KkZN08>Ljmu&)B-#AePew6TJ*GBpC z%!NGl&Kf^Mgx$xC=cuH=Lq!&Qvo<`Er<@B9!ftLh;T#vUbD@)+>s{>>s`To?Q~v*DuA4 zfj*&js!W_F2$*iPEiWkXneTdgD|cm$!&eMTg%{My zU;J;!th%a01xrNT+v|gtzATxUcYcCAPjs&vw{Uc?7n)v+eM(E?d-j!OtELP+Pbe;* zdm3OjIrc)DKX!w@P)e42{BpT$2FpJ0+FwntO|O$sQHb*=>@!e+1pV*asT`W`jjZ*_ z!ND&eLJ!+nX$N4u?uR7UYl>ewB8KVV#Cv#uJzdIFB|I}e14rocRSORX2!z4uyl)bb z@j{oOd5M~t|53a5sFEG$Fckiy43_^}!~B1Q^MA|1F-Q$zayt7;SpORZ75dtUL3!$= z|1e`SxW!Pp%bd7c$N8`RI2tH-4`;6ykJuxMEX4EhO~=4BorDzPX*p)j*3w97xS6@n zZf`*ZId|$J|H1z6@1<;7AqD?mRXvb}{jdgPVJ}Rq7C?y;d=U{THva(Z=#3TUK+gpL z1y6)#EKy3@(^*DP{B8#6ra#)<)eoQfnejQ zq9RGZ$7_+*;y=~_vhQe|JPDz=0+ORh{*?+XQfc}wJ=MK4Sq``UKYDF}5b;iU@e9X# zfytqNRNR5@!h7xq#5+yb&w=sxh<J zAB%|!%ZHCC`wk`lBTDBdmRF?gS>7w%7bKhl2b(x@(${;y8FNXm^WX@UOmd|F`}g64 zn^vtL!_;Dt=mFWR@4M3KmkZ&Y0{eRV?9zC~e1y|>HBbGJI_^Sg0a#~v9>F15aC`@DjE)rjc zILAo^n*AgdcXunBpP=~Xe*>^*i6PwN=ijdubYxkm_`mD%_fvcFVE&Hzq`1F-7bceB zq_}RBVWmPN{5f(NCO|Ff;d4zG;;oxOo%vt^Ci;7;~oEN4g-$tBjm7@o=d+etA@sCqV|nbu4Sxd4t>yo!15nU z3|356Pd7?2Vn+1rhYON2MhctGI*5;>x>^BuJQ^B)97%nYu8oYRx0M0s<|Lo;qccBS z!!vbcXz^-9<@=po z?c)ms{asJ=wQ8 znyvn~M0UI;h@|W#myeJfVhliIBI!1tQe2X$YZeCoco!D?5jq>u?MEx;KO=P!>P-_L z0D2g}K~@q$jwYo_{cA8+l=tRJcXl1yUnk<8n3ypf!r+|x^XfC8t=mo2W#ik7B6ZJc zqjql+!@8Vo9=GJc=F0|9updxf4RcR*w)+#8&vp=x-SIw}r~$%{YyOPnth`p8yWAtQ z;ClV$Ne@UQxPlBXs_U86lQF02gx}t>sz=@xUQhfZcR2TxuS{^iQC#yZ1wFV;0uPxG z@EGz}LrF~V^VKXclCvjx*4w=coux`GYjMKmQcIKErO&9c!xkN{!6Y%rmRIGvXm!5zD%>U;=qQlte# zx-k2394t4#3FMxknFO|cs}lM~2OL_V1^xQAEC_u-lt=E@b-`U-;ud7G-D{q)zXk$d z91PrBbeFPJcM^f;fg7E1+9(1tTC2jEN?eBThh0-WkIY;bLc{p`6&eqgZ=o1wG4S(j zn!{V}^aNEuw|X+7_Dy#uzEUf-1po{0hA_djhZnp#JPd_KL_HvQe~1&pjUiDxPcG+1 zZEJxP0dmwSmNq&IRk?@aVMGHJ51~)+Q@EdL>k>^lL$SS~p0H>~d9KZf!0l#j0jj1@ zXF&l{XSIByS-;*rsOYK$z3EVB1xH$brqKO$pt<9n8r4QvOLc@1H1?;bj7K4p{w6a9 zY$}QLj4zS2L$H|JMfi8W%`k@LI`7cuiOKok5uR$h=+5O?qYXm3bt9hjb!$-W5d~=9 zSD6aNMH8}c3O->Sxgey`t%g)82wLb>16(?&!3l zI*u%$S58|HTps~x8v{klH})_x9nN_15M+9Tq(lnoJ=qPn6=vfhCO1E)-&WizjLF## zib*xBRO_-duue=RXEIxef1q9flDKg>)IIUPoa4 zdC;S-vV0reVj-^>(anNgV2m@WXE#Sa*s%J1!M>!dp!!#QpCyft(|2gn1roBPuCHWn zf9)%hQ+AYE9B~eI6HaZ|uR&HT|JmV_;WLJp$tV#qlErD9H`U>GISuSrpnj*O*$H~N zdA(6J+1@&6vPG90GKmpO2X_iRl#Kn#urM9YD$WuGW|pAIwxNv|c|?LtVOqma`(EOI zEkrFbe$lpReCgT0#%WH@s~7#abQ5vS?|oRB`KYNnCaIw!EuN`^#3$fpY4Q6x9$%8` z8V&@v@>ijnx@=zmbP0~8Z4s{{OpcF7FHlaA zSfLk(S^5WhR!VidH1UdcSAZVd8y`nO_SPQpVPgrPGN&vltYt}XTGh98Q-_H700^%Y z`)M-S9^MnFT2oSxI7dS}*9UrjRm;fwW@s&e|0!YIbAe`Ba~8cxTS7y#C}j7tdBmhF z@H46m6fw!;nBz(cvHl`tpo!G&qRR=%=GY?{7cWpff)^#giQz!5!ql}bwazFJ+o z>gXqUX)h(GsW^$Gl%W^oWLoE+7gVtd2+cj3pIQG-VJhgZ{%>e*6q_tS9JjG5hDbgc z%-bkgxHg};7EY-CcX{L>NrQIkiS6yEayI^W%H{Z(yBfi*0R0o*BTekn0fQ31{ z*I3XAZmO-vNORnl-`wP`F z*~4$6m7i$)AC%~31XXxR$9hxZv3;DAauI0K)|bW8SKaaD=`usl>*+)-;F%cBsG%fy zJbVn33zcENko9d2mrlKq!@P5nyN^<6_>~l3omS^+8KmUZdpVQ#%;(0~0Deypalb^+ z+orv>6wB+DFBOb`J(|Ju`7Yn}E!f2i$S({I4=y71ZW5zzRD~@>2(~E|YjX$Ie1`-} zntoe7iIR4&t3Y^&mosjv?myU&=+XbdhSD`{b|V_f$mbP9t^&ph@xHIe%K_@E%gH-< z-WjRj5gjD8l zre(nLN|nYOb>KpR^*aE30Pt04Y7e@E*Pc^kUohI1rc7RF*GWSn?v=cQu3!P-+BMir zrtL1kLi{G_$K6XXY5lXz%QH4G-%`T}=JT|9I`OMgWsYYIKkKy{Nal(YrS!^9#w2wf z^;u6bl;I3dsSltU67Z=laKPp;oL{S4Mg(A}*trj-N&LX)KxQ40hg8>YzC zJ@!?@D^n!mp88T|z&cd9>|Ryj8^$z|+1FU-XbNqsk_y)GJQWXHMIRj5_Rbe$dfHGEMQ(IuZ!i@-#-+3aqmjTL#C)gF`zG1;w zru~{%*qIgZol_1<10Kv*0Xz29*o`^m5h7r@T}m$izqy6?8zc$zcX))jCRZyW%VB@H z2u$PSn6iGE0H<}We!i-P8n981=w)!fvF>n$j?mgBM*|ZNwO*b`a5G&zNF?aExTgvv zE%t;T_J_yLyBnX+RsKd4e!Y{$ zM8*`-=uGmWmqa}Psbr?*oN>`+d4et!ppPo$MMLtj>h71->??J5IAC&Lx%+NrQA{(` zE9eyl4sx2F<8gTbpr4Eq+4@m}beBGvD)IEKf|{CgzZa`UPgKWb83zz0c3km|_w!h0 z-I^E7pE*FA3=-#Qxu4A)R|p@Ql(SbJSe`L;5$kZJJU^!u`spXpJ3$j111!KpWK$1{ z{(nZ&E=oS|YBk^a->O>PZKRnWd8Jv16>0u5k>;9wdu4XOaN8LnKVO;JR6_~zn&B>l z>YRNL$5p59$hzSERj56 zBL*))R#z+4v)^!6%ci7gmUnDaI*5~q|D7{~Q!2PdZH2kDm8G|!M zz=@oYr8#^U!fO2R3k${86t;aF4Bxosra?_Z?^875S?0_#N8lDB`L&z>7abEeax!Mb zyYSJRq&s8+zrwvL;&Qi9^eOu{`u0v>OR6fcT@36O2toC7RKL;=i2&;nJ)v`}-}|A_ z3u?CBc#aAwt`uIH(eF~W@{0csfW)B+BXuEIS>`!2rmK+2IaQ`BOgrX6pt$DohCcgMB zHeP4TX`lf`)+yK(N69F_Lz!VM-}ct~=Tj1k&Lx_Ra>(RgS!eb=f%L;Wl1Pc!1!F-F z;Q9Q4i9|#Gz(k0L(ltAegxRu69f)f{K!-rrC0^VA=BL`*nCd7&6^9h<*7euVIui}j zxi^$>FbgGGAsvf|qgXAfI1o=v(}$JZN|stsBsKZx8^%X>^BjqUb?_*OD_rIj3IkvG zxN{zxzh3x_`cD0tcQ0tqKDRIh^BIfY*@%s_dK*@mwVu=3S#fcs_p)C)xGJ9I9$54* zx##~ujj9Hl$%ul^o%472x1|?hH)y4M}=gChlVc-<6p&mdoTE zPjoZ$xUx0FuwsUZFn#MqDTTWt&?*i5&Fjqe%x7mJ`le1&rj^7$6NLD79`8D1-PbUV@lv5{Q)W)g0MM ztvLrpQ7+F97T6dtJ#4BI6zIW1Yqq+59D$;jSaTguP6qJQa(v@xg}J*&w$PH!4f^l_ zS6xhyPf^uqERD_1$bE0*JZ=5lNinEt#D*%1#qdbRb-^>dhkwO?{XQhoTuePp(3KbZ zW3vqOLK{w_W`x^h5w^T2Ph14zu7cUpkys?wvz3il<62CXzM4JOyB+n3bIPR~v)yTw z<%!JmY4CuaWS=(95Owc2m1@h4QbX1S{uD zSZ0QD8JYY8neN-z1b(W1&7H7_zSR%VJWfI3ummf%GE^hz7F8REll)P%iI_Mis#9}? zO8OPw&-XAWdqb(6l|30NO$PX(%*XkRNz!O#sc0 z1)@y$@FLZ+tq2@-I&%TZkX}J+i{%L6u^5PKgQ-b!Xx~@KUQudca}g7+SpKTML>8`W z%o){qOoahmhtsSS+#ejhMfUj1w(dlJO?c{*4$gGrbyW-k=Jr zmkmF7NUk^yNnqv5qt|Xnu3m;C@Y@PVTa&lJXj)dVFn-5Qm5xF;I|hzz(WOfwa&|v^ za6D2?lc@udUz_m&knW8Iu^>diOlmY?eG`QMGb`!mR6x`{5)nI*2pzYz{ty#{aY+(A%HSTi!ofe-!7zP7oSbpM%GFFyFR(K3^C= zpSd*+8C=&yIy{Dp!0! zq?Fv@D6eK#EQq_1a$7mv`87A4eO$mM6aTu&5*R{lvKYVuVQDO!k46Fd;kTlGM_cLF z`0URF{k=MuG|-^b3e`+=r--zEt3i;62(h#a%k(EL)mht*&Cy!gLEz)vly~cc(u;RT z-RiH!!!sr#$)qwB`qLDo`p(KOD%vtUp5e4ETx0d#6V#2bo39m#%w)5wyVv z^sz0!IJ*+>x&|_Qb-%nDK-@K$i@pfa)c_Kxlo*zgE3Hsl_xe0$AXP0&xu!rK76J~& zxt!f|_zyEfG#I`#pv&~zB|kIEX8T1jr09)Zaza$=IL!JMGO?dl`=uQv%ngUt$6o6# z=R|FrIP80J)6?Ebx!Bf`t>1?Hcxfmi$^?-Y2lRP(Qg2NG1O002LYxr`@Pk68$?05M zU~^%8J+h;Ndlh)6k`79zjeHQ8O4`t8eh30fA7CcR8?=@(q^#{nqvD5HoU;Z_B?_ji z7c%hMeo;QUY2xpHL6E1bQ$+gfpR)5~SS41)+!5HnKVLYFr3se%{s#U8zoO! zHk(T}_G!j_9FB14J~uqA5!=J8{v^Pks9B{$i;ot&xq;DVh-vi+B4=4a<|ohdxWc*4 zQKK9=;^~)J;|vzpkmCGV1GrMHO=t&!=%5%=d9#aKWYdyk`w8FA)2qAEcODVG(IQvf zQrKjD>2(>Q?HIj?Xn(T`=00$_{Ozth9r#%wD7Zf7$U_Y8Ifg}edRKXV^dGc__?@G9 ze!y5zSU+w|yOc^b`K{P%G}Ne=+U@k~Nd>35#7_L|eNOWwtLICtHmFqa)Q7hCE%(Z2 zi?s5lnT$iBKr767c5Vi=I0T=oB^bEIvTi!hn_dxC8wbo;EuyBZ*v>TIg9*+AMHGeU zaFBc$)}v#&jL*{1bW$eR9N{O872VHt&3UC*SeDj6xU?RDV}{;*jHN|X=%C(gc5|@v zJd)mO)KXGyVgJd4)!((;3%<=SOXyVwXwLqqsR0U?xxvW#K8;$U=<&A095XONRC|ID z<1+at=H0*AAz>Px>Q8}uXdRytDv?WcT%|ux*lI;|zZIf-b-N9ocZVYEqCbJ`UV)oqpa+g6%l*( zmB9bUr<~{_@hg#SA++vd8UTO$w7;=8vGrjO+99N+?3FUbtP~-YBe)W;0J@k#?lp`2 zT+Cdp{|NB$Wn3Sm>ozy`;XV^LaQ|_?iG|H)A5L4s5I~Dq^xJr3#cOl2ClxLOyvTxs zT5uN$4F+r*P7{AgxAd&}k>v8tbVgLhW{;W_7<`)H+cuPBJjec99p9{>TpcCv)hY2e zn{ygUHfA-OM}|x5J!T=zbQaB&qCQ#dinYkzyaGRz{7+$?0hW8(FGyO-M@y^5bG6G9 ziZ(C$6y%xfLI!7_I+9yM7wjezmf$B}j1UWA(G%&;-OG8MAtm~X65r=HV!Ny;?S!v& ztMl7WiO!K$$i2DUXM@suw3AOAaJ_%a0zdV?Zb?Gwi zdwy_dC8s2toUU;3(>V%Q&x&*V8ZXQLJcz)PG5;wDdT@cKqxbU`|F^6V3CvIA*Qx|t z428|xg!T3~yt~IGBo4QioWpUqahKzquU624H1AnN8}60F3-KGVzJ_DOuH%hOZ9dYv z5X#3xifgK_(fpq)s`!X{C#;^-{(F%x7yMAahp6S6pB{`%mXeUAZYZbEh!(U;rk_d( z3?I^_Z$FnRk!5KjJ^&*cVG9ZeF+P?{-F#$>9%j!5!l^zViN*it3qmW^EK{6zv!i^` z!2UWdNF{W(nsPa7M_I)W_BCq#9Er_DFY|SKwx0-r zpEyW^-1$kPz%;Bfw=Gddu6s8@-1w7xP+t3+t15)3!|Beo13{W!7H5@C2u>rUD3>33 zLWIaVrh6LaY%fZOAgbrm-c8)oM;tDBFiELh(Pz>3eA_4+RitR^C4p?HK-NzhHZNDO zWhs$Q`h{sAwRcI(uzXizseu;J!D3-FHP|6mJKbQ10cUFYTx!cggzJ~p)?HjwwTODU zRI%!ONaoW|TB~MVwU6)9d!?(RNNVc^B-~C>fD$4KGVrhmHm}MD4=9u**6p|mqQ)<& zkJMSvkUZUwqyETU4Oh901&AH%F22UHs+O`}3cj9|$+mi`NfkdVe;ZSyil2!L&D*p081=vGRE}oym9-Y9e&Pz7GYIOJW6kHq( z{SJFb8M6VLh|PpWW^KntR$HGC`8q^#SRadnp!GJo5N)bCAB z^Q=)3X?ZjvD;MP93#*9?0x)xqt9U;WK)vt12CZ_oa)+->@p)hTs_Hrmt`IBW+0X@I z-(UIsp2d}QQsB1x{>4sT?oLij!k_&*>i@NM-SKR8VY}5KwbiQKv^FuT6m5yUi7l;J zN)aPAMU_&sh`ovssTrFhrA3X}dyAThDsM}R@P+sNe&0Xe^Y8QfJ@>h<>zs4n_qonF z4-2iOkna9qSJ@vtQF9FrtedDfrytAMUI~p(S@=FXEY<4Vp2$rkS(I z3A}@b)orsR_hRW^{OIzw`%DV6>Jqba5rdc;RNEX)AW-VLbs!JFTv{LCjWWbwU712( zP#{~}LoCM0m^jalk6=tM+Id*0a(`|FqIo_9z+NdZG{R^R75P5rzCf;}_a7rwf34VO zjgOlbmgJ%_gNAj92{^Ho*G}K6O}is;+^0Xu7Xp7boNb$7`<8B#tepdlj3(J*QW69u zriYDv+x#XdiXWNz%cZxa<4OJ^`_d+N&WnJP-&LWxjjyn0#9e1J&jm~moYP2)$M#J! zBNSN1i~yQnezbPOHcKZtj0oLQ>Sw#PwQ9*OLgyTU=XGOBe-%mlaLw^0t(*G}b-)K(uwu6UuuKViDs@4|eB9?kNb&EdswQ@U zutzRS2T-F-q@0IMS@wA#pu=go#%N{w@JAR7RsSiel{qo^JA-5}a+lii0lWy{U<9G%)lz70Z)QN-Mg6Z)OLGMO3 z?q@s#tDO?*%NN}N_~XkkWXs)cqW+#E3&J*{X4Q}l!wE`-|D*j582Q14th9mwJ0w|4 zbKZUpA=Mj#h*&pgbj}}!5SeEsPR9?BEE`eyvPF^cv-d*AmGNzA7ub05mTi1?B>J# z$h{wE*mryd7Tt~4vW zep!p&(X>^na|^iwaF0H4Gsk}6aGl)gs6F&6+eq1HE*K;Cl&m^5y(-UtU$RoBjhF{5 z+dd_gLv81~?R<}|cXP4}*c2WKB znO8YOaNlF8=qa(&xlmuFv!x~0->l+6`Y|sMd};Bui2&XWkXE=GPx~e9Y~WaHd#2iktDV{AsJ7dorS!iWzr$45KzrDk@dM;!EMm#N(7j#F zqw|Dm`)=1TdxrZSG9OjOwq}O%6gTpS#=m^;*G9y|;lDXyMT!in>WR>igI^biX$XgB zTm*(rp7^kG?SmPi@aeEze0}FSymd?hCO0sUD;$1|Lt^w=d{PJxay{vcv^$P*=$;hEzFylqufPjlSl6 zp_3%69YKTrA&qu5`4!ggA@{584NrdZHo9KNg2P&GaF@E#Ud#O`WKB)>(ak%;!H76mr5b-MLP<;4VF&j{gNpBV>LF)1BzkUOx6e=2%)gJ(a&sb2Fb1UjJy)bud8?MBk?J|m_Bey90oik7%SpD1@##3w_Y zd}DkC>c&?)x*qn;HbC|WrR#v2j4dCxG^B%eXp8qXrM++%A;YjDLrK2{o_R)9FP*PChiCjBP zpt_6H4NA;3M7%GSq;!a1V*4<-T~z_;e4k^0!XQ;kI3Sx}^S%1CgZ0XR9;$DQJnzpZ z02!p5sP5TRmXYDX=8G)(UVCI^a*tEsF>Y;mY6aQCT4fGs8B05FhLB1tu4}_6*9B=5 z{WLa)m0r?Csrp4>58|heDnkK!12g}a8S^C6|FVe@Xz&1bb+hWCl1EQV9f?Um&Qcm%T@)vjbO*3|$EtGP1-b@dr3e@CAPMT`>+oUkX`rQ$ z(H^dse^g7ng1htXc-S%VgOA=G7w7D!+C4tr@0vRprW22K>H%-GSmLc1nVp>8gaTHM zR-paSUqrP6zMW#=$+5+#yyc;Q#UO!Ip^pvYIxa5F+gOTt7C51GhA27BO;0yiymPhx zEgK=h8fES8LXXHC6g%jo5BC;XEk5GUGG5w?gxf2AgH9I-`3Hc?`CnZ$_6b+T`N zg)x(P|P>&1Qz-DUH@p2i_DEX-CVWoLFvzQJy3gnZWH)ig5Vo-6Csob2G6jJBT>&d;L6#Qne_qq*B+jb0w>o-M+iOD4Oyirw+p_IT>BRb$ zE&h(QM#qB>Wn-H7SEGI^zHySMH615p_3Jdm+rRZctt?IX>ZmYJjd|JT*&|LniF}=E znz(&?O-V$*B#R{<+)XZZ(TLA!r8y@$dO?&W*iTyqfC9vjGwAD@)5oKrArGD%b4wu; z1RYnbc5$OPb2!z}OU&h!Sm~JrmRd^LX%xk~bJc*x>OwVOklUyScYc&tKi3UNh3OYu z!X3+MH{O&Cs-Z{;SO(qcF;t-lf zLChsi>*+uOtuM(apf?_5I3p)(yP3hjN>kA6$Chi)&;oqpghn`%;ZqeqNA0vyRrvF7 z@NNMxlj~jWaRe?4VDL>b_{+p)oCOY9KN?lact2|_y6q^1O!G#n)V-AT_wN94c~024 zdh@Di!3RWk9c>?!?cWHpe2o0`z>{ zQQ_U^tx~cDM!NnSg$mWvaZ$&^0Qbr(GgB4|B)@C=pF)8-<4+cckQ+{>fP6;JsZfoR zJP~X_cfLpXFpI?^htb!+t6RJksgl&+!`<-X2?g%-vZFj#^{+X0y9|4TT$X=ckKciy zjEt0-yB@xuN^Q!~=qFZ0ixdf}fOwL#8e74=ksvf7TjFOOh@>(YX%KslVbN=NX-%!^ z5~Q-8uhq{{`})VRFGF>4A4rqKej%xj{aXVSno#^KO0gm#@%l|sR74m8jL{4p^-F(# zRW+@!ykI?^V-4klLQO^9Ze4O1zHXGaplN#-4$&Th2LXUD2|&BmZSSN1S5%7UIHmG&g9g!*L6+xf_c9S4x;1UanF6EI9$SU*Ov7 zoQcmEx@)zByA~q<=BW&`w}Q4zO}|*oK4sZ-s6B5#ZhyNoEA5ILIeIKhi>*E52c@Z{ z@D*uX&Sj7;?J7#p9$2R6Uwcip^>X1r50V%%ctwc|i z2bmK*t#;F=v%LWrH^Z+pb?v>x6B{c+ z_Wt+HA!=iRg7P@jxZgap4@vCNLSsp;-V{BLH)1qZDn%oqY5NgDhd-nl6Np6OCLTYw x!2N=#Dwu7-fuy6XWK26>N+*0Gkq3Ep%H1=TrtTzB6?TdAXsYU|RDx~7{|BlYup0mX diff --git a/docs/source/quick_start/index.rst b/docs/source/quick_start/index.rst index afa709ce..c6315cb5 100644 --- a/docs/source/quick_start/index.rst +++ b/docs/source/quick_start/index.rst @@ -4,7 +4,6 @@ 在学习 USB 或者是学习 CherryUSB 代码之前,我们需要先基于现有的 demo 进行快速验证,为什么?是为了提升对 USB 的兴趣,能有信心进行下一步的动作,如果 demo 都跑不起来,或者自己摸索写代码,或者先看 USB 基本概念,结果看到最后, 发现一点都看不懂,概念好多,根本记不住,从而丧失对 USB 的兴趣。因此,先跑 demo 非常重要。下面我将给大家罗列目前支持的 demo 仓库。 - 基于 bouffalolab 系列芯片 --------------------------- @@ -105,6 +104,15 @@ USB Device 移植要点 #define CONFIG_USBDEV_EP_NUM 6 // pa11/pa12 引脚使用 4 #define CONFIG_USB_DWC2_RAM_SIZE 4096 // pa11/pa12 引脚使用 1280 +- 如果使用 fsdev ip,在 `usb_config.h` 中实现以下宏: + +.. code-block:: C + + #define USBD_IRQHandler USB_LP_CAN1_RX0_IRQHandler + #define USBD_BASE (0x40005C00UL) + #define CONFIG_USBDEV_EP_NUM 8 + #define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 + - 编译器推荐使用 **AC6**。勾选 **Microlib**,并实现 **printf** ,方便后续查看 log。 .. figure:: img/stm32_10.png @@ -134,12 +142,6 @@ USB Host 移植要点 .. figure:: img/stm32_10.png .. figure:: img/stm32_11.png -- 拷贝 **xxx_msp.c** 中的 **HAL_HCD_MspInit** 函数中的内容到 **usb_hc_low_level_init** 函数中,屏蔽 st 生成的 usb 中断函数和 usb 初始化 - -.. figure:: img/stm32_18.png -.. figure:: img/stm32_13.png -.. figure:: img/stm32_19.png - - 复制一份 **cherryusb_config_template.h**,放到 `Core/Inc` 目录下,并命名为 `usb_config.h` - 增加 **usb_glue_st.c** 文件,并在 `usb_config.h` 中实现以下宏: @@ -147,12 +149,16 @@ USB Host 移植要点 .. code-block:: C // 以下细节如有出入,请对照 stm32xxx.h 文件修改 - #define USBH_BASE (0x40040000UL) - #define USBH_IRQHandler OTG_HS_IRQHandler #define CONFIG_USBHOST_PIPE_NUM 12 -- 调用 **usbh_initialize** 以及 os 需要的启动线程的函数即可使用 +- 拷贝 **xxx_msp.c** 中的 `HAL_HCD_MspInit` 函数中的内容到 `usb_hc_low_level_init` 函数中,屏蔽 st 生成的 usb 初始化 +- 在中断函数中调用 `USBH_IRQHandler`,并传入 bus 句柄 +- 调用 `usbh_alloc_bus` 创建 bus, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` +- 调用 `usbh_initialize` 即可 +- 启动线程 +.. figure:: img/stm32_18.png +.. figure:: img/stm32_19.png .. figure:: img/stm32_20.png - 如果使用 **msc**,并且带文件系统,需要自行添加文件系统文件了,对应的 porting 编写参考 **fatfs_usbh.c** 文件。 diff --git a/docs/source/quick_start/other_chip.rst b/docs/source/quick_start/other_chip.rst index 5e5a833b..bddd5375 100644 --- a/docs/source/quick_start/other_chip.rst +++ b/docs/source/quick_start/other_chip.rst @@ -20,14 +20,14 @@ USB Device 移植要点 USB Host 移植要点 ----------------------- +.. note:: 请注意,当前是最新版本,支持多 port 功能,`USBH_BASE` 和 `USBH_IRQHandler` 的宏不能再使用,并且必须调用 `usbh_alloc_bus`,具体按照以下步骤执行。 + - 拷贝 CherryUSB 源码到工程目录下,并按需添加源文件和头文件路径,其中 `usbh_core.c` 、 `usb_hc_xxx.c` 以及 **osal** 目录下源文件(根据不同的 os 选择对应的源文件)为必须添加项。而 `usb_hc_xxx.c` 是芯片所对应的 USB IP dcd 部分驱动,如果不知道自己芯片属于那个 USB IP,参考 **port** 目录下的不同 USB IP 的 readme。如果使用的 USB IP 没有支持,只能自己实现了 - 拷贝 `cherryusb_config_template.h` 文件到自己工程目录下,命名为 `usb_config.h`,并添加相应的目录头文件路径 -- 在 `usb_config.h` 中添加 `USBH_IRQHandler=xxxx` 、 `CONFIG_USBHOST_PIPE_NUM=x` 以及 `USBH_BASE=0xxxxx` 三个常规 porting 需要的宏 - -.. note:: 上述三个宏仅对 musb、dwc2 有效,因为这 2 个是通用 IP - - 实现 `usb_hc_low_level_init` 函数(该函数主要负责 USB 时钟、引脚、中断的初始化)。该函数可以放在你想要放的任何参与编译的 c 文件中。如何进行 USB 的时钟、引脚、中断等初始化,请自行根据你使用的芯片原厂提供的源码中进行添加。 -- 调用 `usbh_initialize` 初始化 usb 硬件 +- 调用 `usbh_alloc_bus` 创建 bus,填入 USB IP 的基地址, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` +- 在中断函数中调用 `USBH_IRQHandler`,并传入 bus 句柄, 如果你的 SDK 中中断入口已经存在 `USBH_IRQHandler` ,请更改 USB 协议栈中的名称 +- 调用 `usbh_initialize` - 如果使用的是 GCC ,需要在链接脚本(ld)中添加如下代码: .. code-block:: C diff --git a/docs/source/quick_start/rt-thread/rtthread.rst b/docs/source/quick_start/rt-thread/rtthread.rst index 4cfb965b..28a4631f 100644 --- a/docs/source/quick_start/rt-thread/rtthread.rst +++ b/docs/source/quick_start/rt-thread/rtthread.rst @@ -35,7 +35,7 @@ .. figure:: img/config_file.png -* 使用 `scons --target=mdk` 或者 `scons` 进行编译 +* 使用 `scons --target=mdk5` 或者 `scons` 进行编译 主机配置 -------------------------- @@ -48,15 +48,36 @@ .. figure:: img/env8.png -* 默认使能除了 hub 之外的所有 class 驱动。 -* 设置 psc 线程的线程栈以及线程优先级。 +* 根据需要勾选 class 驱动 * 最后退出保存即可。 -* 退出以后不急着编译,需要在代码中实现 `usb_hc_low_level_init` 函数。 * 复制一份 `usb_config.h` 到自己的目录中,并实现以下内容, 禁止包含 `"rtthread.h"` : .. figure:: img/config_file.png -* 使用 `scons --target=mdk` 或者 `scons` 进行编译 +* 在代码中实现 `usb_hc_low_level_init` 函数,USB 中断中调用 `USBH_IRQHandler`, +* 应用中调用 `usbh_alloc_bus` 和 `usbh_initialize`, +* 以上内容我们推荐放在 **board.c** 中,如下代码: + +.. code-block:: C + + struct usbh_bus *usb_otg_hs_bus; + + void OTG_HS_IRQHandler(void) + { + extern void USBH_IRQHandler(struct usbh_bus *bus); + USBH_IRQHandler(usb_otg_hs_bus); + } + + int usbh_init(void) + { + usb_otg_hs_bus = usbh_alloc_bus(0, USB_OTG_HS_PERIPH_BASE); + usbh_initialize(usb_otg_hs_bus); + return 0; + } + + INIT_APP_EXPORT(usbh_init); + +* 使用 `scons --target=mdk5` 或者 `scons` 进行编译,需要使用 AC6 编译器 * 如果使用的是 GCC ,需要在链接脚本(ld)中添加如下代码: .. code-block:: C @@ -71,17 +92,17 @@ 借助 STM32CubeMX 生成 USB 初始化 ---------------------------------- -使用 STM32CubeMX 主要是用来生成 usb 时钟、引脚、中断的配置。我们需要点击如图所示文件,并配置好 USB 的时钟、中断,点击 `Generate Code`。生成的时钟配置在 `main.c` 中的 `SystemClock_Config` 文件,将其拷贝到 `board.c` 中。 +使用 STM32CubeMX 主要是用来生成 usb 时钟、引脚、中断的配置。我们需要点击如图所示文件,并配置好 USB 的时钟、中断,点击 `Generate Code`。 .. figure:: img/stm32cubemx0.png .. figure:: img/stm32cubemx1.png .. figure:: img/stm32cubemx2.png .. figure:: img/stm32cubemx_clk.png -然后将 `stm32xxxx_hal_msp.c` 中的 `HAL_PCD_MspInit` 或者是 `HAL_HCD_MspInit` 中的内容复制到 `usb_dc_low_level_init` 和 `usb_hc_low_level_init` 函数中,举例如下: +- 将 `main.c` 中的 `SystemClock_Config` 替换掉 `board.c` 中的配置 + +.. figure:: img/stm32_init2.png + +- 将 `stm32xxxx_hal_msp.c` 中的 `HAL_PCD_MspInit` 或者是 `HAL_HCD_MspInit` 中的内容复制到 `usb_dc_low_level_init` 和 `usb_hc_low_level_init` 函数中,举例如下: .. figure:: img/stm32_init.png - -其次将 `main.c` 中的 `SystemClock_Config` 替换掉 `board.c` 中的配置 - -.. figure:: img/stm32_init2.png \ No newline at end of file diff --git a/port/dwc2/usb_hc_dwc2.c b/port/dwc2/usb_hc_dwc2.c index 4975eae8..475a04ef 100644 --- a/port/dwc2/usb_hc_dwc2.c +++ b/port/dwc2/usb_hc_dwc2.c @@ -7,24 +7,16 @@ #include "usbh_hub.h" #include "usb_dwc2_reg.h" -#ifndef USBH_IRQHandler -#error "please define USBH_IRQHandler in usb_config.h" -#endif - -#ifndef USBH_BASE -#error "please define USBH_BASE in usb_config.h" -#endif - #ifndef CONFIG_USBHOST_PIPE_NUM #define CONFIG_USBHOST_PIPE_NUM 12 #endif -#define USB_OTG_GLB ((USB_OTG_GlobalTypeDef *)(USBH_BASE)) -#define USB_OTG_PCGCCTL *(__IO uint32_t *)((uint32_t)USBH_BASE + USB_OTG_PCGCCTL_BASE) -#define USB_OTG_HPRT *(__IO uint32_t *)((uint32_t)USBH_BASE + USB_OTG_HOST_PORT_BASE) -#define USB_OTG_HOST ((USB_OTG_HostTypeDef *)(USBH_BASE + USB_OTG_HOST_BASE)) -#define USB_OTG_HC(i) ((USB_OTG_HostChannelTypeDef *)(USBH_BASE + USB_OTG_HOST_CHANNEL_BASE + ((i)*USB_OTG_HOST_CHANNEL_SIZE))) -#define USB_OTG_FIFO(i) *(__IO uint32_t *)(USBH_BASE + USB_OTG_FIFO_BASE + ((i)*USB_OTG_FIFO_SIZE)) +#define USB_OTG_GLB ((USB_OTG_GlobalTypeDef *)(bus->hcd.reg_base)) +#define USB_OTG_PCGCCTL *(__IO uint32_t *)((uint32_t)bus->hcd.reg_base + USB_OTG_PCGCCTL_BASE) +#define USB_OTG_HPRT *(__IO uint32_t *)((uint32_t)bus->hcd.reg_base + USB_OTG_HOST_PORT_BASE) +#define USB_OTG_HOST ((USB_OTG_HostTypeDef *)(bus->hcd.reg_base + USB_OTG_HOST_BASE)) +#define USB_OTG_HC(i) ((USB_OTG_HostChannelTypeDef *)(bus->hcd.reg_base + USB_OTG_HOST_CHANNEL_BASE + ((i)*USB_OTG_HOST_CHANNEL_SIZE))) +#define USB_OTG_FIFO(i) *(__IO uint32_t *)(bus->hcd.reg_base + USB_OTG_FIFO_BASE + ((i)*USB_OTG_FIFO_SIZE)) struct dwc2_chan { uint8_t ep0_state; @@ -42,7 +34,7 @@ struct dwc2_hcd { volatile bool port_pec; volatile bool port_occ; struct dwc2_chan chan_pool[CONFIG_USBHOST_PIPE_NUM]; -} g_dwc2_hcd; +} g_dwc2_hcd[CONFIG_USBHOST_MAX_BUS]; #define DWC2_EP0_STATE_SETUP 0 #define DWC2_EP0_STATE_INDATA 1 @@ -50,7 +42,7 @@ struct dwc2_hcd { #define DWC2_EP0_STATE_INSTATUS 3 #define DWC2_EP0_STATE_OUTSTATUS 4 -static inline int dwc2_reset(void) +static inline int dwc2_reset(struct usbh_bus *bus) { volatile uint32_t count = 0U; @@ -74,7 +66,7 @@ static inline int dwc2_reset(void) return 0; } -static inline int dwc2_core_init(void) +static inline int dwc2_core_init(struct usbh_bus *bus) { int ret; #if defined(CONFIG_USB_DWC2_ULPI_PHY) @@ -86,17 +78,17 @@ static inline int dwc2_core_init(void) //USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_ULPIEVBUSD; /* Reset after a PHY select */ - ret = dwc2_reset(); + ret = dwc2_reset(bus); #else /* Select FS Embedded PHY */ USB_OTG_GLB->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL; /* Reset after a PHY select */ - ret = dwc2_reset(); + ret = dwc2_reset(bus); #endif return ret; } -static inline void dwc2_set_mode(uint8_t mode) +static inline void dwc2_set_mode(struct usbh_bus *bus, uint8_t mode) { USB_OTG_GLB->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD); @@ -107,7 +99,7 @@ static inline void dwc2_set_mode(uint8_t mode) } } -static inline int dwc2_flush_rxfifo(void) +static inline int dwc2_flush_rxfifo(struct usbh_bus *bus) { volatile uint32_t count = 0; @@ -122,7 +114,7 @@ static inline int dwc2_flush_rxfifo(void) return 0; } -static inline int dwc2_flush_txfifo(uint32_t num) +static inline int dwc2_flush_txfifo(struct usbh_bus *bus, uint32_t num) { volatile uint32_t count = 0U; @@ -137,7 +129,7 @@ static inline int dwc2_flush_txfifo(uint32_t num) return 0; } -static inline void dwc2_drivebus(uint8_t state) +static inline void dwc2_drivebus(struct usbh_bus *bus, uint8_t state) { __IO uint32_t hprt0 = 0U; @@ -154,7 +146,7 @@ static inline void dwc2_drivebus(uint8_t state) } } -static void dwc2_chan_init(uint8_t ch_num, uint8_t devaddr, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps, uint8_t speed) +static void dwc2_chan_init(struct usbh_bus *bus, uint8_t ch_num, uint8_t devaddr, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps, uint8_t speed) { uint32_t regval; @@ -217,7 +209,7 @@ static void dwc2_chan_init(uint8_t ch_num, uint8_t devaddr, uint8_t ep_addr, uin } /* For IN channel HCTSIZ.XferSize is expected to be an integer multiple of ep_mps size.*/ -static inline void dwc2_chan_transfer(uint8_t ch_num, uint8_t ep_addr, uint32_t *buf, uint32_t size, uint8_t num_packets, uint8_t pid) +static inline void dwc2_chan_transfer(struct usbh_bus *bus, uint8_t ch_num, uint8_t ep_addr, uint32_t *buf, uint32_t size, uint8_t num_packets, uint8_t pid) { __IO uint32_t tmpreg; uint8_t is_oddframe; @@ -241,7 +233,7 @@ static inline void dwc2_chan_transfer(uint8_t ch_num, uint8_t ep_addr, uint32_t USB_OTG_HC(ch_num)->HCCHAR = tmpreg; } -static void dwc2_halt(uint8_t ch_num) +static void dwc2_halt(struct usbh_bus *bus, uint8_t ch_num) { volatile uint32_t count = 0U; uint32_t HcEpType = (USB_OTG_HC(ch_num)->HCCHAR & USB_OTG_HCCHAR_EPTYP) >> 18; @@ -288,7 +280,7 @@ static void dwc2_halt(uint8_t ch_num) } } -static int usbh_reset_port(const uint8_t port) +static int usbh_reset_port(struct usbh_bus *bus, const uint8_t port) { __IO uint32_t hprt0 = 0U; @@ -308,7 +300,7 @@ static int usbh_reset_port(const uint8_t port) return 0; } -static uint8_t usbh_get_port_speed(const uint8_t port) +static uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) { __IO uint32_t hprt0 = 0U; uint8_t speed; @@ -332,7 +324,7 @@ static uint8_t usbh_get_port_speed(const uint8_t port) * @brief dwc2_get_glb_intstatus: return the global USB interrupt status * @retval status */ -static inline uint32_t dwc2_get_glb_intstatus(void) +static inline uint32_t dwc2_get_glb_intstatus(struct usbh_bus *bus) { uint32_t tmpreg; @@ -342,13 +334,13 @@ static inline uint32_t dwc2_get_glb_intstatus(void) return tmpreg; } -static int dwc2_chan_alloc(void) +static int dwc2_chan_alloc(struct usbh_bus *bus) { int chidx; for (chidx = 0; chidx < CONFIG_USBHOST_PIPE_NUM; chidx++) { - if (!g_dwc2_hcd.chan_pool[chidx].inuse) { - g_dwc2_hcd.chan_pool[chidx].inuse = true; + if (!g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].inuse) { + g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].inuse = true; return chidx; } } @@ -358,7 +350,11 @@ static int dwc2_chan_alloc(void) static void dwc2_chan_free(struct dwc2_chan *chan) { + size_t flags; + + flags = usb_osal_enter_critical_section(); chan->inuse = false; + usb_osal_leave_critical_section(flags); } static uint8_t dwc2_calculate_packet_num(uint32_t input_size, uint8_t ep_addr, uint16_t ep_mps, uint32_t *output_size) @@ -384,77 +380,77 @@ static uint8_t dwc2_calculate_packet_num(uint32_t input_size, uint8_t ep_addr, u return num_packets; } -static void dwc2_control_urb_init(uint8_t chidx, struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) +static void dwc2_control_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) { struct dwc2_chan *chan; - chan = &g_dwc2_hcd.chan_pool[chidx]; + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx]; if (chan->ep0_state == DWC2_EP0_STATE_SETUP) /* fill setup */ { chan->num_packets = dwc2_calculate_packet_num(8, 0x00, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); - dwc2_chan_init(chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); - dwc2_chan_transfer(chidx, 0x00, (uint32_t *)setup, chan->xferlen, chan->num_packets, HC_PID_SETUP); + dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x00, (uint32_t *)setup, chan->xferlen, chan->num_packets, HC_PID_SETUP); } else if (chan->ep0_state == DWC2_EP0_STATE_INDATA) /* fill in data */ { chan->num_packets = dwc2_calculate_packet_num(setup->wLength, 0x80, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); - dwc2_chan_init(chidx, urb->hport->dev_addr, 0x80, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); - dwc2_chan_transfer(chidx, 0x80, (uint32_t *)buffer, chan->xferlen, chan->num_packets, HC_PID_DATA1); + dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x80, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x80, (uint32_t *)buffer, chan->xferlen, chan->num_packets, HC_PID_DATA1); } else if (chan->ep0_state == DWC2_EP0_STATE_OUTDATA) /* fill out data */ { chan->num_packets = dwc2_calculate_packet_num(setup->wLength, 0x00, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); - dwc2_chan_init(chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); - dwc2_chan_transfer(chidx, 0x00, (uint32_t *)buffer, chan->xferlen, chan->num_packets, HC_PID_DATA1); + dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x00, (uint32_t *)buffer, chan->xferlen, chan->num_packets, HC_PID_DATA1); } else if (chan->ep0_state == DWC2_EP0_STATE_INSTATUS) /* fill in status */ { chan->num_packets = dwc2_calculate_packet_num(0, 0x80, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); - dwc2_chan_init(chidx, urb->hport->dev_addr, 0x80, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); - dwc2_chan_transfer(chidx, 0x80, NULL, chan->xferlen, chan->num_packets, HC_PID_DATA1); + dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x80, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x80, NULL, chan->xferlen, chan->num_packets, HC_PID_DATA1); } else if (chan->ep0_state == DWC2_EP0_STATE_OUTSTATUS) /* fill out status */ { chan->num_packets = dwc2_calculate_packet_num(0, 0x00, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); - dwc2_chan_init(chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); - dwc2_chan_transfer(chidx, 0x00, NULL, chan->xferlen, chan->num_packets, HC_PID_DATA1); + dwc2_chan_init(bus, chidx, urb->hport->dev_addr, 0x00, USB_ENDPOINT_TYPE_CONTROL, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); + dwc2_chan_transfer(bus, chidx, 0x00, NULL, chan->xferlen, chan->num_packets, HC_PID_DATA1); } } -static void dwc2_bulk_intr_urb_init(uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +static void dwc2_bulk_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) { struct dwc2_chan *chan; - chan = &g_dwc2_hcd.chan_pool[chidx]; + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx]; chan->num_packets = dwc2_calculate_packet_num(buflen, urb->ep->bEndpointAddress, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); - dwc2_chan_init(chidx, urb->hport->dev_addr, urb->ep->bEndpointAddress, USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes), USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); - dwc2_chan_transfer(chidx, urb->ep->bEndpointAddress, (uint32_t *)buffer, chan->xferlen, chan->num_packets, urb->data_toggle); + dwc2_chan_init(bus, chidx, urb->hport->dev_addr, urb->ep->bEndpointAddress, USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes), USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); + dwc2_chan_transfer(bus, chidx, urb->ep->bEndpointAddress, (uint32_t *)buffer, chan->xferlen, chan->num_packets, urb->data_toggle); } -static void dwc2_iso_urb_init(uint8_t chidx, struct usbh_urb *urb, struct usbh_iso_frame_packet *iso_packet) +static void dwc2_iso_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, struct usbh_iso_frame_packet *iso_packet) { struct dwc2_chan *chan; - chan = &g_dwc2_hcd.chan_pool[chidx]; + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx]; chan->num_packets = dwc2_calculate_packet_num(iso_packet->transfer_buffer_length, urb->ep->bEndpointAddress, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), &chan->xferlen); - dwc2_chan_init(chidx, urb->hport->dev_addr, urb->ep->bEndpointAddress, USB_ENDPOINT_TYPE_ISOCHRONOUS, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); - dwc2_chan_transfer(chidx, urb->ep->bEndpointAddress, (uint32_t *)iso_packet->transfer_buffer, chan->xferlen, chan->num_packets, HC_PID_DATA0); + dwc2_chan_init(bus, chidx, urb->hport->dev_addr, urb->ep->bEndpointAddress, USB_ENDPOINT_TYPE_ISOCHRONOUS, USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize), urb->hport->speed); + dwc2_chan_transfer(bus, chidx, urb->ep->bEndpointAddress, (uint32_t *)iso_packet->transfer_buffer, chan->xferlen, chan->num_packets, HC_PID_DATA0); } -__WEAK void usb_hc_low_level_init(void) +__WEAK void usb_hc_low_level_init(struct usbh_bus *bus) { } -int usb_hc_init(void) +int usb_hc_init(struct usbh_bus *bus) { int ret; - memset(&g_dwc2_hcd, 0, sizeof(struct dwc2_hcd)); + memset(&g_dwc2_hcd[bus->hcd.hcd_id], 0, sizeof(struct dwc2_hcd)); for (uint8_t chidx = 0; chidx < CONFIG_USBHOST_PIPE_NUM; chidx++) { - g_dwc2_hcd.chan_pool[chidx].waitsem = usb_osal_sem_create(0); + g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].waitsem = usb_osal_sem_create(0); } - usb_hc_low_level_init(); + usb_hc_low_level_init(bus); USB_LOG_INFO("========== dwc2 hcd params ==========\r\n"); USB_LOG_INFO("GCCFG:%08x\r\n", USB_OTG_GLB->GCCFG); @@ -478,10 +474,10 @@ int usb_hc_init(void) /* This is vendor register */ USB_OTG_GLB->GCCFG = usbh_get_dwc2_gccfg_conf(); - ret = dwc2_core_init(); + ret = dwc2_core_init(bus); /* Force Host Mode*/ - dwc2_set_mode(USB_OTG_MODE_HOST); + dwc2_set_mode(bus, USB_OTG_MODE_HOST); usb_osal_msleep(50); /* Restart the Phy Clock */ @@ -490,8 +486,8 @@ int usb_hc_init(void) /* Set default Max speed support */ USB_OTG_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS); - ret = dwc2_flush_txfifo(0x10U); - ret = dwc2_flush_rxfifo(); + ret = dwc2_flush_txfifo(bus, 0x10U); + ret = dwc2_flush_rxfifo(bus); /* Clear all pending HC Interrupts */ for (uint8_t i = 0U; i < CONFIG_USBHOST_PIPE_NUM; i++) { @@ -499,7 +495,7 @@ int usb_hc_init(void) USB_OTG_HC(i)->HCINTMSK = 0U; } - dwc2_drivebus(1); + dwc2_drivebus(bus, 1); usb_osal_msleep(200); /* Disable all interrupts. */ @@ -525,15 +521,15 @@ int usb_hc_init(void) return 0; } -int usb_hc_deinit(void) +int usb_hc_deinit(struct usbh_bus *bus) { volatile uint32_t count = 0U; uint32_t value; USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; - dwc2_flush_txfifo(0x10U); - dwc2_flush_rxfifo(); + dwc2_flush_txfifo(bus, 0x10U); + dwc2_flush_rxfifo(bus); /* Flush out any leftover queued requests. */ for (uint32_t i = 0U; i <= 15U; i++) { @@ -566,22 +562,22 @@ int usb_hc_deinit(void) USB_OTG_HOST->HAINT = 0xFFFFFFFFU; USB_OTG_GLB->GINTSTS = 0xFFFFFFFFU; - dwc2_drivebus(0); + dwc2_drivebus(bus, 0); usb_osal_msleep(200); for (uint8_t chidx = 0; chidx < CONFIG_USBHOST_PIPE_NUM; chidx++) { - usb_osal_sem_delete(g_dwc2_hcd.chan_pool[chidx].waitsem); + usb_osal_sem_delete(g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx].waitsem); } return 0; } -uint16_t usbh_get_frame_number(void) +uint16_t usbh_get_frame_number(struct usbh_bus *bus) { return (USB_OTG_HOST->HFNUM & USB_OTG_HFNUM_FRNUM); } -int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) { __IO uint32_t hprt0; uint8_t nports; @@ -637,13 +633,13 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) case HUB_PORT_FEATURE_POWER: break; case HUB_PORT_FEATURE_C_CONNECTION: - g_dwc2_hcd.port_csc = 0; + g_dwc2_hcd[bus->hcd.hcd_id].port_csc = 0; break; case HUB_PORT_FEATURE_C_ENABLE: - g_dwc2_hcd.port_pec = 0; + g_dwc2_hcd[bus->hcd.hcd_id].port_pec = 0; break; case HUB_PORT_FEATURE_C_OVER_CURREN: - g_dwc2_hcd.port_occ = 0; + g_dwc2_hcd[bus->hcd.hcd_id].port_occ = 0; break; case HUB_PORT_FEATURE_C_RESET: break; @@ -663,7 +659,7 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) USB_OTG_HPRT &= ~USB_OTG_HPRT_PPWR; break; case HUB_PORT_FEATURE_RESET: - usbh_reset_port(port); + usbh_reset_port(bus, port); break; default: @@ -677,13 +673,13 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) hprt0 = USB_OTG_HPRT; status = 0; - if (g_dwc2_hcd.port_csc) { + if (g_dwc2_hcd[bus->hcd.hcd_id].port_csc) { status |= (1 << HUB_PORT_FEATURE_C_CONNECTION); } - if (g_dwc2_hcd.port_pec) { + if (g_dwc2_hcd[bus->hcd.hcd_id].port_pec) { status |= (1 << HUB_PORT_FEATURE_C_ENABLE); } - if (g_dwc2_hcd.port_occ) { + if (g_dwc2_hcd[bus->hcd.hcd_id].port_occ) { status |= (1 << HUB_PORT_FEATURE_C_OVER_CURREN); } @@ -692,9 +688,9 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) } if (hprt0 & USB_OTG_HPRT_PENA) { status |= (1 << HUB_PORT_FEATURE_ENABLE); - if (usbh_get_port_speed(port) == USB_SPEED_LOW) { + if (usbh_get_port_speed(bus, port) == USB_SPEED_LOW) { status |= (1 << HUB_PORT_FEATURE_LOWSPEED); - } else if (usbh_get_port_speed(port) == USB_SPEED_HIGH) { + } else if (usbh_get_port_speed(bus, port) == USB_SPEED_HIGH) { status |= (1 << HUB_PORT_FEATURE_HIGHSPEED); } } @@ -720,11 +716,12 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) int usbh_submit_urb(struct usbh_urb *urb) { struct dwc2_chan *chan; + struct usbh_bus *bus; size_t flags; int ret = 0; int chidx; - if (!urb || !urb->hport || !urb->ep) { + if (!urb || !urb->hport || !urb->ep || !urb->hport->bus) { return -USB_ERR_INVAL; } @@ -733,6 +730,8 @@ int usbh_submit_urb(struct usbh_urb *urb) return -USB_ERR_INVAL; } + bus = urb->hport->bus; + if (!(USB_OTG_HPRT & USB_OTG_HPRT_PCSTS) || !urb->hport->connected) { return -USB_ERR_NOTCONN; } @@ -743,13 +742,13 @@ int usbh_submit_urb(struct usbh_urb *urb) flags = usb_osal_enter_critical_section(); - chidx = dwc2_chan_alloc(); + chidx = dwc2_chan_alloc(bus); if (chidx == -1) { usb_osal_leave_critical_section(flags); return -USB_ERR_NOMEM; } - chan = &g_dwc2_hcd.chan_pool[chidx]; + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[chidx]; chan->chidx = chidx; chan->urb = urb; @@ -762,11 +761,11 @@ int usbh_submit_urb(struct usbh_urb *urb) switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { case USB_ENDPOINT_TYPE_CONTROL: chan->ep0_state = DWC2_EP0_STATE_SETUP; - dwc2_control_urb_init(chidx, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + dwc2_control_urb_init(bus, chidx, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); break; case USB_ENDPOINT_TYPE_BULK: case USB_ENDPOINT_TYPE_INTERRUPT: - dwc2_bulk_intr_urb_init(chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); + dwc2_bulk_intr_urb_init(bus, chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); break; case USB_ENDPOINT_TYPE_ISOCHRONOUS: break; @@ -795,17 +794,20 @@ errout_timeout: int usbh_kill_urb(struct usbh_urb *urb) { struct dwc2_chan *chan; + struct usbh_bus *bus; size_t flags; - if (!urb || !urb->hcpriv) { + if (!urb || !urb->hcpriv || !urb->hport->bus) { return -USB_ERR_INVAL; } + bus = urb->hport->bus; + flags = usb_osal_enter_critical_section(); chan = (struct dwc2_chan *)urb->hcpriv; - dwc2_halt(chan->chidx); + dwc2_halt(bus, chan->chidx); CLEAR_HC_INT(chan->chidx, USB_OTG_HCINT_CHH); chan->urb = NULL; @@ -848,7 +850,7 @@ static inline void dwc2_urb_waitup(struct usbh_urb *urb) } } -static void dwc2_inchan_irq_handler(uint8_t ch_num) +static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) { uint32_t chan_intstatus; struct dwc2_chan *chan; @@ -856,7 +858,7 @@ static void dwc2_inchan_irq_handler(uint8_t ch_num) chan_intstatus = (USB_OTG_HC(ch_num)->HCINT) & (USB_OTG_HC((uint32_t)ch_num)->HCINTMSK); - chan = &g_dwc2_hcd.chan_pool[ch_num]; + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[ch_num]; urb = chan->urb; //printf("s1:%08x\r\n", chan_intstatus); @@ -864,51 +866,51 @@ static void dwc2_inchan_irq_handler(uint8_t ch_num) urb->errorcode = 0; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_XFRC); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_AHBERR) == USB_OTG_HCINT_AHBERR) { urb->errorcode = -USB_ERR_IO; USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); CLEAR_HC_INT(ch_num, USB_OTG_HCINT_AHBERR); } else if ((chan_intstatus & USB_OTG_HCINT_STALL) == USB_OTG_HCINT_STALL) { urb->errorcode = -USB_ERR_STALL; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_STALL); CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_NAK) == USB_OTG_HCINT_NAK) { urb->errorcode = -USB_ERR_NAK; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_ACK) == USB_OTG_HCINT_ACK) { CLEAR_HC_INT(ch_num, USB_OTG_HCINT_ACK); } else if ((chan_intstatus & USB_OTG_HCINT_NYET) == USB_OTG_HCINT_NYET) { urb->errorcode = -USB_ERR_NAK; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NYET); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_TXERR) == USB_OTG_HCINT_TXERR) { urb->errorcode = -USB_ERR_IO; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_TXERR); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_BBERR) == USB_OTG_HCINT_BBERR) { urb->errorcode = -USB_ERR_BABBLE; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_BBERR); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_FRMOR) == USB_OTG_HCINT_FRMOR) { urb->errorcode = -USB_ERR_IO; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_FRMOR); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_DTERR) == USB_OTG_HCINT_DTERR) { urb->errorcode = -USB_ERR_DT; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_DTERR); CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH) { USB_MASK_HALT_HC_INT(ch_num); CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH); @@ -931,7 +933,7 @@ static void dwc2_inchan_irq_handler(uint8_t ch_num) if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) { if (chan->ep0_state == DWC2_EP0_STATE_INDATA) { chan->ep0_state = DWC2_EP0_STATE_OUTSTATUS; - dwc2_control_urb_init(ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); } else if (chan->ep0_state == DWC2_EP0_STATE_INSTATUS) { chan->ep0_state = DWC2_EP0_STATE_SETUP; dwc2_urb_waitup(urb); @@ -946,7 +948,7 @@ static void dwc2_inchan_irq_handler(uint8_t ch_num) } } -static void dwc2_outchan_irq_handler(uint8_t ch_num) +static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) { uint32_t chan_intstatus; struct dwc2_chan *chan; @@ -955,7 +957,7 @@ static void dwc2_outchan_irq_handler(uint8_t ch_num) chan_intstatus = (USB_OTG_HC(ch_num)->HCINT) & (USB_OTG_HC((uint32_t)ch_num)->HCINTMSK); - chan = &g_dwc2_hcd.chan_pool[ch_num]; + chan = &g_dwc2_hcd[bus->hcd.hcd_id].chan_pool[ch_num]; urb = chan->urb; //printf("s2:%08x\r\n", chan_intstatus); @@ -963,48 +965,48 @@ static void dwc2_outchan_irq_handler(uint8_t ch_num) urb->errorcode = 0; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_XFRC); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_AHBERR) == USB_OTG_HCINT_AHBERR) { urb->errorcode = -USB_ERR_IO; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_AHBERR); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_STALL) == USB_OTG_HCINT_STALL) { urb->errorcode = -USB_ERR_STALL; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_STALL); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_NAK) == USB_OTG_HCINT_NAK) { urb->errorcode = -USB_ERR_NAK; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_NYET) == USB_OTG_HCINT_NYET) { urb->errorcode = -USB_ERR_NAK; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NYET); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_TXERR) == USB_OTG_HCINT_TXERR) { urb->errorcode = -USB_ERR_IO; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_TXERR); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_BBERR) == USB_OTG_HCINT_BBERR) { urb->errorcode = -USB_ERR_BABBLE; USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); CLEAR_HC_INT(ch_num, USB_OTG_HCINT_BBERR); } else if ((chan_intstatus & USB_OTG_HCINT_FRMOR) == USB_OTG_HCINT_FRMOR) { urb->errorcode = -USB_ERR_IO; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_FRMOR); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_DTERR) == USB_OTG_HCINT_DTERR) { urb->errorcode = -USB_ERR_DT; CLEAR_HC_INT(ch_num, USB_OTG_HCINT_DTERR); CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); USB_UNMASK_HALT_HC_INT(ch_num); - dwc2_halt(ch_num); + dwc2_halt(bus, ch_num); } else if ((chan_intstatus & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH) { USB_MASK_HALT_HC_INT(ch_num); CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH); @@ -1035,10 +1037,10 @@ static void dwc2_outchan_irq_handler(uint8_t ch_num) } else { chan->ep0_state = DWC2_EP0_STATE_INSTATUS; } - dwc2_control_urb_init(ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); } else if (chan->ep0_state == DWC2_EP0_STATE_OUTDATA) { chan->ep0_state = DWC2_EP0_STATE_INSTATUS; - dwc2_control_urb_init(ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); } else if (chan->ep0_state == DWC2_EP0_STATE_OUTSTATUS) { chan->ep0_state = DWC2_EP0_STATE_SETUP; dwc2_urb_waitup(urb); @@ -1053,7 +1055,7 @@ static void dwc2_outchan_irq_handler(uint8_t ch_num) } } -static void dwc2_port_irq_handler(void) +static void dwc2_port_irq_handler(struct usbh_bus *bus) { __IO uint32_t hprt0, hprt0_dup, regval; @@ -1067,16 +1069,17 @@ static void dwc2_port_irq_handler(void) /* Check whether Port Connect detected */ if ((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET) { if ((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS) { - usbh_roothub_thread_wakeup(1); + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); } hprt0_dup |= USB_OTG_HPRT_PCDET; - g_dwc2_hcd.port_csc = 1; + g_dwc2_hcd[bus->hcd.hcd_id].port_csc = 1; } /* Check whether Port Enable Changed */ if ((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG) { hprt0_dup |= USB_OTG_HPRT_PENCHNG; - g_dwc2_hcd.port_pec = 1; + g_dwc2_hcd[bus->hcd.hcd_id].port_pec = 1; if ((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA) { #if defined(CONFIG_USB_DWC2_ULPI_PHY) @@ -1106,16 +1109,16 @@ static void dwc2_port_irq_handler(void) /* Check for an overcurrent */ if ((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG) { hprt0_dup |= USB_OTG_HPRT_POCCHNG; - g_dwc2_hcd.port_occ = 1; + g_dwc2_hcd[bus->hcd.hcd_id].port_occ = 1; } /* Clear Port Interrupts */ USB_OTG_HPRT = hprt0_dup; } -void USBH_IRQHandler(void) +void USBH_IRQHandler(struct usbh_bus *bus) { uint32_t gint_status, chan_int; - gint_status = dwc2_get_glb_intstatus(); + gint_status = dwc2_get_glb_intstatus(bus); if ((USB_OTG_GLB->GINTSTS & 0x1U) == USB_OTG_MODE_HOST) { /* Avoid spurious interrupt */ if (gint_status == 0) { @@ -1123,11 +1126,12 @@ void USBH_IRQHandler(void) } if (gint_status & USB_OTG_GINTSTS_HPRTINT) { - dwc2_port_irq_handler(); + dwc2_port_irq_handler(bus); } if (gint_status & USB_OTG_GINTSTS_DISCINT) { - g_dwc2_hcd.port_csc = 1; - usbh_roothub_thread_wakeup(1); + g_dwc2_hcd[bus->hcd.hcd_id].port_csc = 1; + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_DISCINT; } @@ -1136,9 +1140,9 @@ void USBH_IRQHandler(void) for (uint8_t i = 0U; i < CONFIG_USBHOST_PIPE_NUM; i++) { if ((chan_int & (1UL << (i & 0xFU))) != 0U) { if ((USB_OTG_HC(i)->HCCHAR & USB_OTG_HCCHAR_EPDIR) == USB_OTG_HCCHAR_EPDIR) { - dwc2_inchan_irq_handler(i); + dwc2_inchan_irq_handler(bus, i); } else { - dwc2_outchan_irq_handler(i); + dwc2_outchan_irq_handler(bus, i); } } } diff --git a/port/ehci/usb_ehci_priv.h b/port/ehci/usb_ehci_priv.h index 60abf2c9..c0b17df5 100644 --- a/port/ehci/usb_ehci_priv.h +++ b/port/ehci/usb_ehci_priv.h @@ -5,12 +5,8 @@ #include "usbh_hub.h" #include "usb_hc_ehci.h" -#ifndef USBH_IRQHandler -#define USBH_IRQHandler USBH_IRQHandler -#endif - -#define EHCI_HCCR ((struct ehci_hccr *)CONFIG_USB_EHCI_HCCR_BASE) -#define EHCI_HCOR ((struct ehci_hcor *)CONFIG_USB_EHCI_HCOR_BASE) +#define EHCI_HCCR ((struct ehci_hccr *)(bus->hcd.reg_base)) +#define EHCI_HCOR ((struct ehci_hcor *)(bus->hcd.reg_base + CONFIG_USB_EHCI_HCOR_OFFSET)) #define EHCI_PTR2ADDR(x) ((uint32_t)(x) & ~0x1F) #define EHCI_ADDR2QH(x) ((struct ehci_qh_hw *)((uint32_t)(x) & ~0x1F)) @@ -31,7 +27,7 @@ #define CONFIG_USB_EHCI_QTD_NUM (CONFIG_USBHOST_PIPE_NUM + 3) #define CONFIG_USB_EHCI_ITD_NUM 20 -extern uint8_t usbh_get_port_speed(const uint8_t port); +extern uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port); struct ehci_qh_hw { struct ehci_qh hw; @@ -63,11 +59,11 @@ struct ehci_hcd { bool ehci_itd_used[CONFIG_USB_EHCI_ITD_NUM]; }; -extern struct ehci_hcd g_ehci_hcd; -extern uint32_t g_framelist[]; +extern struct ehci_hcd g_ehci_hcd[CONFIG_USBHOST_MAX_BUS]; +extern uint32_t g_framelist[CONFIG_USBHOST_MAX_BUS][CONFIG_USB_EHCI_FRAME_LIST_SIZE]; -int ehci_iso_urb_init(struct usbh_urb *urb); -void ehci_remove_itd_urb(struct usbh_urb *urb); -void ehci_scan_isochronous_list(void); +int ehci_iso_urb_init(struct usbh_bus *bus, struct usbh_urb *urb); +void ehci_remove_itd_urb(struct usbh_bus *bus, struct usbh_urb *urb); +void ehci_scan_isochronous_list(struct usbh_bus *bus); #endif diff --git a/port/ehci/usb_glue_aic.c b/port/ehci/usb_glue_aic.c index dde38929..a6fb401f 100644 --- a/port/ehci/usb_glue_aic.c +++ b/port/ehci/usb_glue_aic.c @@ -10,9 +10,16 @@ #include "usbh_core.h" #include "usb_ehci_priv.h" -extern void USBH_IRQHandler(void); +extern void USBH_IRQHandler(struct usbh_bus *bus); -void usb_hc_low_level_init(void) +const uint8_t aic_irq_table[] = { + USB_HOST0_EHCI_IRQn, +#ifdef HPM_USB1_BASE + USB_HOST1_EHCI_IRQn +#endif +}; + +void usb_hc_low_level_init(struct usbh_bus *bus) { uint32_t val; @@ -22,13 +29,13 @@ void usb_hc_low_level_init(void) #endif /* set phy type: UTMI/ULPI */ - val = readl((volatile void *)(unsigned long)(CONFIG_USB_EHCI_HCCR_BASE+0x800)); + val = readl((volatile void *)(unsigned long)(bus->hcd.reg_base+0x800)); #ifdef FPGA_BOARD_ARTINCHIP /* fpga phy type = ULPI */ - writel((val & ~0x1U), (volatile void *)(unsigned long)(CONFIG_USB_EHCI_HCCR_BASE+0x800)); + writel((val & ~0x1U), (volatile void *)(unsigned long)(bus->hcd.reg_base+0x800)); #else /* board phy type = UTMI */ - writel((val | 0x1), (volatile void *)(unsigned long)(CONFIG_USB_EHCI_HCCR_BASE+0x800)); + writel((val | 0x1), (volatile void *)(unsigned long)(bus->hcd.reg_base+0x800)); #endif #if 0 @@ -37,9 +44,9 @@ void usb_hc_low_level_init(void) Must increase the OUT threshold to avoid underrun. (FIFO size - 4) */ #ifdef FPGA_BOARD_ARTINCHIP - writel((32 | (127 << 16)), (volatile void *)(unsigned long)(CONFIG_USB_EHCI_HCCR_BASE+0x94)); + writel((32 | (127 << 16)), (volatile void *)(unsigned long)(bus->hcd.reg_base+0x94)); #else - writel((32 | (32 << 16)), (volatile void *)(unsigned long)(CONFIG_USB_EHCI_HCCR_BASE+0x94)); + writel((32 | (32 << 16)), (volatile void *)(unsigned long)(bus->hcd.reg_base+0x94)); #endif #endif @@ -55,12 +62,12 @@ void usb_hc_low_level_init(void) aicos_udelay(300); /* register interrupt callback */ - aicos_request_irq(CONFIG_USB_EHCI_IRQ_NUM, (irq_handler_t)USBH_IRQHandler, - 0, "usb_host_ehci", NULL); - aicos_irq_enable(CONFIG_USB_EHCI_IRQ_NUM); + aicos_request_irq(aic_irq_table[bus->hcd.hcd_id], (irq_handler_t)USBH_IRQHandler, + 0, "usb_host_ehci", bus); + aicos_irq_enable(aic_irq_table[bus->hcd.hcd_id]); } -uint8_t usbh_get_port_speed(const uint8_t port) +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) { /* Defined by individual manufacturers */ uint32_t regval; diff --git a/port/ehci/usb_glue_bouffalo.c b/port/ehci/usb_glue_bouffalo.c index c3318a89..90993153 100644 --- a/port/ehci/usb_glue_bouffalo.c +++ b/port/ehci/usb_glue_bouffalo.c @@ -32,7 +32,7 @@ #define USB_SOF_TIMER_MASK_AFTER_RESET_HS (0x44C) #define USB_SOF_TIMER_MASK_AFTER_RESET_FS (0x2710) -extern void USBH_IRQHandler(); +extern void USBH_IRQHandler(struct usbh_bus *bus); static void bflb_usb_phy_init(void) { @@ -83,7 +83,7 @@ static void bflb_usb_phy_init(void) bflb_mtimer_delay_ms(2); } -void usb_hc_low_level_init(void) +void usb_hc_low_level_init(struct usbh_bus *bus) { uint32_t regval; @@ -117,7 +117,7 @@ void usb_hc_low_level_init(void) putreg32(regval, BLFB_USB_BASE + USB_GLB_INT_OFFSET); } -uint8_t usbh_get_port_speed(const uint8_t port) +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) { uint8_t speed = 3; diff --git a/port/ehci/usb_glue_hpm.c b/port/ehci/usb_glue_hpm.c index 327f9241..afbef86e 100644 --- a/port/ehci/usb_glue_hpm.c +++ b/port/ehci/usb_glue_hpm.c @@ -7,10 +7,27 @@ #error "hpm ehci must set CONFIG_USB_EHCI_HPMICRO=1" #endif -#if !defined(CONFIG_HPM_USBH_BASE) || !defined(CONFIG_HPM_USBH_IRQn) -#error "hpm ehci must config CONFIG_HPM_USBH_BASE and CONFIG_HPM_USBH_IRQn" +#if !defined(CONFIG_USB_EHCI_HCOR_OFFSET) || CONFIG_USB_EHCI_HCOR_OFFSET != 0x140 +#error "hpm ehci must config CONFIG_USB_EHCI_HCOR_OFFSET to 0x140" #endif +#if defined(CONFIG_USB_EHCI_PRINT_HW_PARAM) || !defined(CONFIG_USB_EHCI_PORT_POWER) +#error "hpm ehci must enable CONFIG_USB_EHCI_PORT_POWER and disable CONFIG_USB_EHCI_PRINT_HW_PARAM" +#endif + +struct usbh_bus *hpm_usb_bus0; + +#ifdef HPM_USB1_BASE +struct usbh_bus *hpm_usb_bus1; +#endif + +const uint8_t hpm_irq_table[] = { + IRQn_USB0, +#ifdef HPM_USB1_BASE + IRQn_USB1 +#endif +}; + static void usb_host_mode_init(USB_Type *ptr) { /* Set mode to host, must be set immediately after reset */ @@ -30,23 +47,23 @@ static void usb_host_mode_init(USB_Type *ptr) ptr->USBCMD &= ~USB_USBCMD_ITC_MASK; } -void usb_hc_low_level_init(void) +void usb_hc_low_level_init(struct usbh_bus *bus) { - usb_phy_init((USB_Type *)CONFIG_HPM_USBH_BASE); - intc_m_enable_irq(CONFIG_HPM_USBH_IRQn); + usb_phy_init((USB_Type *)(bus->hcd.reg_base)); + intc_m_enable_irq(hpm_irq_table[bus->hcd.hcd_id]); } -void usb_hc_low_level2_init(void) +void usb_hc_low_level2_init(struct usbh_bus *bus) { - usb_host_mode_init((USB_Type *)CONFIG_HPM_USBH_BASE); + usb_host_mode_init((USB_Type *)(bus->hcd.reg_base)); } -uint8_t usbh_get_port_speed(const uint8_t port) +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) { (void)port; uint8_t speed; - speed = usb_get_port_speed((USB_Type *)CONFIG_HPM_USBH_BASE); + speed = usb_get_port_speed((USB_Type *)(bus->hcd.reg_base)); if (speed == 0x00) { return USB_SPEED_FULL; @@ -61,10 +78,18 @@ uint8_t usbh_get_port_speed(const uint8_t port) return 0; } -extern void USBH_IRQHandler(void); +extern void USBH_IRQHandler(struct usbh_bus *bus); -void isr_usbh(void) +void isr_usbh0(void) { - USBH_IRQHandler(); + USBH_IRQHandler(hpm_usb_bus0); } -SDK_DECLARE_EXT_ISR_M(CONFIG_HPM_USBH_IRQn, isr_usbh) \ No newline at end of file +SDK_DECLARE_EXT_ISR_M(IRQn_USB0, isr_usbh0) + +#ifdef HPM_USB1_BASE +void isr_usbh1(void) +{ + USBH_IRQHandler(hpm_usb_bus1); +} +SDK_DECLARE_EXT_ISR_M(IRQn_USB1, isr_usbh1) +#endif diff --git a/port/ehci/usb_glue_intel.c b/port/ehci/usb_glue_intel.c index b2264b15..a66ee53a 100644 --- a/port/ehci/usb_glue_intel.c +++ b/port/ehci/usb_glue_intel.c @@ -11,7 +11,7 @@ static int ehci_slot; static int ehci_function; static int ehci_vector; -extern void USBH_IRQHandler(void *para); +extern void USBH_IRQHandler(struct usbh_bus *bus); void ehci_pci_scan(int bus, int slot, int fun, int vector) { @@ -21,7 +21,7 @@ void ehci_pci_scan(int bus, int slot, int fun, int vector) ehci_vector = vector; pci_read_config_dword(bus, slot, fun, PCI_BASE_ADDRESS_0, &echi_base); } -void usb_hc_low_level_init(void) +void usb_hc_low_level_init(struct usbh_bus *bus) { //set software own ehci uint32_t legacy_val; @@ -38,7 +38,7 @@ void usb_hc_low_level_init(void) "USBirq", RTEMS_INTERRUPT_SHARED, USBH_IRQHandler, - (void *)0); + (void *)bus); if (sc != RTEMS_SUCCESSFUL) { printf("USB install isr falied,%s\n", rtems_status_text(sc)); @@ -46,7 +46,7 @@ void usb_hc_low_level_init(void) } } -uint8_t usbh_get_port_speed(const uint8_t port) +uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) { printf("USB_SPEED_HIGH present\n"); return USB_SPEED_HIGH; diff --git a/port/ehci/usb_hc_ehci.c b/port/ehci/usb_hc_ehci.c index 1dc1ec01..a213ca9d 100644 --- a/port/ehci/usb_hc_ehci.c +++ b/port/ehci/usb_hc_ehci.c @@ -11,32 +11,32 @@ #define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */ #define EHCI_TUNE_MULT_TT 1 -struct ehci_hcd g_ehci_hcd; +struct ehci_hcd g_ehci_hcd[CONFIG_USBHOST_MAX_BUS]; -USB_NOCACHE_RAM_SECTION struct ehci_qh_hw ehci_qh_pool[CONFIG_USB_EHCI_QH_NUM]; -USB_NOCACHE_RAM_SECTION struct ehci_qtd_hw ehci_qtd_pool[CONFIG_USB_EHCI_QTD_NUM]; +USB_NOCACHE_RAM_SECTION struct ehci_qh_hw ehci_qh_pool[CONFIG_USBHOST_MAX_BUS][CONFIG_USB_EHCI_QH_NUM]; +USB_NOCACHE_RAM_SECTION struct ehci_qtd_hw ehci_qtd_pool[CONFIG_USBHOST_MAX_BUS][CONFIG_USB_EHCI_QTD_NUM]; /* The head of the asynchronous queue */ -USB_NOCACHE_RAM_SECTION struct ehci_qh_hw g_async_qh_head; +USB_NOCACHE_RAM_SECTION struct ehci_qh_hw g_async_qh_head[CONFIG_USBHOST_MAX_BUS]; /* The head of the periodic queue */ -USB_NOCACHE_RAM_SECTION struct ehci_qh_hw g_periodic_qh_head[EHCI_PERIOIDIC_QH_NUM]; +USB_NOCACHE_RAM_SECTION struct ehci_qh_hw g_periodic_qh_head[CONFIG_USBHOST_MAX_BUS][EHCI_PERIOIDIC_QH_NUM]; /* The frame list */ -USB_NOCACHE_RAM_SECTION uint32_t g_framelist[CONFIG_USB_EHCI_FRAME_LIST_SIZE] __attribute__((aligned(4096))); +USB_NOCACHE_RAM_SECTION uint32_t g_framelist[CONFIG_USBHOST_MAX_BUS][CONFIG_USB_EHCI_FRAME_LIST_SIZE] __attribute__((aligned(4096))); -static struct ehci_qh_hw *ehci_qh_alloc(void) +static struct ehci_qh_hw *ehci_qh_alloc(struct usbh_bus *bus) { struct ehci_qh_hw *qh; usb_osal_sem_t waitsem; size_t flags; for (uint32_t i = 0; i < CONFIG_USB_EHCI_QH_NUM; i++) { - if (!g_ehci_hcd.ehci_qh_used[i]) { + if (!g_ehci_hcd[bus->hcd.hcd_id].ehci_qh_used[i]) { flags = usb_osal_enter_critical_section(); - g_ehci_hcd.ehci_qh_used[i] = true; + g_ehci_hcd[bus->hcd.hcd_id].ehci_qh_used[i] = true; usb_osal_leave_critical_section(flags); - qh = &ehci_qh_pool[i]; + qh = &ehci_qh_pool[bus->hcd.hcd_id][i]; waitsem = qh->waitsem; memset(qh, 0, sizeof(struct ehci_qh_hw)); qh->hw.hlp = QTD_LIST_END; @@ -49,14 +49,14 @@ static struct ehci_qh_hw *ehci_qh_alloc(void) return NULL; } -static void ehci_qh_free(struct ehci_qh_hw *qh) +static void ehci_qh_free(struct usbh_bus *bus, struct ehci_qh_hw *qh) { size_t flags; for (uint32_t i = 0; i < CONFIG_USB_EHCI_QH_NUM; i++) { - if (&ehci_qh_pool[i] == qh) { + if (&ehci_qh_pool[bus->hcd.hcd_id][i] == qh) { flags = usb_osal_enter_critical_section(); - g_ehci_hcd.ehci_qh_used[i] = false; + g_ehci_hcd[bus->hcd.hcd_id].ehci_qh_used[i] = false; usb_osal_leave_critical_section(flags); qh->urb = NULL; @@ -65,18 +65,18 @@ static void ehci_qh_free(struct ehci_qh_hw *qh) } } -static struct ehci_qtd_hw *ehci_qtd_alloc(void) +static struct ehci_qtd_hw *ehci_qtd_alloc(struct usbh_bus *bus) { struct ehci_qtd_hw *qtd; size_t flags; for (uint32_t i = 0; i < CONFIG_USB_EHCI_QTD_NUM; i++) { - if (!g_ehci_hcd.ehci_qtd_used[i]) { + if (!g_ehci_hcd[bus->hcd.hcd_id].ehci_qtd_used[i]) { flags = usb_osal_enter_critical_section(); - g_ehci_hcd.ehci_qtd_used[i] = true; + g_ehci_hcd[bus->hcd.hcd_id].ehci_qtd_used[i] = true; usb_osal_leave_critical_section(flags); - qtd = &ehci_qtd_pool[i]; + qtd = &ehci_qtd_pool[bus->hcd.hcd_id][i]; memset(qtd, 0, sizeof(struct ehci_qtd_hw)); qtd->hw.next_qtd = QTD_LIST_END; qtd->hw.alt_next_qtd = QTD_LIST_END; @@ -87,14 +87,14 @@ static struct ehci_qtd_hw *ehci_qtd_alloc(void) return NULL; } -static void ehci_qtd_free(struct ehci_qtd_hw *qtd) +static void ehci_qtd_free(struct usbh_bus *bus, struct ehci_qtd_hw *qtd) { size_t flags; for (uint32_t i = 0; i < CONFIG_USB_EHCI_QTD_NUM; i++) { - if (&ehci_qtd_pool[i] == qtd) { + if (&ehci_qtd_pool[bus->hcd.hcd_id][i] == qtd) { flags = usb_osal_enter_critical_section(); - g_ehci_hcd.ehci_qtd_used[i] = false; + g_ehci_hcd[bus->hcd.hcd_id].ehci_qtd_used[i] = false; usb_osal_leave_critical_section(flags); qtd->urb = NULL; @@ -144,17 +144,17 @@ static int ehci_caculate_smask(int binterval) return (0x1 << (order % 8)); } -static struct ehci_qh_hw *ehci_get_periodic_qhead(uint8_t interval) +static struct ehci_qh_hw *ehci_get_periodic_qhead(struct usbh_bus *bus, uint8_t interval) { interval /= 8; for (uint8_t i = 0; i < EHCI_PERIOIDIC_QH_NUM - 1; i++) { interval >>= 1; if (interval == 0) { - return &g_periodic_qh_head[i]; + return &g_periodic_qh_head[bus->hcd.hcd_id][i]; } } - return &g_periodic_qh_head[EHCI_PERIOIDIC_QH_NUM - 1]; + return &g_periodic_qh_head[bus->hcd.hcd_id][EHCI_PERIOIDIC_QH_NUM - 1]; } static void ehci_qh_fill(struct ehci_qh_hw *qh, @@ -297,7 +297,7 @@ static void ehci_qtd_fill(struct ehci_qtd_hw *qtd, uint32_t bufaddr, size_t bufl qtd->total_len = buflen; } -static struct ehci_qh_hw *ehci_control_urb_init(struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) +static struct ehci_qh_hw *ehci_control_urb_init(struct usbh_bus *bus, struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) { struct ehci_qh_hw *qh = NULL; struct ehci_qtd_hw *qtd_setup = NULL; @@ -306,24 +306,24 @@ static struct ehci_qh_hw *ehci_control_urb_init(struct usbh_urb *urb, struct usb uint32_t token; size_t flags; - qh = ehci_qh_alloc(); + qh = ehci_qh_alloc(bus); if (qh == NULL) { return NULL; } - qtd_setup = ehci_qtd_alloc(); + qtd_setup = ehci_qtd_alloc(bus); if (buflen > 0) { - qtd_data = ehci_qtd_alloc(); + qtd_data = ehci_qtd_alloc(bus); } - qtd_status = ehci_qtd_alloc(); + qtd_status = ehci_qtd_alloc(bus); if (qtd_status == NULL) { - ehci_qh_free(qh); + ehci_qh_free(bus, qh); if (qtd_setup) { - ehci_qtd_free(qtd_setup); + ehci_qtd_free(bus, qtd_setup); } if (qtd_data) { - ehci_qtd_free(qtd_data); + ehci_qtd_free(bus, qtd_data); } return NULL; } @@ -397,7 +397,7 @@ static struct ehci_qh_hw *ehci_control_urb_init(struct usbh_urb *urb, struct usb qh->urb = urb; urb->hcpriv = qh; /* add qh into async list */ - ehci_qh_add_head(&g_async_qh_head, qh); + ehci_qh_add_head(&g_async_qh_head[bus->hcd.hcd_id], qh); EHCI_HCOR->usbcmd |= EHCI_USBCMD_ASEN; @@ -405,7 +405,7 @@ static struct ehci_qh_hw *ehci_control_urb_init(struct usbh_urb *urb, struct usb return qh; } -static struct ehci_qh_hw *ehci_bulk_urb_init(struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +static struct ehci_qh_hw *ehci_bulk_urb_init(struct usbh_bus *bus, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) { struct ehci_qh_hw *qh = NULL; struct ehci_qtd_hw *qtd = NULL; @@ -416,19 +416,19 @@ static struct ehci_qh_hw *ehci_bulk_urb_init(struct usbh_urb *urb, uint8_t *buff uint32_t token; size_t flags; - qh = ehci_qh_alloc(); + qh = ehci_qh_alloc(bus); if (qh == NULL) { return NULL; } for (uint32_t i = 0; i < CONFIG_USB_EHCI_QTD_NUM; i++) { - if (!g_ehci_hcd.ehci_qtd_used[i]) { + if (!g_ehci_hcd[bus->hcd.hcd_id].ehci_qtd_used[i]) { qtd_num++; } } if (qtd_num < ((buflen + 0x3fff) / 0x4000)) { - ehci_qh_free(qh); + ehci_qh_free(bus, qh); return NULL; } @@ -444,7 +444,7 @@ static struct ehci_qh_hw *ehci_bulk_urb_init(struct usbh_urb *urb, uint8_t *buff urb->hport->port); while (buflen >= 0) { - qtd = ehci_qtd_alloc(); + qtd = ehci_qtd_alloc(bus); if (buflen > 0x4000) { xfer_len = 0x4000; @@ -504,7 +504,7 @@ static struct ehci_qh_hw *ehci_bulk_urb_init(struct usbh_urb *urb, uint8_t *buff qh->urb = urb; urb->hcpriv = qh; /* add qh into async list */ - ehci_qh_add_head(&g_async_qh_head, qh); + ehci_qh_add_head(&g_async_qh_head[bus->hcd.hcd_id], qh); EHCI_HCOR->usbcmd |= EHCI_USBCMD_ASEN; @@ -512,7 +512,7 @@ static struct ehci_qh_hw *ehci_bulk_urb_init(struct usbh_urb *urb, uint8_t *buff return qh; } -static struct ehci_qh_hw *ehci_intr_urb_init(struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +static struct ehci_qh_hw *ehci_intr_urb_init(struct usbh_bus *bus, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) { struct ehci_qh_hw *qh = NULL; struct ehci_qtd_hw *qtd = NULL; @@ -523,19 +523,19 @@ static struct ehci_qh_hw *ehci_intr_urb_init(struct usbh_urb *urb, uint8_t *buff uint32_t token; size_t flags; - qh = ehci_qh_alloc(); + qh = ehci_qh_alloc(bus); if (qh == NULL) { return NULL; } for (uint32_t i = 0; i < CONFIG_USB_EHCI_QTD_NUM; i++) { - if (!g_ehci_hcd.ehci_qtd_used[i]) { + if (!g_ehci_hcd[bus->hcd.hcd_id].ehci_qtd_used[i]) { qtd_num++; } } if (qtd_num < ((buflen + 0x3fff) / 0x4000)) { - ehci_qh_free(qh); + ehci_qh_free(bus, qh); return NULL; } @@ -551,7 +551,7 @@ static struct ehci_qh_hw *ehci_intr_urb_init(struct usbh_urb *urb, uint8_t *buff urb->hport->port); while (buflen >= 0) { - qtd = ehci_qtd_alloc(); + qtd = ehci_qtd_alloc(bus); if (buflen > 0x4000) { xfer_len = 0x4000; @@ -612,9 +612,9 @@ static struct ehci_qh_hw *ehci_intr_urb_init(struct usbh_urb *urb, uint8_t *buff urb->hcpriv = qh; /* add qh into periodic list */ if (urb->hport->speed == USB_SPEED_HIGH) { - ehci_qh_add_head(ehci_get_periodic_qhead(urb->ep->bInterval), qh); + ehci_qh_add_head(ehci_get_periodic_qhead(bus, urb->ep->bInterval), qh); } else { - ehci_qh_add_head(ehci_get_periodic_qhead(urb->ep->bInterval * 8), qh); + ehci_qh_add_head(ehci_get_periodic_qhead(bus, urb->ep->bInterval * 8), qh); } EHCI_HCOR->usbcmd |= EHCI_USBCMD_PSEN; @@ -623,7 +623,7 @@ static struct ehci_qh_hw *ehci_intr_urb_init(struct usbh_urb *urb, uint8_t *buff return qh; } -static void ehci_urb_waitup(struct usbh_urb *urb) +static void ehci_urb_waitup(struct usbh_bus *bus, struct usbh_urb *urb) { struct ehci_qh_hw *qh; @@ -637,7 +637,7 @@ static void ehci_urb_waitup(struct usbh_urb *urb) urb->timeout = 0; usb_osal_sem_give(qh->waitsem); } else { - ehci_qh_free(qh); + ehci_qh_free(bus, qh); } if (urb->complete) { @@ -649,7 +649,7 @@ static void ehci_urb_waitup(struct usbh_urb *urb) } } -static void ehci_qh_scan_qtds(struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) +static void ehci_qh_scan_qtds(struct usbh_bus *bus, struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) { struct ehci_qtd_hw *qtd; @@ -660,13 +660,13 @@ static void ehci_qh_scan_qtds(struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) while (qtd) { qtd->urb->actual_length += (qtd->total_len - ((qtd->hw.token & QTD_TOKEN_NBYTES_MASK) >> QTD_TOKEN_NBYTES_SHIFT)); - ehci_qtd_free(qtd); + ehci_qtd_free(bus, qtd); qh->first_qtd = qtd->hw.next_qtd; qtd = EHCI_ADDR2QTD(qh->first_qtd); } } -static void ehci_check_qh(struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) +static void ehci_check_qh(struct usbh_bus *bus, struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) { struct usbh_urb *urb; struct ehci_qtd_hw *qtd; @@ -711,10 +711,10 @@ static void ehci_check_qh(struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) } } - ehci_qh_scan_qtds(qhead, qh); + ehci_qh_scan_qtds(bus, qhead, qh); if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { - ehci_urb_waitup(urb); + ehci_urb_waitup(bus, urb); } else { qh->remove_in_iaad = 1; @@ -722,7 +722,7 @@ static void ehci_check_qh(struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) } } -static void ehci_kill_qh(struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) +static void ehci_kill_qh(struct usbh_bus *bus, struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) { struct ehci_qtd_hw *qtd; @@ -731,19 +731,19 @@ static void ehci_kill_qh(struct ehci_qh_hw *qhead, struct ehci_qh_hw *qh) qtd = EHCI_ADDR2QTD(qh->first_qtd); while (qtd) { - ehci_qtd_free(qtd); + ehci_qtd_free(bus, qtd); qh->first_qtd = qtd->hw.next_qtd; qtd = EHCI_ADDR2QTD(qh->first_qtd); } } -static int usbh_reset_port(const uint8_t port) +static int usbh_reset_port(struct usbh_bus *bus, const uint8_t port) { volatile uint32_t timeout = 0; uint32_t regval; #if defined(CONFIG_USB_EHCI_HPMICRO) && CONFIG_USB_EHCI_HPMICRO - if ((*(volatile uint32_t *)(CONFIG_HPM_USBH_BASE + 0x224) & 0xc0) == (2 << 6)) { /* Hardcode for hpm */ + if ((*(volatile uint32_t *)(bus->hcd.reg_base + 0x224) & 0xc0) == (2 << 6)) { /* Hardcode for hpm */ EHCI_HCOR->portsc[port - 1] |= (1 << 29); } else { EHCI_HCOR->portsc[port - 1] &= ~(1 << 29); @@ -767,15 +767,15 @@ static int usbh_reset_port(const uint8_t port) return 0; } -__WEAK void usb_hc_low_level_init(void) +__WEAK void usb_hc_low_level_init(struct usbh_bus *bus) { } -__WEAK void usb_hc_low_level2_init(void) +__WEAK void usb_hc_low_level2_init(struct usbh_bus *bus) { } -int usb_hc_init(void) +int usb_hc_init(struct usbh_bus *bus) { uint32_t interval; struct ehci_qh_hw *qh; @@ -783,7 +783,7 @@ int usb_hc_init(void) volatile uint32_t timeout = 0; uint32_t regval; - memset(&g_ehci_hcd, 0, sizeof(struct ehci_hcd)); + memset(&g_ehci_hcd[bus->hcd.hcd_id], 0, sizeof(struct ehci_hcd)); if (sizeof(struct ehci_qh_hw) % 32) { USB_LOG_ERR("struct ehci_qh_hw is not align 32\r\n"); @@ -795,41 +795,41 @@ int usb_hc_init(void) } for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) { - qh = &ehci_qh_pool[index]; + qh = &ehci_qh_pool[bus->hcd.hcd_id][index]; qh->waitsem = usb_osal_sem_create(0); } - memset(&g_async_qh_head, 0, sizeof(struct ehci_qh_hw)); - g_async_qh_head.hw.hlp = QH_HLP_QH(&g_async_qh_head); - g_async_qh_head.hw.epchar = QH_EPCHAR_H; - g_async_qh_head.hw.overlay.next_qtd = QTD_LIST_END; - g_async_qh_head.hw.overlay.alt_next_qtd = QTD_LIST_END; - g_async_qh_head.hw.overlay.token = QTD_TOKEN_STATUS_HALTED; - g_async_qh_head.first_qtd = QTD_LIST_END; + memset(&g_async_qh_head[bus->hcd.hcd_id], 0, sizeof(struct ehci_qh_hw)); + g_async_qh_head[bus->hcd.hcd_id].hw.hlp = QH_HLP_QH(&g_async_qh_head[bus->hcd.hcd_id]); + g_async_qh_head[bus->hcd.hcd_id].hw.epchar = QH_EPCHAR_H; + g_async_qh_head[bus->hcd.hcd_id].hw.overlay.next_qtd = QTD_LIST_END; + g_async_qh_head[bus->hcd.hcd_id].hw.overlay.alt_next_qtd = QTD_LIST_END; + g_async_qh_head[bus->hcd.hcd_id].hw.overlay.token = QTD_TOKEN_STATUS_HALTED; + g_async_qh_head[bus->hcd.hcd_id].first_qtd = QTD_LIST_END; - memset(g_framelist, 0, sizeof(uint32_t) * CONFIG_USB_EHCI_FRAME_LIST_SIZE); + memset(g_framelist[bus->hcd.hcd_id], 0, sizeof(uint32_t) * CONFIG_USB_EHCI_FRAME_LIST_SIZE); for (int i = EHCI_PERIOIDIC_QH_NUM - 1; i >= 0; i--) { - memset(&g_periodic_qh_head[i], 0, sizeof(struct ehci_qh_hw)); - g_periodic_qh_head[i].hw.hlp = QH_HLP_END; - g_periodic_qh_head[i].hw.epchar = QH_EPCAPS_SSMASK(1); - g_periodic_qh_head[i].hw.overlay.next_qtd = QTD_LIST_END; - g_periodic_qh_head[i].hw.overlay.alt_next_qtd = QTD_LIST_END; - g_periodic_qh_head[i].hw.overlay.token = QTD_TOKEN_STATUS_HALTED; - g_periodic_qh_head[i].first_qtd = QTD_LIST_END; + memset(&g_periodic_qh_head[bus->hcd.hcd_id][i], 0, sizeof(struct ehci_qh_hw)); + g_periodic_qh_head[bus->hcd.hcd_id][i].hw.hlp = QH_HLP_END; + g_periodic_qh_head[bus->hcd.hcd_id][i].hw.epchar = QH_EPCAPS_SSMASK(1); + g_periodic_qh_head[bus->hcd.hcd_id][i].hw.overlay.next_qtd = QTD_LIST_END; + g_periodic_qh_head[bus->hcd.hcd_id][i].hw.overlay.alt_next_qtd = QTD_LIST_END; + g_periodic_qh_head[bus->hcd.hcd_id][i].hw.overlay.token = QTD_TOKEN_STATUS_HALTED; + g_periodic_qh_head[bus->hcd.hcd_id][i].first_qtd = QTD_LIST_END; interval = 1 << i; for (uint32_t j = interval - 1; j < CONFIG_USB_EHCI_FRAME_LIST_SIZE; j += interval) { - if (g_framelist[j] == 0) { - g_framelist[j] = QH_HLP_QH(&g_periodic_qh_head[i]); + if (g_framelist[bus->hcd.hcd_id][j] == 0) { + g_framelist[bus->hcd.hcd_id][j] = QH_HLP_QH(&g_periodic_qh_head[bus->hcd.hcd_id][i]); } else { - qh = EHCI_ADDR2QH(g_framelist[j]); + qh = EHCI_ADDR2QH(g_framelist[bus->hcd.hcd_id][j]); while (1) { - if (qh == &g_periodic_qh_head[i]) { + if (qh == &g_periodic_qh_head[bus->hcd.hcd_id][i]) { break; } if (qh->hw.hlp == QH_HLP_END) { - qh->hw.hlp = QH_HLP_QH(&g_periodic_qh_head[i]); + qh->hw.hlp = QH_HLP_QH(&g_periodic_qh_head[bus->hcd.hcd_id][i]); break; } @@ -839,7 +839,7 @@ int usb_hc_init(void) } } - usb_hc_low_level_init(); + usb_hc_low_level_init(bus); EHCI_HCOR->usbcmd |= EHCI_USBCMD_HCRESET; while (EHCI_HCOR->usbcmd & EHCI_USBCMD_HCRESET) { @@ -850,19 +850,19 @@ int usb_hc_init(void) } } - usb_hc_low_level2_init(); + usb_hc_low_level2_init(bus); EHCI_HCOR->usbintr = 0; EHCI_HCOR->usbsts = EHCI_HCOR->usbsts; -#if CONFIG_USB_EHCI_HCCR_BASE != 0 +#ifdef CONFIG_USB_EHCI_PRINT_HW_PARAM USB_LOG_INFO("EHCI HCIVERSION:%04x\r\n", (int)EHCI_HCCR->hciversion); USB_LOG_INFO("EHCI HCSPARAMS:%06x\r\n", (int)EHCI_HCCR->hcsparams); USB_LOG_INFO("EHCI HCCPARAMS:%04x\r\n", (int)EHCI_HCCR->hccparams); #endif /* Set the Current Asynchronous List Address. */ - EHCI_HCOR->asynclistaddr = EHCI_PTR2ADDR(&g_async_qh_head); + EHCI_HCOR->asynclistaddr = EHCI_PTR2ADDR(&g_async_qh_head[bus->hcd.hcd_id]); /* Set the Periodic Frame List Base Address. */ - EHCI_HCOR->periodiclistbase = EHCI_PTR2ADDR(g_framelist); + EHCI_HCOR->periodiclistbase = EHCI_PTR2ADDR(g_framelist[bus->hcd.hcd_id]); regval = 0; #if CONFIG_USB_EHCI_FRAME_LIST_SIZE == 1024 @@ -906,7 +906,7 @@ int usb_hc_init(void) return 0; } -int usb_hc_deinit(void) +int usb_hc_deinit(struct usbh_bus *bus) { struct ehci_qh_hw *qh; @@ -944,19 +944,19 @@ int usb_hc_deinit(void) EHCI_HCOR->usbsts = EHCI_HCOR->usbsts; for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) { - qh = &ehci_qh_pool[index]; + qh = &ehci_qh_pool[bus->hcd.hcd_id][index]; usb_osal_sem_delete(qh->waitsem); } return 0; } -uint16_t usbh_get_frame_number(void) +uint16_t usbh_get_frame_number(struct usbh_bus *bus) { return (((EHCI_HCOR->frindex & EHCI_FRINDEX_MASK) >> 3) & 0x3ff); } -int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) { uint8_t nports; uint8_t port; @@ -1010,7 +1010,8 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_RESUME; usb_osal_msleep(20); EHCI_HCOR->portsc[port - 1] &= ~EHCI_PORTSC_RESUME; - while (EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_RESUME) {} + while (EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_RESUME) { + } temp = EHCI_HCOR->usbcmd; temp |= EHCI_USBCMD_ASEN; @@ -1018,7 +1019,8 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) temp |= EHCI_USBCMD_RUN; EHCI_HCOR->usbcmd = temp; - while ((EHCI_HCOR->usbcmd & EHCI_USBCMD_RUN) == 0) {} + while ((EHCI_HCOR->usbcmd & EHCI_USBCMD_RUN) == 0) { + } case HUB_PORT_FEATURE_C_SUSPEND: break; @@ -1055,10 +1057,12 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) temp &= ~EHCI_USBCMD_RUN; EHCI_HCOR->usbcmd = temp; - while (EHCI_HCOR->usbcmd & EHCI_USBCMD_RUN) {} + while (EHCI_HCOR->usbcmd & EHCI_USBCMD_RUN) { + } EHCI_HCOR->portsc[port - 1] |= EHCI_PORTSC_SUSPEND; - while ((EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_SUSPEND) == 0) {} + while ((EHCI_HCOR->portsc[port - 1] & EHCI_PORTSC_SUSPEND) == 0) { + } break; case HUB_PORT_FEATURE_POWER: #ifdef CONFIG_USB_EHCI_PORT_POWER @@ -1066,7 +1070,7 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) #endif break; case HUB_PORT_FEATURE_RESET: - usbh_reset_port(port); + usbh_reset_port(bus, port); break; default: @@ -1096,9 +1100,9 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) if (temp & EHCI_PORTSC_PE) { status |= (1 << HUB_PORT_FEATURE_ENABLE); - if (usbh_get_port_speed(port) == USB_SPEED_LOW) { + if (usbh_get_port_speed(bus, port) == USB_SPEED_LOW) { status |= (1 << HUB_PORT_FEATURE_LOWSPEED); - } else if (usbh_get_port_speed(port) == USB_SPEED_HIGH) { + } else if (usbh_get_port_speed(bus, port) == USB_SPEED_HIGH) { status |= (1 << HUB_PORT_FEATURE_HIGHSPEED); } } @@ -1130,11 +1134,14 @@ int usbh_submit_urb(struct usbh_urb *urb) int ret = 0; struct usbh_hub *hub; struct usbh_hubport *hport; + struct usbh_bus *bus; - if (!urb || !urb->hport || !urb->ep) { + if (!urb || !urb->hport || !urb->ep || !urb->hport->bus) { return -USB_ERR_INVAL; } + bus = urb->hport->bus; + /* find active hubport in roothub */ hport = urb->hport; hub = urb->hport->parent; @@ -1147,7 +1154,7 @@ int usbh_submit_urb(struct usbh_urb *urb) return -USB_ERR_NOTCONN; } - if ((urb->errorcode == -USB_ERR_BUSY) && (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) != USB_ENDPOINT_TYPE_ISOCHRONOUS)) { + if (urb->errorcode == -USB_ERR_BUSY) { return -USB_ERR_BUSY; } @@ -1161,21 +1168,21 @@ int usbh_submit_urb(struct usbh_urb *urb) switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { case USB_ENDPOINT_TYPE_CONTROL: - qh = ehci_control_urb_init(urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + qh = ehci_control_urb_init(bus, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); if (qh == NULL) { return -USB_ERR_NOMEM; } urb->hcpriv = qh; break; case USB_ENDPOINT_TYPE_BULK: - qh = ehci_bulk_urb_init(urb, urb->transfer_buffer, urb->transfer_buffer_length); + qh = ehci_bulk_urb_init(bus, urb, urb->transfer_buffer, urb->transfer_buffer_length); if (qh == NULL) { return -USB_ERR_NOMEM; } urb->hcpriv = qh; break; case USB_ENDPOINT_TYPE_INTERRUPT: - qh = ehci_intr_urb_init(urb, urb->transfer_buffer, urb->transfer_buffer_length); + qh = ehci_intr_urb_init(bus, urb, urb->transfer_buffer, urb->transfer_buffer_length); if (qh == NULL) { return -USB_ERR_NOMEM; } @@ -1183,7 +1190,7 @@ int usbh_submit_urb(struct usbh_urb *urb) break; case USB_ENDPOINT_TYPE_ISOCHRONOUS: #ifdef CONFIG_USB_EHCI_ISO - ret = ehci_iso_urb_init(urb); + ret = ehci_iso_urb_init(bus, urb); #endif break; default: @@ -1199,7 +1206,7 @@ int usbh_submit_urb(struct usbh_urb *urb) urb->timeout = 0; ret = urb->errorcode; /* we can free qh when waitsem is done */ - ehci_qh_free(qh); + ehci_qh_free(bus, qh); } return ret; errout_timeout: @@ -1211,32 +1218,35 @@ errout_timeout: int usbh_kill_urb(struct usbh_urb *urb) { struct ehci_qh_hw *qh; + struct usbh_bus *bus; size_t flags; - if (!urb || !urb->hcpriv) { + if (!urb || !urb->hcpriv || !urb->hport->bus) { return -USB_ERR_INVAL; } + bus = urb->hport->bus; + flags = usb_osal_enter_critical_section(); EHCI_HCOR->usbcmd &= ~(EHCI_USBCMD_PSEN | EHCI_USBCMD_ASEN); if ((USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) || (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_BULK)) { - qh = EHCI_ADDR2QH(g_async_qh_head.hw.hlp); - while ((qh != &g_async_qh_head) && qh) { + qh = EHCI_ADDR2QH(g_async_qh_head[bus->hcd.hcd_id].hw.hlp); + while ((qh != &g_async_qh_head[bus->hcd.hcd_id]) && qh) { if (qh->urb == urb) { - ehci_kill_qh(&g_async_qh_head, qh); + ehci_kill_qh(bus, &g_async_qh_head[bus->hcd.hcd_id], qh); } qh = EHCI_ADDR2QH(qh->hw.hlp); } } else if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { - qh = EHCI_ADDR2QH(g_periodic_qh_head[EHCI_PERIOIDIC_QH_NUM - 1].hw.hlp); + qh = EHCI_ADDR2QH(g_periodic_qh_head[bus->hcd.hcd_id][EHCI_PERIOIDIC_QH_NUM - 1].hw.hlp); while (qh) { if (qh->urb == urb) { if (urb->hport->speed == USB_SPEED_HIGH) { - ehci_kill_qh(ehci_get_periodic_qhead(urb->ep->bInterval), qh); + ehci_kill_qh(bus, ehci_get_periodic_qhead(bus, urb->ep->bInterval), qh); } else { - ehci_kill_qh(ehci_get_periodic_qhead(urb->ep->bInterval * 8), qh); + ehci_kill_qh(bus, ehci_get_periodic_qhead(bus, urb->ep->bInterval * 8), qh); } } qh = EHCI_ADDR2QH(qh->hw.hlp); @@ -1261,7 +1271,7 @@ int usbh_kill_urb(struct usbh_urb *urb) urb->errorcode = -USB_ERR_SHUTDOWN; usb_osal_sem_give(qh->waitsem); } else { - ehci_qh_free(qh); + ehci_qh_free(bus, qh); } usb_osal_leave_critical_section(flags); @@ -1269,37 +1279,37 @@ int usbh_kill_urb(struct usbh_urb *urb) return 0; } -static void ehci_scan_async_list(void) +static void ehci_scan_async_list(struct usbh_bus *bus) { struct ehci_qh_hw *qh; - qh = EHCI_ADDR2QH(g_async_qh_head.hw.hlp); - while ((qh != &g_async_qh_head) && qh) { + qh = EHCI_ADDR2QH(g_async_qh_head[bus->hcd.hcd_id].hw.hlp); + while ((qh != &g_async_qh_head[bus->hcd.hcd_id]) && qh) { if (qh->urb) { - ehci_check_qh(&g_async_qh_head, qh); + ehci_check_qh(bus, &g_async_qh_head[bus->hcd.hcd_id], qh); } qh = EHCI_ADDR2QH(qh->hw.hlp); } } -static void ehci_scan_periodic_list(void) +static void ehci_scan_periodic_list(struct usbh_bus *bus) { struct ehci_qh_hw *qh; - qh = EHCI_ADDR2QH(g_periodic_qh_head[EHCI_PERIOIDIC_QH_NUM - 1].hw.hlp); + qh = EHCI_ADDR2QH(g_periodic_qh_head[bus->hcd.hcd_id][EHCI_PERIOIDIC_QH_NUM - 1].hw.hlp); while (qh) { if (qh->urb) { if (qh->urb->hport->speed == USB_SPEED_HIGH) { - ehci_check_qh(ehci_get_periodic_qhead(qh->urb->ep->bInterval), qh); + ehci_check_qh(bus, ehci_get_periodic_qhead(bus, qh->urb->ep->bInterval), qh); } else { - ehci_check_qh(ehci_get_periodic_qhead(qh->urb->ep->bInterval * 8), qh); + ehci_check_qh(bus, ehci_get_periodic_qhead(bus, qh->urb->ep->bInterval * 8), qh); } } qh = EHCI_ADDR2QH(qh->hw.hlp); } } -void USBH_IRQHandler(void) +void USBH_IRQHandler(struct usbh_bus *bus) { uint32_t usbsts; @@ -1307,18 +1317,18 @@ void USBH_IRQHandler(void) EHCI_HCOR->usbsts = usbsts; if (usbsts & EHCI_USBSTS_INT) { - ehci_scan_async_list(); - ehci_scan_periodic_list(); + ehci_scan_async_list(bus); + ehci_scan_periodic_list(bus); #ifdef CONFIG_USB_EHCI_ISO - ehci_scan_isochronous_list(); + ehci_scan_isochronous_list(bus); #endif } if (usbsts & EHCI_USBSTS_ERR) { - ehci_scan_async_list(); - ehci_scan_periodic_list(); + ehci_scan_async_list(bus); + ehci_scan_periodic_list(bus); #ifdef CONFIG_USB_EHCI_ISO - ehci_scan_isochronous_list(); + ehci_scan_isochronous_list(bus); #endif } @@ -1330,30 +1340,31 @@ void USBH_IRQHandler(void) if ((portsc & EHCI_PORTSC_CCS) == EHCI_PORTSC_CCS) { } else { for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) { - g_ehci_hcd.ehci_qh_used[index] = false; + g_ehci_hcd[bus->hcd.hcd_id].ehci_qh_used[index] = false; } for (uint8_t index = 0; index < CONFIG_USB_EHCI_QTD_NUM; index++) { - g_ehci_hcd.ehci_qtd_used[index] = false; + g_ehci_hcd[bus->hcd.hcd_id].ehci_qtd_used[index] = false; } for (uint8_t index = 0; index < CONFIG_USB_EHCI_ITD_NUM; index++) { - g_ehci_hcd.ehci_itd_used[index] = false; + g_ehci_hcd[bus->hcd.hcd_id].ehci_itd_used[index] = false; } } - usbh_roothub_thread_wakeup(port + 1); + bus->hcd.roothub.int_buffer[0] |= (1 << (port + 1)); + usbh_hub_thread_wakeup(&bus->hcd.roothub); } } } if (usbsts & EHCI_USBSTS_IAA) { for (uint8_t index = 0; index < CONFIG_USB_EHCI_QH_NUM; index++) { - struct ehci_qh_hw *qh = &ehci_qh_pool[index]; - if (g_ehci_hcd.ehci_qh_used[index] && qh->remove_in_iaad) { - ehci_urb_waitup(qh->urb); + struct ehci_qh_hw *qh = &ehci_qh_pool[bus->hcd.hcd_id][index]; + if (g_ehci_hcd[bus->hcd.hcd_id].ehci_qh_used[index] && qh->remove_in_iaad) { + ehci_urb_waitup(bus, qh->urb); } } } if (usbsts & EHCI_USBSTS_FATAL) { } -} \ No newline at end of file +} diff --git a/port/musb/usb_hc_musb.c b/port/musb/usb_hc_musb.c index 51a9cded..8434b28b 100644 --- a/port/musb/usb_hc_musb.c +++ b/port/musb/usb_hc_musb.c @@ -14,15 +14,7 @@ #define HWREGB(x) \ (*((volatile uint8_t *)(x))) -#ifndef USBH_IRQHandler -#error "please define USBH_IRQHandler in usb_config.h" -#endif - -#ifndef USBH_BASE -#error "please define USBH_BASE in usb_config.h" -#endif - -#define USB_BASE USBH_BASE +#define USB_BASE (bus->hcd.reg_base) #if CONFIG_USBHOST_PIPE_NUM != 4 #error musb host ip only supports 4 pipe num @@ -148,6 +140,7 @@ struct musb_pipe { uint8_t chidx; bool inuse; uint32_t xfrd; + volatile uint8_t ep0_state; usb_osal_sem_t waitsem; struct usbh_urb *urb; }; @@ -157,23 +150,21 @@ struct musb_hcd { volatile bool port_pec; volatile bool port_pe; struct musb_pipe pipe_pool[CONFIG_USBHOST_PIPE_NUM]; -} g_musb_hcd; - -static volatile uint8_t usb_ep0_state = USB_EP0_STATE_SETUP; +} g_musb_hcd[CONFIG_USBHOST_MAX_BUS]; /* get current active ep */ -static uint8_t musb_get_active_ep(void) +static uint8_t musb_get_active_ep(struct usbh_bus *bus) { return HWREGB(USB_BASE + MUSB_EPIDX_OFFSET); } /* set the active ep */ -static void musb_set_active_ep(uint8_t ep_index) +static void musb_set_active_ep(struct usbh_bus *bus, uint8_t ep_index) { HWREGB(USB_BASE + MUSB_EPIDX_OFFSET) = ep_index; } -static void musb_fifo_flush(uint8_t ep) +static void musb_fifo_flush(struct usbh_bus *bus, uint8_t ep) { uint8_t ep_idx = ep & 0x7f; if (ep_idx == 0) { @@ -190,7 +181,7 @@ static void musb_fifo_flush(uint8_t ep) } } -static void musb_write_packet(uint8_t ep_idx, uint8_t *buffer, uint16_t len) +static void musb_write_packet(struct usbh_bus *bus, uint8_t ep_idx, uint8_t *buffer, uint16_t len) { uint32_t *buf32; uint8_t *buf8; @@ -221,7 +212,7 @@ static void musb_write_packet(uint8_t ep_idx, uint8_t *buffer, uint16_t len) } } -static void musb_read_packet(uint8_t ep_idx, uint8_t *buffer, uint16_t len) +static void musb_read_packet(struct usbh_bus *bus, uint8_t ep_idx, uint8_t *buffer, uint16_t len) { uint32_t *buf32; uint8_t *buf8; @@ -252,13 +243,13 @@ static void musb_read_packet(uint8_t ep_idx, uint8_t *buffer, uint16_t len) } } -void musb_control_urb_init(uint8_t chidx, struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) +void musb_control_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, struct usb_setup_packet *setup, uint8_t *buffer, uint32_t buflen) { uint8_t old_ep_index; uint8_t speed = USB_TXTYPE1_SPEED_FULL; - old_ep_index = musb_get_active_ep(); - musb_set_active_ep(chidx); + old_ep_index = musb_get_active_ep(bus); + musb_set_active_ep(bus, chidx); if (urb->hport->speed == USB_SPEED_HIGH) { speed = USB_TYPE0_SPEED_HIGH; @@ -273,18 +264,18 @@ void musb_control_urb_init(uint8_t chidx, struct usbh_urb *urb, struct usb_setup HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0; HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0; - musb_write_packet(chidx, (uint8_t *)setup, 8); + musb_write_packet(bus, chidx, (uint8_t *)setup, 8); HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_TXRDY | USB_CSRL0_SETUP; - musb_set_active_ep(old_ep_index); + musb_set_active_ep(bus, old_ep_index); } -void musb_bulk_urb_init(uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +void musb_bulk_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) { uint8_t old_ep_index; uint8_t speed = USB_TXTYPE1_SPEED_FULL; - old_ep_index = musb_get_active_ep(); - musb_set_active_ep(chidx); + old_ep_index = musb_get_active_ep(bus); + musb_set_active_ep(bus, chidx); if (urb->hport->speed == USB_SPEED_HIGH) { speed = USB_TXTYPE1_SPEED_HIGH; @@ -315,23 +306,23 @@ void musb_bulk_urb_init(uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, ui buflen = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); } - musb_write_packet(chidx, buffer, buflen); + musb_write_packet(bus, chidx, buffer, buflen); HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) &= ~USB_TXCSRH1_MODE; HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) |= USB_TXCSRH1_MODE; HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_TXRDY; HWREGH(USB_BASE + MUSB_TXIE_OFFSET) |= (1 << chidx); } - musb_set_active_ep(old_ep_index); + musb_set_active_ep(bus, old_ep_index); } -void musb_intr_urb_init(uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) +void musb_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, uint32_t buflen) { uint8_t old_ep_index; uint8_t speed = USB_TXTYPE1_SPEED_FULL; - old_ep_index = musb_get_active_ep(); - musb_set_active_ep(chidx); + old_ep_index = musb_get_active_ep(bus); + musb_set_active_ep(bus, chidx); if (urb->hport->speed == USB_SPEED_HIGH) { speed = USB_TXTYPE1_SPEED_HIGH; @@ -362,28 +353,28 @@ void musb_intr_urb_init(uint8_t chidx, struct usbh_urb *urb, uint8_t *buffer, ui buflen = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); } - musb_write_packet(chidx, buffer, buflen); + musb_write_packet(bus, chidx, buffer, buflen); HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) &= ~USB_TXCSRH1_MODE; HWREGB(USB_BASE + MUSB_IND_TXCSRH_OFFSET) |= USB_TXCSRH1_MODE; HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_TXRDY; HWREGH(USB_BASE + MUSB_TXIE_OFFSET) |= (1 << chidx); } - musb_set_active_ep(old_ep_index); + musb_set_active_ep(bus, old_ep_index); } -static int usbh_reset_port(const uint8_t port) +static int usbh_reset_port(struct usbh_bus *bus, const uint8_t port) { - g_musb_hcd.port_pe = 0; + g_musb_hcd[bus->hcd.hcd_id].port_pe = 0; HWREGB(USB_BASE + MUSB_POWER_OFFSET) |= USB_POWER_RESET; usb_osal_msleep(20); HWREGB(USB_BASE + MUSB_POWER_OFFSET) &= ~(USB_POWER_RESET); usb_osal_msleep(20); - g_musb_hcd.port_pe = 1; + g_musb_hcd[bus->hcd.hcd_id].port_pe = 1; return 0; } -static uint8_t usbh_get_port_speed(const uint8_t port) +static uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) { uint8_t speed = USB_SPEED_UNKNOWN; @@ -403,8 +394,8 @@ static int musb_pipe_alloc(void) int chidx; for (chidx = 1; chidx < CONFIG_USBHOST_PIPE_NUM; chidx++) { - if (!g_musb_hcd.pipe_pool[chidx].inuse) { - g_musb_hcd.pipe_pool[chidx].inuse = true; + if (!g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse) { + g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse = true; return chidx; } } @@ -420,24 +411,24 @@ static void musb_pipe_free(struct musb_pipe *pipe) #endif } -__WEAK void usb_hc_low_level_init(void) +__WEAK void usb_hc_low_level_init(struct usbh_bus *bus) { } -int usb_hc_init(void) +int usb_hc_init(struct usbh_bus *bus) { uint8_t regval; uint32_t fifo_offset = 0; - memset(&g_musb_hcd, 0, sizeof(struct musb_hcd)); + memset(&g_musb_hcd[bus->hcd.hcd_id], 0, sizeof(struct musb_hcd)); for (uint8_t i = 0; i < CONFIG_USBHOST_PIPE_NUM; i++) { - g_musb_hcd.pipe_pool[i].waitsem = usb_osal_sem_create(0); + g_musb_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem = usb_osal_sem_create(0); } - usb_hc_low_level_init(); + usb_hc_low_level_init(bus); - musb_set_active_ep(0); + musb_set_active_ep(bus, 0); HWREGB(USB_BASE + MUSB_IND_TXINTERVAL_OFFSET) = 0; HWREGB(USB_BASE + MUSB_TXFIFOSZ_OFFSET) = USB_TXFIFOSZ_SIZE_64; HWREGH(USB_BASE + MUSB_TXFIFOADD_OFFSET) = 0; @@ -446,7 +437,7 @@ int usb_hc_init(void) fifo_offset += 64; for (uint8_t i = 1; i < CONIFG_USB_MUSB_PIPE_NUM; i++) { - musb_set_active_ep(i); + musb_set_active_ep(bus, i); HWREGB(USB_BASE + MUSB_TXFIFOSZ_OFFSET) = USB_TXFIFOSZ_SIZE_512; HWREGH(USB_BASE + MUSB_TXFIFOADD_OFFSET) = fifo_offset; HWREGB(USB_BASE + MUSB_RXFIFOSZ_OFFSET) = USB_TXFIFOSZ_SIZE_512; @@ -474,7 +465,7 @@ int usb_hc_init(void) return 0; } -int usb_hc_deinit(void) +int usb_hc_deinit(struct usbh_bus *bus) { HWREGB(USB_BASE + MUSB_IE_OFFSET) = 0; HWREGH(USB_BASE + MUSB_TXIE_OFFSET) = 0; @@ -484,13 +475,13 @@ int usb_hc_deinit(void) HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) &= ~USB_DEVCTL_SESSION; for (uint8_t i = 0; i < CONFIG_USBHOST_PIPE_NUM; i++) { - usb_osal_sem_delete(g_musb_hcd.pipe_pool[i].waitsem); + usb_osal_sem_delete(g_musb_hcd[bus->hcd.hcd_id].pipe_pool[i].waitsem); } return 0; } -int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) +int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf) { uint8_t nports; uint8_t port; @@ -544,10 +535,10 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) case HUB_PORT_FEATURE_POWER: break; case HUB_PORT_FEATURE_C_CONNECTION: - g_musb_hcd.port_csc = 0; + g_musb_hcd[bus->hcd.hcd_id].port_csc = 0; break; case HUB_PORT_FEATURE_C_ENABLE: - g_musb_hcd.port_pec = 0; + g_musb_hcd[bus->hcd.hcd_id].port_pec = 0; break; case HUB_PORT_FEATURE_C_OVER_CURREN: break; @@ -568,7 +559,7 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) case HUB_PORT_FEATURE_POWER: break; case HUB_PORT_FEATURE_RESET: - usbh_reset_port(port); + usbh_reset_port(bus, port); break; default: @@ -581,19 +572,19 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) } status = 0; - if (g_musb_hcd.port_csc) { + if (g_musb_hcd[bus->hcd.hcd_id].port_csc) { status |= (1 << HUB_PORT_FEATURE_C_CONNECTION); } - if (g_musb_hcd.port_pec) { + if (g_musb_hcd[bus->hcd.hcd_id].port_pec) { status |= (1 << HUB_PORT_FEATURE_C_ENABLE); } - if (g_musb_hcd.port_pe) { + if (g_musb_hcd[bus->hcd.hcd_id].port_pe) { status |= (1 << HUB_PORT_FEATURE_CONNECTION); status |= (1 << HUB_PORT_FEATURE_ENABLE); - if (usbh_get_port_speed(port) == USB_SPEED_LOW) { + if (usbh_get_port_speed(bus, port) == USB_SPEED_LOW) { status |= (1 << HUB_PORT_FEATURE_LOWSPEED); - } else if (usbh_get_port_speed(port) == USB_SPEED_HIGH) { + } else if (usbh_get_port_speed(bus, port) == USB_SPEED_HIGH) { status |= (1 << HUB_PORT_FEATURE_HIGHSPEED); } } @@ -610,11 +601,12 @@ int usbh_roothub_control(struct usb_setup_packet *setup, uint8_t *buf) int usbh_submit_urb(struct usbh_urb *urb) { struct musb_pipe *pipe; + struct usbh_bus *bus; int chidx; size_t flags; int ret = 0; - if (!urb || !urb->hport || !urb->ep) { + if (!urb || !urb->hport || !urb->ep || !urb->hport->bus) { return -USB_ERR_INVAL; } @@ -626,6 +618,8 @@ int usbh_submit_urb(struct usbh_urb *urb) return -USB_ERR_BUSY; } + bus = urb->hport->bus; + flags = usb_osal_enter_critical_section(); if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) { @@ -638,7 +632,7 @@ int usbh_submit_urb(struct usbh_urb *urb) } } - pipe = &g_musb_hcd.pipe_pool[chidx]; + pipe = &g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx]; pipe->chidx = chidx; pipe->urb = urb; @@ -650,17 +644,17 @@ int usbh_submit_urb(struct usbh_urb *urb) switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { case USB_ENDPOINT_TYPE_CONTROL: - usb_ep0_state = USB_EP0_STATE_SETUP; - musb_control_urb_init(0, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); + pipe->ep0_state = USB_EP0_STATE_SETUP; + musb_control_urb_init(bus, 0, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); break; case USB_ENDPOINT_TYPE_BULK: - musb_bulk_urb_init(chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); + musb_bulk_urb_init(bus, chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); break; case USB_ENDPOINT_TYPE_INTERRUPT: - musb_intr_urb_init(chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); + musb_intr_urb_init(bus, chidx, urb, urb->transfer_buffer, urb->transfer_buffer_length); break; case USB_ENDPOINT_TYPE_ISOCHRONOUS: - break; + return -USB_ERR_NOTSUPP; default: break; } @@ -687,12 +681,15 @@ errout_timeout: int usbh_kill_urb(struct usbh_urb *urb) { struct musb_pipe *pipe; + struct usbh_bus *bus; size_t flags; - if (!urb || !urb->hcpriv) { + if (!urb || !urb->hcpriv || !urb->hport->bus) { return -USB_ERR_INVAL; } + bus = urb->hport->bus; + flags = usb_osal_enter_critical_section(); pipe = (struct musb_pipe *)urb->hcpriv; @@ -735,59 +732,59 @@ static void musb_urb_waitup(struct usbh_urb *urb) } } -void handle_ep0(void) +void handle_ep0(struct usbh_bus *bus) { uint8_t ep0_status; struct musb_pipe *pipe; struct usbh_urb *urb; uint32_t size; - pipe = (struct musb_pipe *)&g_musb_hcd.pipe_pool[0]; + pipe = (struct musb_pipe *)&g_musb_hcd[bus->hcd.hcd_id].pipe_pool[0]; urb = pipe->urb; if (urb == NULL) { return; } - musb_set_active_ep(0); + musb_set_active_ep(bus, 0); ep0_status = HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET); if (ep0_status & USB_CSRL0_STALLED) { HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_STALLED; - usb_ep0_state = USB_EP0_STATE_SETUP; + pipe->ep0_state = USB_EP0_STATE_SETUP; urb->errorcode = -USB_ERR_STALL; musb_urb_waitup(urb); return; } if (ep0_status & USB_CSRL0_ERROR) { HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_ERROR; - musb_fifo_flush(0); - usb_ep0_state = USB_EP0_STATE_SETUP; + musb_fifo_flush(bus, 0); + pipe->ep0_state = USB_EP0_STATE_SETUP; urb->errorcode = -USB_ERR_IO; musb_urb_waitup(urb); return; } if (ep0_status & USB_CSRL0_STALL) { HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_STALL; - usb_ep0_state = USB_EP0_STATE_SETUP; + pipe->ep0_state = USB_EP0_STATE_SETUP; urb->errorcode = -USB_ERR_STALL; musb_urb_waitup(urb); return; } - switch (usb_ep0_state) { + switch (pipe->ep0_state) { case USB_EP0_STATE_SETUP: urb->actual_length += 8; if (urb->transfer_buffer_length) { if (urb->setup->bmRequestType & 0x80) { - usb_ep0_state = USB_EP0_STATE_IN_DATA; + pipe->ep0_state = USB_EP0_STATE_IN_DATA; HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_REQPKT; } else { - usb_ep0_state = USB_EP0_STATE_OUT_DATA; + pipe->ep0_state = USB_EP0_STATE_OUT_DATA; size = urb->transfer_buffer_length; if (size > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { size = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); } - musb_write_packet(0, urb->transfer_buffer, size); + musb_write_packet(bus, 0, urb->transfer_buffer, size); HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_TXRDY; urb->transfer_buffer += size; @@ -795,7 +792,7 @@ void handle_ep0(void) urb->actual_length += size; } } else { - usb_ep0_state = USB_EP0_STATE_IN_STATUS; + pipe->ep0_state = USB_EP0_STATE_IN_STATUS; HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_REQPKT | USB_CSRL0_STATUS); } break; @@ -807,14 +804,14 @@ void handle_ep0(void) } size = MIN(size, HWREGH(USB_BASE + MUSB_IND_RXCOUNT_OFFSET)); - musb_read_packet(0, urb->transfer_buffer, size); + musb_read_packet(bus, 0, urb->transfer_buffer, size); HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) &= ~USB_CSRL0_RXRDY; urb->transfer_buffer += size; urb->transfer_buffer_length -= size; urb->actual_length += size; if ((size < USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) || (urb->transfer_buffer_length == 0)) { - usb_ep0_state = USB_EP0_STATE_OUT_STATUS; + pipe->ep0_state = USB_EP0_STATE_OUT_STATUS; HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_TXRDY | USB_CSRL0_STATUS); } else { HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_REQPKT; @@ -828,14 +825,14 @@ void handle_ep0(void) size = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); } - musb_write_packet(0, urb->transfer_buffer, size); + musb_write_packet(bus, 0, urb->transfer_buffer, size); HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_CSRL0_TXRDY; urb->transfer_buffer += size; urb->transfer_buffer_length -= size; urb->actual_length += size; } else { - usb_ep0_state = USB_EP0_STATE_IN_STATUS; + pipe->ep0_state = USB_EP0_STATE_IN_STATUS; HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = (USB_CSRL0_REQPKT | USB_CSRL0_STATUS); } break; @@ -853,7 +850,7 @@ void handle_ep0(void) } } -void USBH_IRQHandler(void) +void USBH_IRQHandler(struct usbh_bus *bus) { uint32_t is; uint32_t txis; @@ -871,20 +868,22 @@ void USBH_IRQHandler(void) HWREGB(USB_BASE + MUSB_IS_OFFSET) = is; - old_ep_idx = musb_get_active_ep(); + old_ep_idx = musb_get_active_ep(bus); if (is & USB_IS_CONN) { - g_musb_hcd.port_csc = 1; - g_musb_hcd.port_pec = 1; - g_musb_hcd.port_pe = 1; - usbh_roothub_thread_wakeup(1); + g_musb_hcd[bus->hcd.hcd_id].port_csc = 1; + g_musb_hcd[bus->hcd.hcd_id].port_pec = 1; + g_musb_hcd[bus->hcd.hcd_id].port_pe = 1; + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); } if (is & USB_IS_DISCON) { - g_musb_hcd.port_csc = 1; - g_musb_hcd.port_pec = 1; - g_musb_hcd.port_pe = 0; - usbh_roothub_thread_wakeup(1); + g_musb_hcd[bus->hcd.hcd_id].port_csc = 1; + g_musb_hcd[bus->hcd.hcd_id].port_pec = 1; + g_musb_hcd[bus->hcd.hcd_id].port_pe = 0; + bus->hcd.roothub.int_buffer[0] = (1 << 1); + usbh_hub_thread_wakeup(&bus->hcd.roothub); } if (is & USB_IS_SOF) { @@ -910,16 +909,16 @@ void USBH_IRQHandler(void) if (txis & USB_TXIE_EP0) { txis &= ~USB_TXIE_EP0; HWREGH(USB_BASE + MUSB_TXIS_OFFSET) = USB_TXIE_EP0; - handle_ep0(); + handle_ep0(bus); } for (ep_idx = 1; ep_idx < CONIFG_USB_MUSB_PIPE_NUM; ep_idx++) { if (txis & (1 << ep_idx)) { HWREGH(USB_BASE + MUSB_TXIS_OFFSET) = (1 << ep_idx); - pipe = &g_musb_hcd.pipe_pool[ep_idx]; + pipe = &g_musb_hcd[bus->hcd.hcd_id].pipe_pool[ep_idx]; urb = pipe->urb; - musb_set_active_ep(ep_idx); + musb_set_active_ep(bus, ep_idx); ep_csrl_status = HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET); @@ -951,7 +950,7 @@ void USBH_IRQHandler(void) urb->errorcode = 0; musb_urb_waitup(urb); } else { - musb_write_packet(ep_idx, urb->transfer_buffer, size); + musb_write_packet(bus, ep_idx, urb->transfer_buffer, size); HWREGB(USB_BASE + MUSB_IND_TXCSRL_OFFSET) = USB_TXCSRL1_TXRDY; } } @@ -963,9 +962,9 @@ void USBH_IRQHandler(void) if (rxis & (1 << ep_idx)) { HWREGH(USB_BASE + MUSB_RXIS_OFFSET) = (1 << ep_idx); // clear isr flag - pipe = &g_musb_hcd.pipe_pool[ep_idx]; + pipe = &g_musb_hcd[bus->hcd.hcd_id].pipe_pool[ep_idx]; urb = pipe->urb; - musb_set_active_ep(ep_idx); + musb_set_active_ep(bus, ep_idx); ep_csrl_status = HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET); //ep_csrh_status = HWREGB(USB_BASE + MUSB_IND_RXCSRH_OFFSET); // todo:for iso transfer @@ -989,7 +988,7 @@ void USBH_IRQHandler(void) } size = MIN(size, HWREGH(USB_BASE + MUSB_IND_RXCOUNT_OFFSET)); - musb_read_packet(ep_idx, urb->transfer_buffer, size); + musb_read_packet(bus, ep_idx, urb->transfer_buffer, size); HWREGB(USB_BASE + MUSB_IND_RXCSRL_OFFSET) &= ~USB_RXCSRL1_RXRDY; @@ -1007,5 +1006,5 @@ void USBH_IRQHandler(void) } } } - musb_set_active_ep(old_ep_idx); + musb_set_active_ep(bus, old_ep_idx); } diff --git a/third_party/rt-thread-5.0/msh_cmd.c b/third_party/rt-thread-5.0/msh_cmd.c index 4070ad93..afb874c5 100644 --- a/third_party/rt-thread-5.0/msh_cmd.c +++ b/third_party/rt-thread-5.0/msh_cmd.c @@ -70,15 +70,8 @@ MSH_CMD_EXPORT(audio_v2_test, start audio_v2_test); #endif #if defined(PKG_CHERRYUSB_HOST) -void usbh_class_test(void); -MSH_CMD_EXPORT(usbh_class_test, start usbh_class_test); - int lsusb(int argc, char **argv); MSH_CMD_EXPORT(lsusb, start lsusb); - -int usbh_initialize(void); -//INIT_APP_EXPORT(usbh_initialize); -MSH_CMD_EXPORT(usbh_initialize, start usbh_initialize); #endif #endif