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 }
