diff options
author | Simon Glass <sjg@chromium.org> | 2015-11-08 23:48:05 -0700 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-11-19 20:27:52 -0700 |
commit | b70a3fea947b28c1368063048c494389d030233b (patch) | |
tree | 5bb6501eae2332832711044e1b858cc5265bfe0f | |
parent | 2cdb58ebdc3268a261cd3761b730ca4b98d37985 (diff) | |
download | u-boot-imx-b70a3fea947b28c1368063048c494389d030233b.zip u-boot-imx-b70a3fea947b28c1368063048c494389d030233b.tar.gz u-boot-imx-b70a3fea947b28c1368063048c494389d030233b.tar.bz2 |
usb: sandbox: Add support for interrupt operations
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>
-rw-r--r-- | drivers/usb/emul/usb-emul-uclass.c | 12 | ||||
-rw-r--r-- | drivers/usb/host/usb-sandbox.c | 19 | ||||
-rw-r--r-- | include/usb.h | 11 |
3 files changed, 42 insertions, 0 deletions
diff --git a/drivers/usb/emul/usb-emul-uclass.c b/drivers/usb/emul/usb-emul-uclass.c index 6b5f3c0..ee7ea5a 100644 --- a/drivers/usb/emul/usb-emul-uclass.c +++ b/drivers/usb/emul/usb-emul-uclass.c @@ -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) { diff --git a/drivers/usb/host/usb-sandbox.c b/drivers/usb/host/usb-sandbox.c index c5f9822..5e3d96c 100644 --- a/drivers/usb/host/usb-sandbox.c +++ b/drivers/usb/host/usb-sandbox.c @@ -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, }; diff --git a/include/usb.h b/include/usb.h index d684531..55b9268 100644 --- a/include/usb.h +++ b/include/usb.h @@ -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. |