mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
usb: add usb_desc_attach
Add usb_desc_attach() which sets up the device according to the speed the usb port is able to handle. This function can be hooked into the handle_attach callback. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
b6f77fbe23
commit
32d4191978
@ -153,16 +153,46 @@ int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len)
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
void usb_desc_init(USBDevice *dev)
|
static void usb_desc_setdefaults(USBDevice *dev)
|
||||||
{
|
{
|
||||||
const USBDesc *desc = dev->info->usb_desc;
|
const USBDesc *desc = dev->info->usb_desc;
|
||||||
|
|
||||||
assert(desc != NULL);
|
assert(desc != NULL);
|
||||||
dev->speed = USB_SPEED_FULL;
|
switch (dev->speed) {
|
||||||
dev->device = desc->full;
|
case USB_SPEED_LOW:
|
||||||
|
case USB_SPEED_FULL:
|
||||||
|
dev->device = desc->full;
|
||||||
|
break;
|
||||||
|
case USB_SPEED_HIGH:
|
||||||
|
dev->device = desc->high;
|
||||||
|
break;
|
||||||
|
}
|
||||||
dev->config = dev->device->confs;
|
dev->config = dev->device->confs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void usb_desc_init(USBDevice *dev)
|
||||||
|
{
|
||||||
|
dev->speed = USB_SPEED_FULL;
|
||||||
|
usb_desc_setdefaults(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void usb_desc_attach(USBDevice *dev)
|
||||||
|
{
|
||||||
|
const USBDesc *desc = dev->info->usb_desc;
|
||||||
|
|
||||||
|
assert(desc != NULL);
|
||||||
|
if (desc->high && (dev->port->speedmask & USB_SPEED_MASK_HIGH)) {
|
||||||
|
dev->speed = USB_SPEED_HIGH;
|
||||||
|
} else if (desc->full && (dev->port->speedmask & USB_SPEED_MASK_FULL)) {
|
||||||
|
dev->speed = USB_SPEED_FULL;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "usb: port/device speed mismatch for \"%s\"\n",
|
||||||
|
dev->info->product_desc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
usb_desc_setdefaults(dev);
|
||||||
|
}
|
||||||
|
|
||||||
void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str)
|
void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str)
|
||||||
{
|
{
|
||||||
USBDescString *s;
|
USBDescString *s;
|
||||||
|
@ -79,6 +79,7 @@ int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len);
|
|||||||
|
|
||||||
/* control message emulation helpers */
|
/* control message emulation helpers */
|
||||||
void usb_desc_init(USBDevice *dev);
|
void usb_desc_init(USBDevice *dev);
|
||||||
|
void usb_desc_attach(USBDevice *dev);
|
||||||
void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str);
|
void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str);
|
||||||
const char *usb_desc_get_string(USBDevice *dev, uint8_t index);
|
const char *usb_desc_get_string(USBDevice *dev, uint8_t index);
|
||||||
int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len);
|
int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len);
|
||||||
|
Loading…
Reference in New Issue
Block a user