This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 8bf88945cedc0b9a439b692ed1f3ce3b05c2d6ae
Author: yangsong8 <[email protected]>
AuthorDate: Mon May 26 21:27:52 2025 +0800

    sim/usbdev: Supports registering multiple USB devices on a same host
    
    when start multiple sim, the host refuses to recognize multiple USB
    devices, and the prompt message is as follows:
    [365652.175289] UDC core: USB Raw Gadget: couldn't find an available UDC or 
it's busy
    [365652.175304] misc raw-gadget: fail, usb_gadget_probe_driver returned -16
    
    Signed-off-by: yangsong8 <[email protected]>
---
 arch/sim/src/sim/posix/sim_rawgadget.c | 40 ++++++++++++++++++++++++++--------
 arch/sim/src/sim/sim_usbdev.c          |  4 ++--
 2 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/arch/sim/src/sim/posix/sim_rawgadget.c 
b/arch/sim/src/sim/posix/sim_rawgadget.c
index f71c3341712..e9bf63f17f4 100644
--- a/arch/sim/src/sim/posix/sim_rawgadget.c
+++ b/arch/sim/src/sim/posix/sim_rawgadget.c
@@ -89,7 +89,8 @@
 
 #define USB_RAW_RX_BUF_NUM          8
 
-#define USB_RAW_DEVICE              "dummy_udc.0"
+#define USB_RAW_DEVICE_MAX          32
+#define USB_RAW_DEVICE              "dummy_udc.%d"
 #define USB_RAW_DRIVER              "dummy_udc"
 
 #define USB_RAW_FIFO_USED(fifo)     ((fifo)->write - (fifo)->read)
@@ -324,7 +325,7 @@ static void host_raw_init(int fd, enum usb_device_speed 
speed,
 
 static int host_raw_run(int fd)
 {
-  int rv = host_uninterruptible(ioctl, fd, USB_RAW_IOCTL_RUN, 0);
+  int rv = host_uninterruptible_errno(ioctl, fd, USB_RAW_IOCTL_RUN, 0);
   if (rv < 0)
     {
       ERROR("ioctl(USB_RAW_IOCTL_RUN) fail");
@@ -672,19 +673,40 @@ static void *host_raw_ephandle(void *arg)
 int host_usbdev_init(uint32_t speed)
 {
   struct usb_raw_gadget_dev_t *dev = &g_raw_gadget_dev;
-  const char *device = USB_RAW_DEVICE;
   const char *driver = USB_RAW_DRIVER;
+  char device[16];
+  int ret;
   int fd;
+  int i;
 
-  fd = host_raw_open();
-  if (fd < 0)
+  memset(device, 0, sizeof(device));
+
+  for (i = 0; i < USB_RAW_DEVICE_MAX; i++)
     {
-      ERROR("USB raw open error");
-      return -1;
+      fd = host_raw_open();
+      if (fd < 0)
+        {
+          ERROR("USB raw open error:%d", fd);
+          return fd;
+        }
+
+      sprintf(device, USB_RAW_DEVICE, i);
+      host_raw_init(fd, speed, driver, device);
+      ret = host_raw_run(fd);
+      if (ret == 0)
+        {
+          break;
+        }
+
+      ERROR("USB raw %d run error:%d", i, ret);
+      host_raw_close(fd);
+    }
+
+  if (i == USB_RAW_DEVICE_MAX)
+    {
+      return ret;
     }
 
-  host_raw_init(fd, speed, driver, device);
-  host_raw_run(fd);
   host_raw_vbusdraw(fd, 0x32);
   host_raw_configure(fd);
   dev->fd = fd;
diff --git a/arch/sim/src/sim/sim_usbdev.c b/arch/sim/src/sim/sim_usbdev.c
index eb086d33448..ea1c2057e65 100644
--- a/arch/sim/src/sim/sim_usbdev.c
+++ b/arch/sim/src/sim/sim_usbdev.c
@@ -1094,9 +1094,9 @@ int usbdev_register(struct usbdevclass_driver_s *driver)
       /* Setup the USB host controller */
 
 #ifdef CONFIG_USBDEV_DUALSPEED
-      host_usbdev_init(SIM_USB_SPEED);
+      ret = host_usbdev_init(SIM_USB_SPEED);
 #else
-      host_usbdev_init(USB_SPEED_FULL);
+      ret = host_usbdev_init(USB_SPEED_FULL);
 #endif
     }
 

Reply via email to