mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-28 01:51:33 +00:00
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>
This commit is contained in:
parent
2cdb58ebdc
commit
b70a3fea94
3 changed files with 42 additions and 0 deletions
|
@ -218,6 +218,18 @@ int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
|
||||||
return ops->bulk(emul, udev, pipe, buffer, length);
|
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,
|
int usb_emul_setup_device(struct udevice *dev, int maxpacketsize,
|
||||||
struct usb_string *strings, void **desc_list)
|
struct usb_string *strings, void **desc_list)
|
||||||
{
|
{
|
||||||
|
|
|
@ -87,6 +87,24 @@ static int sandbox_submit_bulk(struct udevice *bus, struct usb_device *udev,
|
||||||
return ret;
|
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)
|
static int sandbox_alloc_device(struct udevice *dev, struct usb_device *udev)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -100,6 +118,7 @@ static int sandbox_usb_probe(struct udevice *dev)
|
||||||
static const struct dm_usb_ops sandbox_usb_ops = {
|
static const struct dm_usb_ops sandbox_usb_ops = {
|
||||||
.control = sandbox_submit_control,
|
.control = sandbox_submit_control,
|
||||||
.bulk = sandbox_submit_bulk,
|
.bulk = sandbox_submit_bulk,
|
||||||
|
.interrupt = sandbox_submit_int,
|
||||||
.alloc_device = sandbox_alloc_device,
|
.alloc_device = sandbox_alloc_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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,
|
int usb_emul_bulk(struct udevice *emul, struct usb_device *udev,
|
||||||
unsigned long pipe, void *buffer, int length);
|
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
|
* usb_emul_find() - Find an emulator for a particular device
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue