|
|
1.1.1.14! root 1: #ifndef QEMU_USB_H ! 2: #define QEMU_USB_H ! 3: 1.1 root 4: /* 5: * QEMU USB API 1.1.1.5 root 6: * 1.1 root 7: * Copyright (c) 2005 Fabrice Bellard 1.1.1.5 root 8: * 1.1 root 9: * Permission is hereby granted, free of charge, to any person obtaining a copy 10: * of this software and associated documentation files (the "Software"), to deal 11: * in the Software without restriction, including without limitation the rights 12: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13: * copies of the Software, and to permit persons to whom the Software is 14: * furnished to do so, subject to the following conditions: 15: * 16: * The above copyright notice and this permission notice shall be included in 17: * all copies or substantial portions of the Software. 18: * 19: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25: * THE SOFTWARE. 26: */ 1.1.1.7 root 27: 28: #include "block.h" 1.1.1.9 root 29: #include "qdev.h" 30: #include "qemu-queue.h" 1.1.1.7 root 31: 1.1.1.12 root 32: /* Constants related to the USB / PCI interaction */ 33: #define USB_SBRN 0x60 /* Serial Bus Release Number Register */ 34: #define USB_RELEASE_1 0x10 /* USB 1.0 */ 35: #define USB_RELEASE_2 0x20 /* USB 2.0 */ 36: #define USB_RELEASE_3 0x30 /* USB 3.0 */ 37: 1.1 root 38: #define USB_TOKEN_SETUP 0x2d 39: #define USB_TOKEN_IN 0x69 /* device -> host */ 40: #define USB_TOKEN_OUT 0xe1 /* host -> device */ 41: 1.1.1.14! root 42: #define USB_RET_NODEV (-1) ! 43: #define USB_RET_NAK (-2) ! 44: #define USB_RET_STALL (-3) ! 45: #define USB_RET_BABBLE (-4) ! 46: #define USB_RET_IOERROR (-5) ! 47: #define USB_RET_ASYNC (-6) 1.1 root 48: 49: #define USB_SPEED_LOW 0 50: #define USB_SPEED_FULL 1 51: #define USB_SPEED_HIGH 2 1.1.1.11 root 52: #define USB_SPEED_SUPER 3 53: 54: #define USB_SPEED_MASK_LOW (1 << USB_SPEED_LOW) 55: #define USB_SPEED_MASK_FULL (1 << USB_SPEED_FULL) 56: #define USB_SPEED_MASK_HIGH (1 << USB_SPEED_HIGH) 57: #define USB_SPEED_MASK_SUPER (1 << USB_SPEED_SUPER) 1.1 root 58: 59: #define USB_STATE_NOTATTACHED 0 60: #define USB_STATE_ATTACHED 1 61: //#define USB_STATE_POWERED 2 62: #define USB_STATE_DEFAULT 3 63: //#define USB_STATE_ADDRESS 4 64: //#define USB_STATE_CONFIGURED 5 65: #define USB_STATE_SUSPENDED 6 66: 67: #define USB_CLASS_AUDIO 1 68: #define USB_CLASS_COMM 2 69: #define USB_CLASS_HID 3 70: #define USB_CLASS_PHYSICAL 5 71: #define USB_CLASS_STILL_IMAGE 6 72: #define USB_CLASS_PRINTER 7 73: #define USB_CLASS_MASS_STORAGE 8 74: #define USB_CLASS_HUB 9 75: #define USB_CLASS_CDC_DATA 0x0a 76: #define USB_CLASS_CSCID 0x0b 77: #define USB_CLASS_CONTENT_SEC 0x0d 78: #define USB_CLASS_APP_SPEC 0xfe 79: #define USB_CLASS_VENDOR_SPEC 0xff 80: 1.1.1.14! root 81: #define USB_SUBCLASS_UNDEFINED 0 ! 82: #define USB_SUBCLASS_AUDIO_CONTROL 1 ! 83: #define USB_SUBCLASS_AUDIO_STREAMING 2 ! 84: #define USB_SUBCLASS_AUDIO_MIDISTREAMING 3 ! 85: 1.1 root 86: #define USB_DIR_OUT 0 87: #define USB_DIR_IN 0x80 88: 89: #define USB_TYPE_MASK (0x03 << 5) 90: #define USB_TYPE_STANDARD (0x00 << 5) 91: #define USB_TYPE_CLASS (0x01 << 5) 92: #define USB_TYPE_VENDOR (0x02 << 5) 93: #define USB_TYPE_RESERVED (0x03 << 5) 94: 95: #define USB_RECIP_MASK 0x1f 96: #define USB_RECIP_DEVICE 0x00 97: #define USB_RECIP_INTERFACE 0x01 98: #define USB_RECIP_ENDPOINT 0x02 99: #define USB_RECIP_OTHER 0x03 100: 101: #define DeviceRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) 102: #define DeviceOutRequest ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) 103: #define InterfaceRequest \ 104: ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) 105: #define InterfaceOutRequest \ 106: ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) 107: #define EndpointRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8) 108: #define EndpointOutRequest \ 109: ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8) 1.1.1.10 root 110: #define ClassInterfaceRequest \ 111: ((USB_DIR_IN|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8) 112: #define ClassInterfaceOutRequest \ 113: ((USB_DIR_OUT|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8) 1.1 root 114: 115: #define USB_REQ_GET_STATUS 0x00 116: #define USB_REQ_CLEAR_FEATURE 0x01 117: #define USB_REQ_SET_FEATURE 0x03 118: #define USB_REQ_SET_ADDRESS 0x05 119: #define USB_REQ_GET_DESCRIPTOR 0x06 120: #define USB_REQ_SET_DESCRIPTOR 0x07 121: #define USB_REQ_GET_CONFIGURATION 0x08 122: #define USB_REQ_SET_CONFIGURATION 0x09 123: #define USB_REQ_GET_INTERFACE 0x0A 124: #define USB_REQ_SET_INTERFACE 0x0B 125: #define USB_REQ_SYNCH_FRAME 0x0C 126: 127: #define USB_DEVICE_SELF_POWERED 0 128: #define USB_DEVICE_REMOTE_WAKEUP 1 129: 130: #define USB_DT_DEVICE 0x01 131: #define USB_DT_CONFIG 0x02 132: #define USB_DT_STRING 0x03 133: #define USB_DT_INTERFACE 0x04 134: #define USB_DT_ENDPOINT 0x05 1.1.1.11 root 135: #define USB_DT_DEVICE_QUALIFIER 0x06 136: #define USB_DT_OTHER_SPEED_CONFIG 0x07 1.1.1.12 root 137: #define USB_DT_DEBUG 0x0A 138: #define USB_DT_INTERFACE_ASSOC 0x0B 1.1.1.14! root 139: #define USB_DT_CS_INTERFACE 0x24 ! 140: #define USB_DT_CS_ENDPOINT 0x25 1.1 root 141: 1.1.1.6 root 142: #define USB_ENDPOINT_XFER_CONTROL 0 143: #define USB_ENDPOINT_XFER_ISOC 1 144: #define USB_ENDPOINT_XFER_BULK 2 145: #define USB_ENDPOINT_XFER_INT 3 1.1.1.14! root 146: #define USB_ENDPOINT_XFER_INVALID 255 1.1.1.6 root 147: 1.1.1.9 root 148: typedef struct USBBus USBBus; 1.1.1.12 root 149: typedef struct USBBusOps USBBusOps; 1.1 root 150: typedef struct USBPort USBPort; 151: typedef struct USBDevice USBDevice; 1.1.1.4 root 152: typedef struct USBPacket USBPacket; 1.1.1.14! root 153: typedef struct USBEndpoint USBEndpoint; 1.1 root 154: 1.1.1.11 root 155: typedef struct USBDesc USBDesc; 156: typedef struct USBDescID USBDescID; 157: typedef struct USBDescDevice USBDescDevice; 158: typedef struct USBDescConfig USBDescConfig; 1.1.1.12 root 159: typedef struct USBDescIfaceAssoc USBDescIfaceAssoc; 1.1.1.11 root 160: typedef struct USBDescIface USBDescIface; 161: typedef struct USBDescEndpoint USBDescEndpoint; 162: typedef struct USBDescOther USBDescOther; 163: typedef struct USBDescString USBDescString; 164: 165: struct USBDescString { 166: uint8_t index; 167: char *str; 168: QLIST_ENTRY(USBDescString) next; 169: }; 170: 1.1.1.14! root 171: #define USB_MAX_ENDPOINTS 15 ! 172: #define USB_MAX_INTERFACES 16 ! 173: ! 174: struct USBEndpoint { ! 175: uint8_t nr; ! 176: uint8_t pid; ! 177: uint8_t type; ! 178: uint8_t ifnum; ! 179: int max_packet_size; ! 180: bool pipeline; ! 181: USBDevice *dev; ! 182: QTAILQ_HEAD(, USBPacket) queue; ! 183: }; ! 184: ! 185: enum USBDeviceFlags { ! 186: USB_DEV_FLAG_FULL_PATH, ! 187: }; ! 188: 1.1 root 189: /* definition of a USB device */ 190: struct USBDevice { 1.1.1.9 root 191: DeviceState qdev; 1.1.1.11 root 192: USBPort *port; 193: char *port_path; 1.1 root 194: void *opaque; 1.1.1.14! root 195: uint32_t flags; 1.1.1.6 root 196: 1.1.1.12 root 197: /* Actual connected speed */ 1.1.1.9 root 198: int speed; 1.1.1.12 root 199: /* Supported speeds, not in info because it may be variable (hostdevs) */ 200: int speedmask; 1.1.1.9 root 201: uint8_t addr; 202: char product_desc[32]; 203: int auto_attach; 204: int attached; 205: 1.1.1.11 root 206: int32_t state; 1.1.1.9 root 207: uint8_t setup_buf[8]; 1.1.1.12 root 208: uint8_t data_buf[4096]; 1.1.1.11 root 209: int32_t remote_wakeup; 210: int32_t setup_state; 211: int32_t setup_len; 212: int32_t setup_index; 213: 1.1.1.14! root 214: USBEndpoint ep_ctl; ! 215: USBEndpoint ep_in[USB_MAX_ENDPOINTS]; ! 216: USBEndpoint ep_out[USB_MAX_ENDPOINTS]; ! 217: 1.1.1.11 root 218: QLIST_HEAD(, USBDescString) strings; 219: const USBDescDevice *device; 1.1.1.14! root 220: ! 221: int configuration; ! 222: int ninterfaces; ! 223: int altsetting[USB_MAX_INTERFACES]; 1.1.1.11 root 224: const USBDescConfig *config; 1.1.1.14! root 225: const USBDescIface *ifaces[USB_MAX_INTERFACES]; 1.1.1.9 root 226: }; 227: 1.1.1.14! root 228: #define TYPE_USB_DEVICE "usb-device" ! 229: #define USB_DEVICE(obj) \ ! 230: OBJECT_CHECK(USBDevice, (obj), TYPE_USB_DEVICE) ! 231: #define USB_DEVICE_CLASS(klass) \ ! 232: OBJECT_CLASS_CHECK(USBDeviceClass, (klass), TYPE_USB_DEVICE) ! 233: #define USB_DEVICE_GET_CLASS(obj) \ ! 234: OBJECT_GET_CLASS(USBDeviceClass, (obj), TYPE_USB_DEVICE) ! 235: ! 236: typedef struct USBDeviceClass { ! 237: DeviceClass parent_class; ! 238: 1.1.1.9 root 239: int (*init)(USBDevice *dev); 240: 241: /* 1.1.1.14! root 242: * Walk (enabled) downstream ports, check for a matching device. ! 243: * Only hubs implement this. 1.1.1.9 root 244: */ 1.1.1.14! root 245: USBDevice *(*find_device)(USBDevice *dev, uint8_t addr); 1.1.1.6 root 246: 1.1.1.9 root 247: /* 1.1.1.12 root 248: * Called when a packet is canceled. 249: */ 250: void (*cancel_packet)(USBDevice *dev, USBPacket *p); 251: 252: /* 1.1.1.6 root 253: * Called when device is destroyed. 254: */ 1.1.1.3 root 255: void (*handle_destroy)(USBDevice *dev); 256: 1.1.1.6 root 257: /* 1.1.1.11 root 258: * Attach the device 259: */ 260: void (*handle_attach)(USBDevice *dev); 261: 262: /* 1.1.1.6 root 263: * Reset the device 1.1.1.9 root 264: */ 1.1 root 265: void (*handle_reset)(USBDevice *dev); 1.1.1.6 root 266: 267: /* 268: * Process control request. 269: * Called from handle_packet(). 270: * 271: * Returns length or one of the USB_RET_ codes. 272: */ 1.1.1.12 root 273: int (*handle_control)(USBDevice *dev, USBPacket *p, int request, int value, 1.1 root 274: int index, int length, uint8_t *data); 1.1.1.6 root 275: 276: /* 277: * Process data transfers (both BULK and ISOC). 278: * Called from handle_packet(). 279: * 280: * Returns length or one of the USB_RET_ codes. 281: */ 1.1.1.4 root 282: int (*handle_data)(USBDevice *dev, USBPacket *p); 1.1.1.6 root 283: 1.1.1.14! root 284: void (*set_interface)(USBDevice *dev, int interface, ! 285: int alt_old, int alt_new); ! 286: 1.1.1.9 root 287: const char *product_desc; 1.1.1.11 root 288: const USBDesc *usb_desc; 1.1.1.14! root 289: } USBDeviceClass; 1.1 root 290: 1.1.1.11 root 291: typedef struct USBPortOps { 292: void (*attach)(USBPort *port); 293: void (*detach)(USBPort *port); 1.1.1.12 root 294: /* 295: * This gets called when a device downstream from the device attached to 296: * the port (iow attached through a hub) gets detached. 297: */ 298: void (*child_detach)(USBPort *port, USBDevice *child); 299: void (*wakeup)(USBPort *port); 300: /* 301: * Note that port->dev will be different then the device from which 1.1.1.14! root 302: * the packet originated when a hub is involved. 1.1.1.12 root 303: */ 304: void (*complete)(USBPort *port, USBPacket *p); 1.1.1.11 root 305: } USBPortOps; 1.1.1.3 root 306: 1.1 root 307: /* USB port on which a device can be connected */ 308: struct USBPort { 309: USBDevice *dev; 1.1.1.11 root 310: int speedmask; 311: char path[16]; 312: USBPortOps *ops; 1.1 root 313: void *opaque; 314: int index; /* internal port index, may be used with the opaque */ 1.1.1.9 root 315: QTAILQ_ENTRY(USBPort) next; 1.1 root 316: }; 317: 1.1.1.4 root 318: typedef void USBCallback(USBPacket * packet, void *opaque); 319: 1.1.1.14! root 320: typedef enum USBPacketState { ! 321: USB_PACKET_UNDEFINED = 0, ! 322: USB_PACKET_SETUP, ! 323: USB_PACKET_QUEUED, ! 324: USB_PACKET_ASYNC, ! 325: USB_PACKET_COMPLETE, ! 326: USB_PACKET_CANCELED, ! 327: } USBPacketState; ! 328: 1.1.1.4 root 329: /* Structure used to hold information about an active USB packet. */ 330: struct USBPacket { 331: /* Data fields for use by the driver. */ 332: int pid; 1.1.1.14! root 333: USBEndpoint *ep; 1.1.1.13 root 334: QEMUIOVector iov; 1.1.1.14! root 335: uint64_t parameter; /* control transfers */ 1.1.1.13 root 336: int result; /* transfer length or USB_RET_* status code */ 1.1.1.4 root 337: /* Internal use by the USB layer. */ 1.1.1.14! root 338: USBPacketState state; ! 339: QTAILQ_ENTRY(USBPacket) queue; 1.1.1.4 root 340: }; 341: 1.1.1.13 root 342: void usb_packet_init(USBPacket *p); 1.1.1.14! root 343: void usb_packet_set_state(USBPacket *p, USBPacketState state); ! 344: void usb_packet_check_state(USBPacket *p, USBPacketState expected); ! 345: void usb_packet_setup(USBPacket *p, int pid, USBEndpoint *ep); 1.1.1.13 root 346: void usb_packet_addbuf(USBPacket *p, void *ptr, size_t len); 347: int usb_packet_map(USBPacket *p, QEMUSGList *sgl); 348: void usb_packet_unmap(USBPacket *p); 349: void usb_packet_copy(USBPacket *p, void *ptr, size_t bytes); 350: void usb_packet_skip(USBPacket *p, size_t bytes); 351: void usb_packet_cleanup(USBPacket *p); 352: 1.1.1.14! root 353: static inline bool usb_packet_is_inflight(USBPacket *p) ! 354: { ! 355: return (p->state == USB_PACKET_QUEUED || ! 356: p->state == USB_PACKET_ASYNC); ! 357: } ! 358: ! 359: USBDevice *usb_find_device(USBPort *port, uint8_t addr); ! 360: 1.1.1.12 root 361: int usb_handle_packet(USBDevice *dev, USBPacket *p); 362: void usb_packet_complete(USBDevice *dev, USBPacket *p); 363: void usb_cancel_packet(USBPacket * p); 1.1.1.4 root 364: 1.1.1.14! root 365: void usb_ep_init(USBDevice *dev); ! 366: void usb_ep_dump(USBDevice *dev); ! 367: struct USBEndpoint *usb_ep_get(USBDevice *dev, int pid, int ep); ! 368: uint8_t usb_ep_get_type(USBDevice *dev, int pid, int ep); ! 369: uint8_t usb_ep_get_ifnum(USBDevice *dev, int pid, int ep); ! 370: void usb_ep_set_type(USBDevice *dev, int pid, int ep, uint8_t type); ! 371: void usb_ep_set_ifnum(USBDevice *dev, int pid, int ep, uint8_t ifnum); ! 372: void usb_ep_set_max_packet_size(USBDevice *dev, int pid, int ep, ! 373: uint16_t raw); ! 374: int usb_ep_get_max_packet_size(USBDevice *dev, int pid, int ep); ! 375: void usb_ep_set_pipeline(USBDevice *dev, int pid, int ep, bool enabled); ! 376: 1.1.1.13 root 377: void usb_attach(USBPort *port); 378: void usb_detach(USBPort *port); 1.1.1.14! root 379: void usb_port_reset(USBPort *port); ! 380: void usb_device_reset(USBDevice *dev); ! 381: void usb_wakeup(USBEndpoint *ep); 1.1.1.12 root 382: void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p); 1.1 root 383: int set_usb_string(uint8_t *buf, const char *str); 1.1.1.4 root 384: 1.1 root 385: /* usb-linux.c */ 1.1.1.14! root 386: USBDevice *usb_host_device_open(USBBus *bus, const char *devname); 1.1.1.6 root 387: int usb_host_device_close(const char *devname); 1.1.1.8 root 388: void usb_host_info(Monitor *mon); 1.1 root 389: 1.1.1.6 root 390: /* usb-bt.c */ 1.1.1.14! root 391: USBDevice *usb_bt_init(USBBus *bus, HCIInfo *hci); 1.1.1.6 root 392: 1.1.1.5 root 393: /* usb ports of the VM */ 394: 395: #define VM_USB_HUB_SIZE 8 396: 1.1.1.6 root 397: /* usb-musb.c */ 398: enum musb_irq_source_e { 399: musb_irq_suspend = 0, 400: musb_irq_resume, 401: musb_irq_rst_babble, 402: musb_irq_sof, 403: musb_irq_connect, 404: musb_irq_disconnect, 405: musb_irq_vbus_request, 406: musb_irq_vbus_error, 407: musb_irq_rx, 408: musb_irq_tx, 409: musb_set_vbus, 410: musb_set_session, 1.1.1.13 root 411: /* Add new interrupts here */ 412: musb_irq_max, /* total number of interrupts defined */ 1.1.1.6 root 413: }; 414: 1.1.1.8 root 415: typedef struct MUSBState MUSBState; 1.1.1.13 root 416: MUSBState *musb_init(DeviceState *parent_device, int gpio_base); 417: void musb_reset(MUSBState *s); 1.1.1.8 root 418: uint32_t musb_core_intr_get(MUSBState *s); 419: void musb_core_intr_clear(MUSBState *s, uint32_t mask); 420: void musb_set_size(MUSBState *s, int epnum, int size, int is_tx); 1.1.1.9 root 421: 422: /* usb-bus.c */ 423: 424: struct USBBus { 425: BusState qbus; 1.1.1.12 root 426: USBBusOps *ops; 1.1.1.9 root 427: int busnr; 428: int nfree; 429: int nused; 430: QTAILQ_HEAD(, USBPort) free; 431: QTAILQ_HEAD(, USBPort) used; 432: QTAILQ_ENTRY(USBBus) next; 433: }; 434: 1.1.1.12 root 435: struct USBBusOps { 436: int (*register_companion)(USBBus *bus, USBPort *ports[], 437: uint32_t portcount, uint32_t firstport); 1.1.1.14! root 438: void (*wakeup_endpoint)(USBBus *bus, USBEndpoint *ep); 1.1.1.12 root 439: }; 440: 441: void usb_bus_new(USBBus *bus, USBBusOps *ops, DeviceState *host); 1.1.1.9 root 442: USBBus *usb_bus_find(int busnr); 1.1.1.14! root 443: void usb_legacy_register(const char *typename, const char *usbdevice_name, ! 444: USBDevice *(*usbdevice_init)(USBBus *bus, ! 445: const char *params)); 1.1.1.9 root 446: USBDevice *usb_create(USBBus *bus, const char *name); 447: USBDevice *usb_create_simple(USBBus *bus, const char *name); 448: USBDevice *usbdevice_create(const char *cmdline); 449: void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index, 1.1.1.11 root 450: USBPortOps *ops, int speedmask); 1.1.1.12 root 451: int usb_register_companion(const char *masterbus, USBPort *ports[], 452: uint32_t portcount, uint32_t firstport, 453: void *opaque, USBPortOps *ops, int speedmask); 1.1.1.11 root 454: void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr); 1.1.1.9 root 455: void usb_unregister_port(USBBus *bus, USBPort *port); 1.1.1.13 root 456: int usb_claim_port(USBDevice *dev); 457: void usb_release_port(USBDevice *dev); 1.1.1.9 root 458: int usb_device_attach(USBDevice *dev); 459: int usb_device_detach(USBDevice *dev); 460: int usb_device_delete_addr(int busnr, int addr); 461: 462: static inline USBBus *usb_bus_from_device(USBDevice *d) 463: { 464: return DO_UPCAST(USBBus, qbus, d->qdev.parent_bus); 465: } 1.1.1.14! root 466: ! 467: extern const VMStateDescription vmstate_usb_device; ! 468: ! 469: #define VMSTATE_USB_DEVICE(_field, _state) { \ ! 470: .name = (stringify(_field)), \ ! 471: .size = sizeof(USBDevice), \ ! 472: .vmsd = &vmstate_usb_device, \ ! 473: .flags = VMS_STRUCT, \ ! 474: .offset = vmstate_offset_value(_state, _field, USBDevice), \ ! 475: } ! 476: ! 477: USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr); ! 478: ! 479: void usb_device_cancel_packet(USBDevice *dev, USBPacket *p); ! 480: ! 481: void usb_device_handle_attach(USBDevice *dev); ! 482: ! 483: void usb_device_handle_reset(USBDevice *dev); ! 484: ! 485: int usb_device_handle_control(USBDevice *dev, USBPacket *p, int request, int value, ! 486: int index, int length, uint8_t *data); ! 487: ! 488: int usb_device_handle_data(USBDevice *dev, USBPacket *p); ! 489: ! 490: void usb_device_set_interface(USBDevice *dev, int interface, ! 491: int alt_old, int alt_new); ! 492: ! 493: const char *usb_device_get_product_desc(USBDevice *dev); ! 494: ! 495: const USBDesc *usb_device_get_usb_desc(USBDevice *dev); ! 496: ! 497: #endif ! 498:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.