From: Simon Glass Date: Mon, 9 Nov 2015 06:48:05 +0000 (-0700) Subject: usb: sandbox: Add support for interrupt operations X-Git-Tag: v2016.01-rc2~180 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=b70a3fea947b28c1368063048c494389d030233b;p=oweals%2Fu-boot.git 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 --- diff --git a/drivers/usb/emul/usb-emul-uclass.c b/drivers/usb/emul/usb-emul-uclass.c index 6b5f3c0af4..ee7ea5ad91 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 c5f9822040..5e3d96c208 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 d68453109a..55b9268ea1 100644 --- a/include/usb.h +++ b/include/usb.h @@ -937,6 +937,17 @@ int usb_emul_control(struct udevice *emul, struct usb_device *udev, 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 *