|
|
1.1 root 1: /*
2: * QEMU USB API
1.1.1.5 root 3: *
1.1 root 4: * Copyright (c) 2005 Fabrice Bellard
1.1.1.5 root 5: *
1.1 root 6: * Permission is hereby granted, free of charge, to any person obtaining a copy
7: * of this software and associated documentation files (the "Software"), to deal
8: * in the Software without restriction, including without limitation the rights
9: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10: * copies of the Software, and to permit persons to whom the Software is
11: * furnished to do so, subject to the following conditions:
12: *
13: * The above copyright notice and this permission notice shall be included in
14: * all copies or substantial portions of the Software.
15: *
16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22: * THE SOFTWARE.
23: */
1.1.1.7 root 24:
25: #include "block.h"
1.1.1.9 root 26: #include "qdev.h"
27: #include "qemu-queue.h"
1.1.1.7 root 28:
1.1.1.12 root 29: /* Constants related to the USB / PCI interaction */
30: #define USB_SBRN 0x60 /* Serial Bus Release Number Register */
31: #define USB_RELEASE_1 0x10 /* USB 1.0 */
32: #define USB_RELEASE_2 0x20 /* USB 2.0 */
33: #define USB_RELEASE_3 0x30 /* USB 3.0 */
34:
1.1 root 35: #define USB_TOKEN_SETUP 0x2d
36: #define USB_TOKEN_IN 0x69 /* device -> host */
37: #define USB_TOKEN_OUT 0xe1 /* host -> device */
38:
39: /* specific usb messages, also sent in the 'pid' parameter */
40: #define USB_MSG_ATTACH 0x100
41: #define USB_MSG_DETACH 0x101
42: #define USB_MSG_RESET 0x102
43:
1.1.1.5 root 44: #define USB_RET_NODEV (-1)
1.1 root 45: #define USB_RET_NAK (-2)
46: #define USB_RET_STALL (-3)
47: #define USB_RET_BABBLE (-4)
1.1.1.4 root 48: #define USB_RET_ASYNC (-5)
1.1 root 49:
50: #define USB_SPEED_LOW 0
51: #define USB_SPEED_FULL 1
52: #define USB_SPEED_HIGH 2
1.1.1.11 root 53: #define USB_SPEED_SUPER 3
54:
55: #define USB_SPEED_MASK_LOW (1 << USB_SPEED_LOW)
56: #define USB_SPEED_MASK_FULL (1 << USB_SPEED_FULL)
57: #define USB_SPEED_MASK_HIGH (1 << USB_SPEED_HIGH)
58: #define USB_SPEED_MASK_SUPER (1 << USB_SPEED_SUPER)
1.1 root 59:
60: #define USB_STATE_NOTATTACHED 0
61: #define USB_STATE_ATTACHED 1
62: //#define USB_STATE_POWERED 2
63: #define USB_STATE_DEFAULT 3
64: //#define USB_STATE_ADDRESS 4
65: //#define USB_STATE_CONFIGURED 5
66: #define USB_STATE_SUSPENDED 6
67:
68: #define USB_CLASS_AUDIO 1
69: #define USB_CLASS_COMM 2
70: #define USB_CLASS_HID 3
71: #define USB_CLASS_PHYSICAL 5
72: #define USB_CLASS_STILL_IMAGE 6
73: #define USB_CLASS_PRINTER 7
74: #define USB_CLASS_MASS_STORAGE 8
75: #define USB_CLASS_HUB 9
76: #define USB_CLASS_CDC_DATA 0x0a
77: #define USB_CLASS_CSCID 0x0b
78: #define USB_CLASS_CONTENT_SEC 0x0d
79: #define USB_CLASS_APP_SPEC 0xfe
80: #define USB_CLASS_VENDOR_SPEC 0xff
81:
82: #define USB_DIR_OUT 0
83: #define USB_DIR_IN 0x80
84:
85: #define USB_TYPE_MASK (0x03 << 5)
86: #define USB_TYPE_STANDARD (0x00 << 5)
87: #define USB_TYPE_CLASS (0x01 << 5)
88: #define USB_TYPE_VENDOR (0x02 << 5)
89: #define USB_TYPE_RESERVED (0x03 << 5)
90:
91: #define USB_RECIP_MASK 0x1f
92: #define USB_RECIP_DEVICE 0x00
93: #define USB_RECIP_INTERFACE 0x01
94: #define USB_RECIP_ENDPOINT 0x02
95: #define USB_RECIP_OTHER 0x03
96:
97: #define DeviceRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
98: #define DeviceOutRequest ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
99: #define InterfaceRequest \
100: ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
101: #define InterfaceOutRequest \
102: ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
103: #define EndpointRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8)
104: #define EndpointOutRequest \
105: ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8)
1.1.1.10 root 106: #define ClassInterfaceRequest \
107: ((USB_DIR_IN|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8)
108: #define ClassInterfaceOutRequest \
109: ((USB_DIR_OUT|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8)
1.1 root 110:
111: #define USB_REQ_GET_STATUS 0x00
112: #define USB_REQ_CLEAR_FEATURE 0x01
113: #define USB_REQ_SET_FEATURE 0x03
114: #define USB_REQ_SET_ADDRESS 0x05
115: #define USB_REQ_GET_DESCRIPTOR 0x06
116: #define USB_REQ_SET_DESCRIPTOR 0x07
117: #define USB_REQ_GET_CONFIGURATION 0x08
118: #define USB_REQ_SET_CONFIGURATION 0x09
119: #define USB_REQ_GET_INTERFACE 0x0A
120: #define USB_REQ_SET_INTERFACE 0x0B
121: #define USB_REQ_SYNCH_FRAME 0x0C
122:
123: #define USB_DEVICE_SELF_POWERED 0
124: #define USB_DEVICE_REMOTE_WAKEUP 1
125:
126: #define USB_DT_DEVICE 0x01
127: #define USB_DT_CONFIG 0x02
128: #define USB_DT_STRING 0x03
129: #define USB_DT_INTERFACE 0x04
130: #define USB_DT_ENDPOINT 0x05
1.1.1.11 root 131: #define USB_DT_DEVICE_QUALIFIER 0x06
132: #define USB_DT_OTHER_SPEED_CONFIG 0x07
1.1.1.12 root 133: #define USB_DT_DEBUG 0x0A
134: #define USB_DT_INTERFACE_ASSOC 0x0B
1.1 root 135:
1.1.1.6 root 136: #define USB_ENDPOINT_XFER_CONTROL 0
137: #define USB_ENDPOINT_XFER_ISOC 1
138: #define USB_ENDPOINT_XFER_BULK 2
139: #define USB_ENDPOINT_XFER_INT 3
140:
1.1.1.9 root 141: typedef struct USBBus USBBus;
1.1.1.12 root 142: typedef struct USBBusOps USBBusOps;
1.1 root 143: typedef struct USBPort USBPort;
144: typedef struct USBDevice USBDevice;
1.1.1.9 root 145: typedef struct USBDeviceInfo USBDeviceInfo;
1.1.1.4 root 146: typedef struct USBPacket USBPacket;
1.1 root 147:
1.1.1.11 root 148: typedef struct USBDesc USBDesc;
149: typedef struct USBDescID USBDescID;
150: typedef struct USBDescDevice USBDescDevice;
151: typedef struct USBDescConfig USBDescConfig;
1.1.1.12 root 152: typedef struct USBDescIfaceAssoc USBDescIfaceAssoc;
1.1.1.11 root 153: typedef struct USBDescIface USBDescIface;
154: typedef struct USBDescEndpoint USBDescEndpoint;
155: typedef struct USBDescOther USBDescOther;
156: typedef struct USBDescString USBDescString;
157:
158: struct USBDescString {
159: uint8_t index;
160: char *str;
161: QLIST_ENTRY(USBDescString) next;
162: };
163:
1.1 root 164: /* definition of a USB device */
165: struct USBDevice {
1.1.1.9 root 166: DeviceState qdev;
167: USBDeviceInfo *info;
1.1.1.11 root 168: USBPort *port;
169: char *port_path;
1.1 root 170: void *opaque;
1.1.1.6 root 171:
1.1.1.12 root 172: /* Actual connected speed */
1.1.1.9 root 173: int speed;
1.1.1.12 root 174: /* Supported speeds, not in info because it may be variable (hostdevs) */
175: int speedmask;
1.1.1.9 root 176: uint8_t addr;
177: char product_desc[32];
178: int auto_attach;
179: int attached;
180:
1.1.1.11 root 181: int32_t state;
1.1.1.9 root 182: uint8_t setup_buf[8];
1.1.1.12 root 183: uint8_t data_buf[4096];
1.1.1.11 root 184: int32_t remote_wakeup;
185: int32_t setup_state;
186: int32_t setup_len;
187: int32_t setup_index;
188:
189: QLIST_HEAD(, USBDescString) strings;
190: const USBDescDevice *device;
191: const USBDescConfig *config;
1.1.1.9 root 192: };
193:
194: struct USBDeviceInfo {
195: DeviceInfo qdev;
196: int (*init)(USBDevice *dev);
197:
198: /*
199: * Process USB packet.
1.1.1.6 root 200: * Called by the HC (Host Controller).
201: *
1.1.1.9 root 202: * Returns length of the transaction
1.1.1.6 root 203: * or one of the USB_RET_XXX codes.
1.1.1.9 root 204: */
1.1.1.4 root 205: int (*handle_packet)(USBDevice *dev, USBPacket *p);
1.1.1.6 root 206:
1.1.1.9 root 207: /*
1.1.1.12 root 208: * Called when a packet is canceled.
209: */
210: void (*cancel_packet)(USBDevice *dev, USBPacket *p);
211:
212: /*
1.1.1.6 root 213: * Called when device is destroyed.
214: */
1.1.1.3 root 215: void (*handle_destroy)(USBDevice *dev);
216:
1.1.1.6 root 217: /*
1.1.1.11 root 218: * Attach the device
219: */
220: void (*handle_attach)(USBDevice *dev);
221:
222: /*
1.1.1.6 root 223: * Reset the device
1.1.1.9 root 224: */
1.1 root 225: void (*handle_reset)(USBDevice *dev);
1.1.1.6 root 226:
227: /*
228: * Process control request.
229: * Called from handle_packet().
230: *
231: * Returns length or one of the USB_RET_ codes.
232: */
1.1.1.12 root 233: int (*handle_control)(USBDevice *dev, USBPacket *p, int request, int value,
1.1 root 234: int index, int length, uint8_t *data);
1.1.1.6 root 235:
236: /*
237: * Process data transfers (both BULK and ISOC).
238: * Called from handle_packet().
239: *
240: * Returns length or one of the USB_RET_ codes.
241: */
1.1.1.4 root 242: int (*handle_data)(USBDevice *dev, USBPacket *p);
1.1.1.6 root 243:
1.1.1.9 root 244: const char *product_desc;
1.1.1.11 root 245: const USBDesc *usb_desc;
1.1.1.5 root 246:
1.1.1.9 root 247: /* handle legacy -usbdevice command line options */
248: const char *usbdevice_name;
249: USBDevice *(*usbdevice_init)(const char *params);
1.1 root 250: };
251:
1.1.1.11 root 252: typedef struct USBPortOps {
253: void (*attach)(USBPort *port);
254: void (*detach)(USBPort *port);
1.1.1.12 root 255: /*
256: * This gets called when a device downstream from the device attached to
257: * the port (iow attached through a hub) gets detached.
258: */
259: void (*child_detach)(USBPort *port, USBDevice *child);
260: void (*wakeup)(USBPort *port);
261: /*
262: * Note that port->dev will be different then the device from which
263: * the packet originated when a hub is involved, if you want the orginating
264: * device use p->owner
265: */
266: void (*complete)(USBPort *port, USBPacket *p);
1.1.1.11 root 267: } USBPortOps;
1.1.1.3 root 268:
1.1 root 269: /* USB port on which a device can be connected */
270: struct USBPort {
271: USBDevice *dev;
1.1.1.11 root 272: int speedmask;
273: char path[16];
274: USBPortOps *ops;
1.1 root 275: void *opaque;
276: int index; /* internal port index, may be used with the opaque */
1.1.1.9 root 277: QTAILQ_ENTRY(USBPort) next;
1.1 root 278: };
279:
1.1.1.4 root 280: typedef void USBCallback(USBPacket * packet, void *opaque);
281:
282: /* Structure used to hold information about an active USB packet. */
283: struct USBPacket {
284: /* Data fields for use by the driver. */
285: int pid;
286: uint8_t devaddr;
287: uint8_t devep;
1.1.1.13! root 288: QEMUIOVector iov;
! 289: int result; /* transfer length or USB_RET_* status code */
1.1.1.4 root 290: /* Internal use by the USB layer. */
1.1.1.12 root 291: USBDevice *owner;
1.1.1.4 root 292: };
293:
1.1.1.13! root 294: void usb_packet_init(USBPacket *p);
! 295: void usb_packet_setup(USBPacket *p, int pid, uint8_t addr, uint8_t ep);
! 296: void usb_packet_addbuf(USBPacket *p, void *ptr, size_t len);
! 297: int usb_packet_map(USBPacket *p, QEMUSGList *sgl);
! 298: void usb_packet_unmap(USBPacket *p);
! 299: void usb_packet_copy(USBPacket *p, void *ptr, size_t bytes);
! 300: void usb_packet_skip(USBPacket *p, size_t bytes);
! 301: void usb_packet_cleanup(USBPacket *p);
! 302:
1.1.1.12 root 303: int usb_handle_packet(USBDevice *dev, USBPacket *p);
304: void usb_packet_complete(USBDevice *dev, USBPacket *p);
305: void usb_cancel_packet(USBPacket * p);
1.1.1.4 root 306:
1.1.1.13! root 307: void usb_attach(USBPort *port);
! 308: void usb_detach(USBPort *port);
! 309: void usb_reset(USBPort *port);
1.1.1.11 root 310: void usb_wakeup(USBDevice *dev);
1.1.1.4 root 311: int usb_generic_handle_packet(USBDevice *s, USBPacket *p);
1.1.1.12 root 312: void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p);
1.1 root 313: int set_usb_string(uint8_t *buf, const char *str);
1.1.1.4 root 314: void usb_send_msg(USBDevice *dev, int msg);
315:
1.1 root 316: /* usb-linux.c */
317: USBDevice *usb_host_device_open(const char *devname);
1.1.1.6 root 318: int usb_host_device_close(const char *devname);
1.1.1.8 root 319: void usb_host_info(Monitor *mon);
1.1 root 320:
1.1.1.6 root 321: /* usb-bt.c */
322: USBDevice *usb_bt_init(HCIInfo *hci);
323:
1.1.1.5 root 324: /* usb ports of the VM */
325:
326: #define VM_USB_HUB_SIZE 8
327:
1.1.1.6 root 328: /* usb-musb.c */
329: enum musb_irq_source_e {
330: musb_irq_suspend = 0,
331: musb_irq_resume,
332: musb_irq_rst_babble,
333: musb_irq_sof,
334: musb_irq_connect,
335: musb_irq_disconnect,
336: musb_irq_vbus_request,
337: musb_irq_vbus_error,
338: musb_irq_rx,
339: musb_irq_tx,
340: musb_set_vbus,
341: musb_set_session,
1.1.1.13! root 342: /* Add new interrupts here */
! 343: musb_irq_max, /* total number of interrupts defined */
1.1.1.6 root 344: };
345:
1.1.1.8 root 346: typedef struct MUSBState MUSBState;
1.1.1.13! root 347: MUSBState *musb_init(DeviceState *parent_device, int gpio_base);
! 348: void musb_reset(MUSBState *s);
1.1.1.8 root 349: uint32_t musb_core_intr_get(MUSBState *s);
350: void musb_core_intr_clear(MUSBState *s, uint32_t mask);
351: void musb_set_size(MUSBState *s, int epnum, int size, int is_tx);
1.1.1.9 root 352:
353: /* usb-bus.c */
354:
355: struct USBBus {
356: BusState qbus;
1.1.1.12 root 357: USBBusOps *ops;
1.1.1.9 root 358: int busnr;
359: int nfree;
360: int nused;
361: QTAILQ_HEAD(, USBPort) free;
362: QTAILQ_HEAD(, USBPort) used;
363: QTAILQ_ENTRY(USBBus) next;
364: };
365:
1.1.1.12 root 366: struct USBBusOps {
367: int (*register_companion)(USBBus *bus, USBPort *ports[],
368: uint32_t portcount, uint32_t firstport);
369: };
370:
371: void usb_bus_new(USBBus *bus, USBBusOps *ops, DeviceState *host);
1.1.1.9 root 372: USBBus *usb_bus_find(int busnr);
373: void usb_qdev_register(USBDeviceInfo *info);
374: void usb_qdev_register_many(USBDeviceInfo *info);
375: USBDevice *usb_create(USBBus *bus, const char *name);
376: USBDevice *usb_create_simple(USBBus *bus, const char *name);
377: USBDevice *usbdevice_create(const char *cmdline);
378: void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
1.1.1.11 root 379: USBPortOps *ops, int speedmask);
1.1.1.12 root 380: int usb_register_companion(const char *masterbus, USBPort *ports[],
381: uint32_t portcount, uint32_t firstport,
382: void *opaque, USBPortOps *ops, int speedmask);
1.1.1.11 root 383: void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr);
1.1.1.9 root 384: void usb_unregister_port(USBBus *bus, USBPort *port);
1.1.1.13! root 385: int usb_claim_port(USBDevice *dev);
! 386: void usb_release_port(USBDevice *dev);
1.1.1.9 root 387: int usb_device_attach(USBDevice *dev);
388: int usb_device_detach(USBDevice *dev);
389: int usb_device_delete_addr(int busnr, int addr);
390:
391: static inline USBBus *usb_bus_from_device(USBDevice *d)
392: {
393: return DO_UPCAST(USBBus, qbus, d->qdev.parent_bus);
394: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.