From 1526b80e08237494e6a5111338c418ca689dc13d Mon Sep 17 00:00:00 2001 From: Roman Leonov Date: Wed, 26 Jun 2024 21:18:56 +0200 Subject: [PATCH 1/2] fix(hub): Changed type of next_uid member (uint8_t -> unsigned int) --- components/usb/hub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/usb/hub.c b/components/usb/hub.c index a11947952f..afaa9b9468 100644 --- a/components/usb/hub.c +++ b/components/usb/hub.c @@ -94,7 +94,7 @@ typedef struct { struct { TAILQ_HEAD(tailhead_devs, dev_tree_node_s) dev_nodes_tailq; /**< Tailq of attached devices */ - uint8_t next_uid; /**< Unique ID for next upcoming device */ + unsigned int next_uid; /**< Unique ID for next upcoming device */ } single_thread; /**< Single thread members don't require a critical section so long as they are never accessed from multiple threads */ struct { From eceb27a8359c42263b0889a1c45904b5f441b1ae Mon Sep 17 00:00:00 2001 From: Roman Leonov Date: Tue, 2 Jul 2024 12:42:31 +0200 Subject: [PATCH 2/2] fix(usb_host): Changed addr_map to 4x array of uint32 --- components/usb/usb_host.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/components/usb/usb_host.c b/components/usb/usb_host.c index 9bd773007b..9bbf31c19d 100644 --- a/components/usb/usb_host.c +++ b/components/usb/usb_host.c @@ -110,7 +110,7 @@ struct client_s { uint32_t val; } flags; uint32_t num_done_ctrl_xfer; - uint32_t opened_dev_addr_map; + uint32_t opened_dev_addr_map[4]; } dynamic; // Mux protected members must be protected by host library the mux_lock when accessed struct { @@ -163,26 +163,25 @@ const char *USB_HOST_TAG = "USB HOST"; static inline void _record_client_opened_device(client_t *client_obj, uint8_t dev_addr) { - assert(dev_addr != 0); - client_obj->dynamic.opened_dev_addr_map |= (1 << (dev_addr - 1)); + assert(dev_addr != 0 && dev_addr <= 127); + client_obj->dynamic.opened_dev_addr_map[dev_addr / 32] |= (uint32_t)(1 << (dev_addr % 32)); } static inline void _clear_client_opened_device(client_t *client_obj, uint8_t dev_addr) { - assert(dev_addr != 0); - client_obj->dynamic.opened_dev_addr_map &= ~(1 << (dev_addr - 1)); + assert(dev_addr != 0 && dev_addr <= 127); + client_obj->dynamic.opened_dev_addr_map[dev_addr / 32] &= ~(uint32_t)(1 << (dev_addr % 32)); } static inline bool _check_client_opened_device(client_t *client_obj, uint8_t dev_addr) { bool ret; - + assert(dev_addr <= 127); if (dev_addr != 0) { - ret = client_obj->dynamic.opened_dev_addr_map & (1 << (dev_addr - 1)); + ret = client_obj->dynamic.opened_dev_addr_map[dev_addr / 32] & (uint32_t)(1 << (dev_addr % 32)); } else { ret = false; } - return ret; } @@ -820,7 +819,10 @@ esp_err_t usb_host_client_deregister(usb_host_client_handle_t client_hdl) client_obj->dynamic.flags.taking_mux || client_obj->dynamic.flags.num_intf_claimed != 0 || client_obj->dynamic.num_done_ctrl_xfer != 0 || - client_obj->dynamic.opened_dev_addr_map != 0) { + client_obj->dynamic.opened_dev_addr_map[0] != 0 || + client_obj->dynamic.opened_dev_addr_map[1] != 0 || + client_obj->dynamic.opened_dev_addr_map[2] != 0 || + client_obj->dynamic.opened_dev_addr_map[3] != 0) { can_deregister = false; } else { can_deregister = true;