|
|
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;
288: uint8_t *data;
289: int len;
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.12! root 294: int usb_handle_packet(USBDevice *dev, USBPacket *p);
! 295: void usb_packet_complete(USBDevice *dev, USBPacket *p);
! 296: void usb_cancel_packet(USBPacket * p);
1.1.1.4 root 297:
1.1 root 298: void usb_attach(USBPort *port, USBDevice *dev);
1.1.1.11 root 299: void usb_wakeup(USBDevice *dev);
1.1.1.4 root 300: int usb_generic_handle_packet(USBDevice *s, USBPacket *p);
1.1.1.12! root 301: void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p);
1.1 root 302: int set_usb_string(uint8_t *buf, const char *str);
1.1.1.4 root 303: void usb_send_msg(USBDevice *dev, int msg);
304:
1.1 root 305: /* usb-linux.c */
306: USBDevice *usb_host_device_open(const char *devname);
1.1.1.6 root 307: int usb_host_device_close(const char *devname);
1.1.1.8 root 308: void usb_host_info(Monitor *mon);
1.1 root 309:
310: /* usb-hid.c */
1.1.1.6 root 311: void usb_hid_datain_cb(USBDevice *dev, void *opaque, void (*datain)(void *));
1.1.1.3 root 312:
1.1.1.6 root 313: /* usb-bt.c */
314: USBDevice *usb_bt_init(HCIInfo *hci);
315:
1.1.1.5 root 316: /* usb ports of the VM */
317:
318: #define VM_USB_HUB_SIZE 8
319:
1.1.1.6 root 320: /* usb-musb.c */
321: enum musb_irq_source_e {
322: musb_irq_suspend = 0,
323: musb_irq_resume,
324: musb_irq_rst_babble,
325: musb_irq_sof,
326: musb_irq_connect,
327: musb_irq_disconnect,
328: musb_irq_vbus_request,
329: musb_irq_vbus_error,
330: musb_irq_rx,
331: musb_irq_tx,
332: musb_set_vbus,
333: musb_set_session,
334: __musb_irq_max,
335: };
336:
1.1.1.8 root 337: typedef struct MUSBState MUSBState;
338: MUSBState *musb_init(qemu_irq *irqs);
339: uint32_t musb_core_intr_get(MUSBState *s);
340: void musb_core_intr_clear(MUSBState *s, uint32_t mask);
341: void musb_set_size(MUSBState *s, int epnum, int size, int is_tx);
1.1.1.9 root 342:
343: /* usb-bus.c */
344:
345: struct USBBus {
346: BusState qbus;
1.1.1.12! root 347: USBBusOps *ops;
1.1.1.9 root 348: int busnr;
349: int nfree;
350: int nused;
351: QTAILQ_HEAD(, USBPort) free;
352: QTAILQ_HEAD(, USBPort) used;
353: QTAILQ_ENTRY(USBBus) next;
354: };
355:
1.1.1.12! root 356: struct USBBusOps {
! 357: int (*register_companion)(USBBus *bus, USBPort *ports[],
! 358: uint32_t portcount, uint32_t firstport);
! 359: };
! 360:
! 361: void usb_bus_new(USBBus *bus, USBBusOps *ops, DeviceState *host);
1.1.1.9 root 362: USBBus *usb_bus_find(int busnr);
363: void usb_qdev_register(USBDeviceInfo *info);
364: void usb_qdev_register_many(USBDeviceInfo *info);
365: USBDevice *usb_create(USBBus *bus, const char *name);
366: USBDevice *usb_create_simple(USBBus *bus, const char *name);
367: USBDevice *usbdevice_create(const char *cmdline);
368: void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
1.1.1.11 root 369: USBPortOps *ops, int speedmask);
1.1.1.12! root 370: int usb_register_companion(const char *masterbus, USBPort *ports[],
! 371: uint32_t portcount, uint32_t firstport,
! 372: void *opaque, USBPortOps *ops, int speedmask);
1.1.1.11 root 373: void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr);
1.1.1.9 root 374: void usb_unregister_port(USBBus *bus, USBPort *port);
375: int usb_device_attach(USBDevice *dev);
376: int usb_device_detach(USBDevice *dev);
377: int usb_device_delete_addr(int busnr, int addr);
378:
379: static inline USBBus *usb_bus_from_device(USBDevice *d)
380: {
381: return DO_UPCAST(USBBus, qbus, d->qdev.parent_bus);
382: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.