mirror of
https://github.com/apache/nuttx.git
synced 2026-05-21 21:34:07 +08:00
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 <yangsong8@xiaomi.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user