Skip to content

Commit 8b5ae2b

Browse files
committed
subsys: usb: host: support multiple devices under hub
When hub is used, need to consider about multiple devices are attached. Signed-off-by: Aiden Hu <[email protected]>
1 parent 6f4af6a commit 8b5ae2b

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

subsys/usb/host/usbh_core.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ static int usbh_event_carrier(const struct device *dev,
4848
static void dev_connected_handler(struct usbh_context *const ctx,
4949
const struct uhc_event *const event)
5050
{
51+
struct usb_device *udev;
52+
5153
LOG_DBG("Device connected event");
5254

5355
udev = usbh_device_alloc(ctx);
@@ -66,7 +68,7 @@ static void dev_connected_handler(struct usbh_context *const ctx,
6668

6769
k_mutex_lock(&ctx->mutex, K_FOREVER);
6870
sys_dlist_append(&ctx->udevs, &udev->node);
69-
71+
7072
if (ctx->root == NULL) {
7173
ctx->root = udev;
7274
}

subsys/usb/host/usbh_device.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,6 @@ int usbh_device_init(struct usb_device *const udev)
452452
struct usbh_context *const uhs_ctx = udev->ctx;
453453
uint8_t new_addr;
454454
int err;
455-
sys_dnode_t *node;
456455
uint8_t device_count = 0;
457456

458457
if (udev->state != USB_STATE_DEFAULT) {
@@ -467,8 +466,16 @@ int usbh_device_init(struct usb_device *const udev)
467466
}
468467

469468
k_mutex_lock(&uhs_ctx->mutex, K_FOREVER);
470-
SYS_DLIST_FOR_EACH_NODE(&uhs_ctx->udevs, node) {
471-
device_count++;
469+
device_count = sys_dlist_len(&uhs_ctx->udevs);
470+
k_mutex_unlock(&uhs_ctx->mutex);
471+
472+
/* Only reset bus if this is the root device. */
473+
if (device_count == 1U) {
474+
err = uhc_bus_reset(uhs_ctx->dev);
475+
if (err) {
476+
LOG_ERR("Failed to signal bus reset");
477+
return err;
478+
}
472479
}
473480
k_mutex_unlock(&uhs_ctx->mutex);
474481

0 commit comments

Comments
 (0)