usb: sandbox: Add support for interrupt operations
authorSimon Glass <sjg@chromium.org>
Mon, 9 Nov 2015 06:48:05 +0000 (23:48 -0700)
committerSimon Glass <sjg@chromium.org>
Fri, 20 Nov 2015 03:27:52 +0000 (20:27 -0700)
Allow USB device emulation to support interrupt URBs so that we can use USB
keyboards with sandbox.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/usb/emul/usb-emul-uclass.c
drivers/usb/host/usb-sandbox.c
include/usb.h

index 6b5f3c0..ee7ea5a 100644 (file)
@@ -218,6 +218,18 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
        return ops->bulk(emul, udev, pipe, buffer, length);
 }
 
+int usb_emul_int(struct udevice *emul, struct usb_device *udev,
+                 unsigned long pipe, void *buffer, int length, int interval)
+{
+       struct dm_usb_ops *ops = usb_get_emul_ops(emul);
+
+       if (!ops->interrupt)
+               return -ENOSYS;
+       debug("%s: dev=%s\n", __func__, emul->name);
+
+       return ops->interrupt(emul, udev, pipe, buffer, length, interval);
+}
+
 int usb_emul_setup_device(struct udevice *dev, int maxpacketsize,
                          struct usb_string *strings, void **desc_list)
 {
index c5f9822..5e3d96c 100644 (file)
@@ -87,6 +87,24 @@ static int sandbox_submit_bulk(struct udevice *bus, struct usb_device *udev,
        return ret;
 }
 
+static int sandbox_submit_int(struct udevice *bus, struct usb_device *udev,
+                             unsigned long pipe, void *buffer, int length,
+                             int interval)
+{
+       struct udevice *emul;
+       int ret;
+
+       /* Just use child of dev as emulator? */
+       debug("%s: bus=%s\n", __func__, bus->name);
+       ret = usb_emul_find(bus, pipe, &emul);
+       usbmon_trace(bus, pipe, NULL, emul);
+       if (ret)
+               return ret;
+       ret = usb_emul_int(emul, udev, pipe, buffer, length, interval);
+
+       return ret;
+}
+
 static int sandbox_alloc_device(struct udevice *dev, struct usb_device *udev)
 {
        return 0;
@@ -100,6 +118,7 @@ static int sandbox_usb_probe(struct udevice *dev)
 static const struct dm_usb_ops sandbox_usb_ops = {
        .control        = sandbox_submit_control,
        .bulk           = sandbox_submit_bulk,
+       .interrupt      = sandbox_submit_int,
        .alloc_device   = sandbox_alloc_device,
 };
 
index d684531..55b9268 100644 (file)
@@ -938,6 +938,17 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
                  unsigned long pipe, void *buffer, int length);
 
 /**
+ * usb_emul_int() - Send an interrupt packet to an emulator
+ *
+ * @emul:      Emulator device
+ * @udev:      USB device (which the emulator is causing to appear)
+ * See struct dm_usb_ops for details on other parameters
+ * @return 0 if OK, -ve on error
+ */
+int usb_emul_int(struct udevice *emul, struct usb_device *udev,
+                 unsigned long pipe, void *buffer, int length, int interval);
+
+/**
  * usb_emul_find() - Find an emulator for a particular device
  *
  * Check @pipe to find a device number on bus @bus and return it.