VirtualBox

source: vbox/trunk/include/VBox/vusb.h@ 59875

Last change on this file since 59875 was 59875, checked in by vboxsync, 9 years ago

VUSB: Move the thread for periodic frame procession down to the roothub. There we don't need to replicate the code to EHCI later and it has much better overview of the amount of active URBs to schedule when to process new frames

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 42.0 KB
Line 
1/** @file
2 * VUSB - VirtualBox USB. (DEV,VMM)
3 */
4
5/*
6 * Copyright (C) 2006-2015 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.215389.xyz. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_vusb_h
27#define ___VBox_vusb_h
28
29#include <VBox/cdefs.h>
30#include <VBox/types.h>
31#include <iprt/assert.h>
32
33struct PDMLED;
34
35RT_C_DECLS_BEGIN
36
37/** @defgroup grp_vusb VBox USB API
38 * @{
39 */
40
41/** @defgroup grp_vusb_std Standard Stuff
42 * @{ */
43
44/** Frequency of USB bus (from spec). */
45#define VUSB_BUS_HZ 12000000
46
47
48/** @name USB Descriptor types (from spec)
49 * @{ */
50#define VUSB_DT_DEVICE 0x01
51#define VUSB_DT_CONFIG 0x02
52#define VUSB_DT_STRING 0x03
53#define VUSB_DT_INTERFACE 0x04
54#define VUSB_DT_ENDPOINT 0x05
55#define VUSB_DT_DEVICE_QUALIFIER 0x06
56#define VUSB_DT_OTHER_SPEED_CFG 0x07
57#define VUSB_DT_INTERFACE_POWER 0x08
58#define VUSB_DT_INTERFACE_ASSOCIATION 0x0B
59#define VUSB_DT_BOS 0x0F
60#define VUSB_DT_DEVICE_CAPABILITY 0x10
61#define VUSB_DT_SS_ENDPOINT_COMPANION 0x30
62/** @} */
63
64/** @name USB Descriptor minimum sizes (from spec)
65 * @{ */
66#define VUSB_DT_DEVICE_MIN_LEN 18
67#define VUSB_DT_CONFIG_MIN_LEN 9
68#define VUSB_DT_CONFIG_STRING_MIN_LEN 2
69#define VUSB_DT_INTERFACE_MIN_LEN 9
70#define VUSB_DT_ENDPOINT_MIN_LEN 7
71#define VUSB_DT_SSEP_COMPANION_MIN_LEN 6
72/** @} */
73
74/** @name USB Device Capability Type Codes (from spec)
75 * @{ */
76#define VUSB_DCT_WIRELESS_USB 0x01
77#define VUSB_DCT_USB_20_EXTENSION 0x02
78#define VUSB_DCT_SUPERSPEED_USB 0x03
79#define VUSB_DCT_CONTAINER_ID 0x04
80/** @} */
81
82
83#pragma pack(1) /* ensure byte packing of the descriptors. */
84
85/**
86 * USB language id descriptor (from specs).
87 */
88typedef struct VUSBDESCLANGID
89{
90 uint8_t bLength;
91 uint8_t bDescriptorType;
92} VUSBDESCLANGID;
93/** Pointer to a USB language id descriptor. */
94typedef VUSBDESCLANGID *PVUSBDESCLANGID;
95/** Pointer to a const USB language id descriptor. */
96typedef const VUSBDESCLANGID *PCVUSBDESCLANGID;
97
98
99/**
100 * USB string descriptor (from specs).
101 */
102typedef struct VUSBDESCSTRING
103{
104 uint8_t bLength;
105 uint8_t bDescriptorType;
106} VUSBDESCSTRING;
107/** Pointer to a USB string descriptor. */
108typedef VUSBDESCSTRING *PVUSBDESCSTRING;
109/** Pointer to a const USB string descriptor. */
110typedef const VUSBDESCSTRING *PCVUSBDESCSTRING;
111
112
113/**
114 * USB device descriptor (from spec)
115 */
116typedef struct VUSBDESCDEVICE
117{
118 uint8_t bLength;
119 uint8_t bDescriptorType;
120 uint16_t bcdUSB;
121 uint8_t bDeviceClass;
122 uint8_t bDeviceSubClass;
123 uint8_t bDeviceProtocol;
124 uint8_t bMaxPacketSize0;
125 uint16_t idVendor;
126 uint16_t idProduct;
127 uint16_t bcdDevice;
128 uint8_t iManufacturer;
129 uint8_t iProduct;
130 uint8_t iSerialNumber;
131 uint8_t bNumConfigurations;
132} VUSBDESCDEVICE;
133/** Pointer to a USB device descriptor. */
134typedef VUSBDESCDEVICE *PVUSBDESCDEVICE;
135/** Pointer to a const USB device descriptor. */
136typedef const VUSBDESCDEVICE *PCVUSBDESCDEVICE;
137
138/**
139 * USB device qualifier (from spec 9.6.2)
140 */
141struct VUSBDEVICEQUALIFIER
142{
143 uint8_t bLength;
144 uint8_t bDescriptorType;
145 uint16_t bcdUsb;
146 uint8_t bDeviceClass;
147 uint8_t bDeviceSubClass;
148 uint8_t bDeviceProtocol;
149 uint8_t bMaxPacketSize0;
150 uint8_t bNumConfigurations;
151 uint8_t bReserved;
152};
153
154typedef struct VUSBDEVICEQUALIFIER VUSBDEVICEQUALIFIER;
155typedef VUSBDEVICEQUALIFIER *PVUSBDEVICEQUALIFIER;
156
157
158/**
159 * USB configuration descriptor (from spec).
160 */
161typedef struct VUSBDESCCONFIG
162{
163 uint8_t bLength;
164 uint8_t bDescriptorType;
165 uint16_t wTotalLength; /**< recalculated by VUSB when involved in URB. */
166 uint8_t bNumInterfaces;
167 uint8_t bConfigurationValue;
168 uint8_t iConfiguration;
169 uint8_t bmAttributes;
170 uint8_t MaxPower;
171} VUSBDESCCONFIG;
172/** Pointer to a USB configuration descriptor. */
173typedef VUSBDESCCONFIG *PVUSBDESCCONFIG;
174/** Pointer to a readonly USB configuration descriptor. */
175typedef const VUSBDESCCONFIG *PCVUSBDESCCONFIG;
176
177
178/**
179 * USB interface association descriptor (from USB ECN Interface Association Descriptors)
180 */
181typedef struct VUSBDESCIAD
182{
183 uint8_t bLength;
184 uint8_t bDescriptorType;
185 uint8_t bFirstInterface;
186 uint8_t bInterfaceCount;
187 uint8_t bFunctionClass;
188 uint8_t bFunctionSubClass;
189 uint8_t bFunctionProtocol;
190 uint8_t iFunction;
191} VUSBDESCIAD;
192/** Pointer to a USB interface association descriptor. */
193typedef VUSBDESCIAD *PVUSBDESCIAD;
194/** Pointer to a readonly USB interface association descriptor. */
195typedef const VUSBDESCIAD *PCVUSBDESCIAD;
196
197
198/**
199 * USB interface descriptor (from spec)
200 */
201typedef struct VUSBDESCINTERFACE
202{
203 uint8_t bLength;
204 uint8_t bDescriptorType;
205 uint8_t bInterfaceNumber;
206 uint8_t bAlternateSetting;
207 uint8_t bNumEndpoints;
208 uint8_t bInterfaceClass;
209 uint8_t bInterfaceSubClass;
210 uint8_t bInterfaceProtocol;
211 uint8_t iInterface;
212} VUSBDESCINTERFACE;
213/** Pointer to a USB interface descriptor. */
214typedef VUSBDESCINTERFACE *PVUSBDESCINTERFACE;
215/** Pointer to a const USB interface descriptor. */
216typedef const VUSBDESCINTERFACE *PCVUSBDESCINTERFACE;
217
218
219/**
220 * USB endpoint descriptor (from spec)
221 */
222typedef struct VUSBDESCENDPOINT
223{
224 uint8_t bLength;
225 uint8_t bDescriptorType;
226 uint8_t bEndpointAddress;
227 uint8_t bmAttributes;
228 uint16_t wMaxPacketSize;
229 uint8_t bInterval;
230} VUSBDESCENDPOINT;
231/** Pointer to a USB endpoint descriptor. */
232typedef VUSBDESCENDPOINT *PVUSBDESCENDPOINT;
233/** Pointer to a const USB endpoint descriptor. */
234typedef const VUSBDESCENDPOINT *PCVUSBDESCENDPOINT;
235
236
237/**
238 * USB SuperSpeed endpoint companion descriptor (from USB3 spec)
239 */
240typedef struct VUSBDESCSSEPCOMPANION
241{
242 uint8_t bLength;
243 uint8_t bDescriptorType;
244 uint8_t bMaxBurst;
245 uint8_t bmAttributes;
246 uint16_t wBytesPerInterval;
247} VUSBDESCSSEPCOMPANION;
248/** Pointer to a USB endpoint companion descriptor. */
249typedef VUSBDESCSSEPCOMPANION *PVUSBDESCSSEPCOMPANION;
250/** Pointer to a const USB endpoint companion descriptor. */
251typedef const VUSBDESCSSEPCOMPANION *PCVUSBDESCSSEPCOMPANION;
252
253
254/**
255 * USB Binary Device Object Store, aka BOS (from USB3 spec)
256 */
257typedef struct VUSBDESCBOS
258{
259 uint8_t bLength;
260 uint8_t bDescriptorType;
261 uint16_t wTotalLength;
262 uint8_t bNumDeviceCaps;
263} VUSBDESCBOS;
264/** Pointer to a USB BOS descriptor. */
265typedef VUSBDESCBOS *PVUSBDESCBOS;
266/** Pointer to a const USB BOS descriptor. */
267typedef const VUSBDESCBOS *PCVUSBDESCBOS;
268
269
270/**
271 * Generic USB Device Capability Descriptor within BOS (from USB3 spec)
272 */
273typedef struct VUSBDESCDEVICECAP
274{
275 uint8_t bLength;
276 uint8_t bDescriptorType;
277 uint8_t bDevCapabilityType;
278 uint8_t aCapSpecific[1];
279} VUSBDESCDEVICECAP;
280/** Pointer to a USB device capability descriptor. */
281typedef VUSBDESCDEVICECAP *PVUSBDESCDEVICECAP;
282/** Pointer to a const USB device capability descriptor. */
283typedef const VUSBDESCDEVICECAP *PCVUSBDESCDEVICECAP;
284
285
286/**
287 * SuperSpeed USB Device Capability Descriptor within BOS
288 */
289typedef struct VUSBDESCSSDEVCAP
290{
291 uint8_t bLength;
292 uint8_t bDescriptorType; /* DEVICE CAPABILITY */
293 uint8_t bDevCapabilityType; /* SUPERSPEED_USB */
294 uint8_t bmAttributes;
295 uint16_t wSpeedsSupported;
296 uint8_t bFunctionalitySupport;
297 uint8_t bU1DevExitLat;
298 uint16_t wU2DevExitLat;
299} VUSBDESCSSDEVCAP;
300/** Pointer to an SS USB device capability descriptor. */
301typedef VUSBDESCSSDEVCAP *PVUSBDESCSSDEVCAP;
302/** Pointer to a const SS USB device capability descriptor. */
303typedef const VUSBDESCSSDEVCAP *PCVUSBDESCSSDEVCAP;
304
305
306/**
307 * USB 2.0 Extension Descriptor within BOS
308 */
309typedef struct VUSBDESCUSB2EXT
310{
311 uint8_t bLength;
312 uint8_t bDescriptorType; /* DEVICE CAPABILITY */
313 uint8_t bDevCapabilityType; /* USB 2.0 EXTENSION */
314 uint8_t bmAttributes;
315} VUSBDESCUSB2EXT;
316/** Pointer to a USB 2.0 extension capability descriptor. */
317typedef VUSBDESCUSB2EXT *PVUSBDESCUSB2EXT;
318/** Pointer to a const USB 2.0 extension capability descriptor. */
319typedef const VUSBDESCUSB2EXT *PCVUSBDESCUSB2EXT;
320
321
322#pragma pack() /* end of the byte packing. */
323
324
325/**
326 * USB configuration descriptor, the parsed variant used by VUSB.
327 */
328typedef struct VUSBDESCCONFIGEX
329{
330 /** The USB descriptor data.
331 * @remark The wTotalLength member is recalculated before the data is passed to the guest. */
332 VUSBDESCCONFIG Core;
333 /** Pointer to additional descriptor bytes following what's covered by VUSBDESCCONFIG. */
334 void *pvMore;
335 /** Pointer to an array of the interfaces referenced in the configuration.
336 * Core.bNumInterfaces in size. */
337 const struct VUSBINTERFACE *paIfs;
338 /** Pointer to the original descriptor data read from the device. */
339 const void *pvOriginal;
340} VUSBDESCCONFIGEX;
341/** Pointer to a parsed USB configuration descriptor. */
342typedef VUSBDESCCONFIGEX *PVUSBDESCCONFIGEX;
343/** Pointer to a const parsed USB configuration descriptor. */
344typedef const VUSBDESCCONFIGEX *PCVUSBDESCCONFIGEX;
345
346
347/**
348 * For tracking the alternate interface settings of a configuration.
349 */
350typedef struct VUSBINTERFACE
351{
352 /** Pointer to an array of interfaces. */
353 const struct VUSBDESCINTERFACEEX *paSettings;
354 /** The number of entries in the array. */
355 uint32_t cSettings;
356} VUSBINTERFACE;
357/** Pointer to a VUSBINTERFACE. */
358typedef VUSBINTERFACE *PVUSBINTERFACE;
359/** Pointer to a const VUSBINTERFACE. */
360typedef const VUSBINTERFACE *PCVUSBINTERFACE;
361
362
363/**
364 * USB interface descriptor, the parsed variant used by VUSB.
365 */
366typedef struct VUSBDESCINTERFACEEX
367{
368 /** The USB descriptor data. */
369 VUSBDESCINTERFACE Core;
370 /** Pointer to additional descriptor bytes following what's covered by VUSBDESCINTERFACE. */
371 const void *pvMore;
372 /** Pointer to additional class- or vendor-specific interface descriptors. */
373 const void *pvClass;
374 /** Size of class- or vendor-specific descriptors. */
375 uint16_t cbClass;
376 /** Pointer to an array of the endpoints referenced by the interface.
377 * Core.bNumEndpoints in size. */
378 const struct VUSBDESCENDPOINTEX *paEndpoints;
379 /** Interface association descriptor, which prepends a group of interfaces,
380 * starting with this interface. */
381 PCVUSBDESCIAD pIAD;
382 /** Size of interface association descriptor. */
383 uint16_t cbIAD;
384} VUSBDESCINTERFACEEX;
385/** Pointer to an prased USB interface descriptor. */
386typedef VUSBDESCINTERFACEEX *PVUSBDESCINTERFACEEX;
387/** Pointer to a const parsed USB interface descriptor. */
388typedef const VUSBDESCINTERFACEEX *PCVUSBDESCINTERFACEEX;
389
390
391/**
392 * USB endpoint descriptor, the parsed variant used by VUSB.
393 */
394typedef struct VUSBDESCENDPOINTEX
395{
396 /** The USB descriptor data.
397 * @remark The wMaxPacketSize member is converted to native endian. */
398 VUSBDESCENDPOINT Core;
399 /** Pointer to additional descriptor bytes following what's covered by VUSBDESCENDPOINT. */
400 const void *pvMore;
401 /** Pointer to additional class- or vendor-specific endpoint descriptors. */
402 const void *pvClass;
403 /** Size of class- or vendor-specific descriptors. */
404 uint16_t cbClass;
405 /** Pointer to SuperSpeed endpoint companion descriptor (SS endpoints only). */
406 const void *pvSsepc;
407 /** Size of SuperSpeed endpoint companion descriptor.
408 * @remark Must be non-zero for SuperSpeed endpoints. */
409 uint16_t cbSsepc;
410} VUSBDESCENDPOINTEX;
411/** Pointer to a parsed USB endpoint descriptor. */
412typedef VUSBDESCENDPOINTEX *PVUSBDESCENDPOINTEX;
413/** Pointer to a const parsed USB endpoint descriptor. */
414typedef const VUSBDESCENDPOINTEX *PCVUSBDESCENDPOINTEX;
415
416
417/** @name USB Control message recipient codes (from spec)
418 * @{ */
419#define VUSB_TO_DEVICE 0x0
420#define VUSB_TO_INTERFACE 0x1
421#define VUSB_TO_ENDPOINT 0x2
422#define VUSB_TO_OTHER 0x3
423#define VUSB_RECIP_MASK 0x1f
424/** @} */
425
426/** @name USB control pipe setup packet structure (from spec)
427 * @{ */
428#define VUSB_REQ_SHIFT (5)
429#define VUSB_REQ_STANDARD (0x0 << VUSB_REQ_SHIFT)
430#define VUSB_REQ_CLASS (0x1 << VUSB_REQ_SHIFT)
431#define VUSB_REQ_VENDOR (0x2 << VUSB_REQ_SHIFT)
432#define VUSB_REQ_RESERVED (0x3 << VUSB_REQ_SHIFT)
433#define VUSB_REQ_MASK (0x3 << VUSB_REQ_SHIFT)
434/** @} */
435
436#define VUSB_DIR_TO_DEVICE 0x00
437#define VUSB_DIR_TO_HOST 0x80
438#define VUSB_DIR_MASK 0x80
439
440/**
441 * USB Setup request (from spec)
442 */
443typedef struct vusb_setup
444{
445 uint8_t bmRequestType;
446 uint8_t bRequest;
447 uint16_t wValue;
448 uint16_t wIndex;
449 uint16_t wLength;
450} VUSBSETUP;
451/** Pointer to a setup request. */
452typedef VUSBSETUP *PVUSBSETUP;
453/** Pointer to a const setup request. */
454typedef const VUSBSETUP *PCVUSBSETUP;
455
456/** @name USB Standard device requests (from spec)
457 * @{ */
458#define VUSB_REQ_GET_STATUS 0x00
459#define VUSB_REQ_CLEAR_FEATURE 0x01
460#define VUSB_REQ_SET_FEATURE 0x03
461#define VUSB_REQ_SET_ADDRESS 0x05
462#define VUSB_REQ_GET_DESCRIPTOR 0x06
463#define VUSB_REQ_SET_DESCRIPTOR 0x07
464#define VUSB_REQ_GET_CONFIGURATION 0x08
465#define VUSB_REQ_SET_CONFIGURATION 0x09
466#define VUSB_REQ_GET_INTERFACE 0x0a
467#define VUSB_REQ_SET_INTERFACE 0x0b
468#define VUSB_REQ_SYNCH_FRAME 0x0c
469#define VUSB_REQ_MAX 0x0d
470/** @} */
471
472/** @} */ /* end of grp_vusb_std */
473
474
475
476/** @name USB Standard version flags.
477 * @{ */
478/** Indicates USB 1.1 support. */
479#define VUSB_STDVER_11 RT_BIT(1)
480/** Indicates USB 2.0 support. */
481#define VUSB_STDVER_20 RT_BIT(2)
482/** Indicates USB 3.0 support. */
483#define VUSB_STDVER_30 RT_BIT(3)
484/** @} */
485
486/**
487 * USB port/device speeds.
488 */
489typedef enum VUSBSPEED
490{
491 /** Undetermined/unknown speed. */
492 VUSB_SPEED_UNKNOWN = 0,
493 /** Low-speed (LS), 1.5 Mbit/s, USB 1.0. */
494 VUSB_SPEED_LOW,
495 /** Full-speed (FS), 12 Mbit/s, USB 1.1. */
496 VUSB_SPEED_FULL,
497 /** High-speed (HS), 480 Mbit/s, USB 2.0. */
498 VUSB_SPEED_HIGH,
499 /** Variable speed, wireless USB 2.5. */
500 VUSB_SPEED_VARIABLE,
501 /** SuperSpeed (SS), 5.0 Gbit/s, USB 3.0. */
502 VUSB_SPEED_SUPER,
503 /** SuperSpeed+ (SS+), 10.0 Gbit/s, USB 3.1. */
504 VUSB_SPEED_SUPERPLUS,
505 /** The usual 32-bit hack. */
506 VUSB_SPEED_32BIT_HACK = 0x7fffffff
507} VUSBSPEED;
508
509/**
510 * VUSB transfer direction.
511 */
512typedef enum VUSBDIRECTION
513{
514 /** Setup */
515 VUSBDIRECTION_SETUP = 0,
516#define VUSB_DIRECTION_SETUP VUSBDIRECTION_SETUP
517 /** In - Device to host. */
518 VUSBDIRECTION_IN = 1,
519#define VUSB_DIRECTION_IN VUSBDIRECTION_IN
520 /** Out - Host to device. */
521 VUSBDIRECTION_OUT = 2,
522#define VUSB_DIRECTION_OUT VUSBDIRECTION_OUT
523 /** Invalid direction */
524 VUSBDIRECTION_INVALID = 0x7f
525} VUSBDIRECTION;
526
527/**
528 * VUSB Transfer types.
529 */
530typedef enum VUSBXFERTYPE
531{
532 /** Control message. Used to represent a single control transfer. */
533 VUSBXFERTYPE_CTRL = 0,
534 /* Isochronous transfer. */
535 VUSBXFERTYPE_ISOC,
536 /** Bulk transfer. */
537 VUSBXFERTYPE_BULK,
538 /** Interrupt transfer. */
539 VUSBXFERTYPE_INTR,
540 /** Complete control message. Used to represent an entire control message. */
541 VUSBXFERTYPE_MSG,
542 /** Invalid transfer type. */
543 VUSBXFERTYPE_INVALID = 0x7f
544} VUSBXFERTYPE;
545
546/** Number of valid USB transfer types - KEEP in sync with VUSBXFERTYPE!. */
547#define VUSBXFERTYPE_ELEMENTS (5)
548
549/** Pointer to a VBox USB device interface. */
550typedef struct VUSBIDEVICE *PVUSBIDEVICE;
551
552/** Pointer to a VUSB RootHub port interface. */
553typedef struct VUSBIROOTHUBPORT *PVUSBIROOTHUBPORT;
554
555/** Pointer to an USB request descriptor. */
556typedef struct VUSBURB *PVUSBURB;
557
558
559
560/**
561 * VBox USB port bitmap.
562 *
563 * Bit 0 == Port 0, ... , Bit 127 == Port 127.
564 */
565typedef struct VUSBPORTBITMAP
566{
567 /** 128 bits */
568 char ach[16];
569} VUSBPORTBITMAP;
570/** Pointer to a VBox USB port bitmap. */
571typedef VUSBPORTBITMAP *PVUSBPORTBITMAP;
572
573#ifndef RDESKTOP
574
575/**
576 * The VUSB RootHub port interface provided by the HCI (down).
577 * Pair with VUSBIROOTCONNECTOR
578 */
579typedef struct VUSBIROOTHUBPORT
580{
581 /**
582 * Get the number of available ports in the hub.
583 *
584 * @returns The number of ports available.
585 * @param pInterface Pointer to this structure.
586 * @param pAvailable Bitmap indicating the available ports. Set bit == available port.
587 */
588 DECLR3CALLBACKMEMBER(unsigned, pfnGetAvailablePorts,(PVUSBIROOTHUBPORT pInterface, PVUSBPORTBITMAP pAvailable));
589
590 /**
591 * Gets the supported USB versions.
592 *
593 * @returns The mask of supported USB versions.
594 * @param pInterface Pointer to this structure.
595 */
596 DECLR3CALLBACKMEMBER(uint32_t, pfnGetUSBVersions,(PVUSBIROOTHUBPORT pInterface));
597
598 /**
599 * A device is being attached to a port in the roothub.
600 *
601 * @param pInterface Pointer to this structure.
602 * @param pDev Pointer to the device being attached.
603 * @param uPort The port number assigned to the device.
604 */
605 DECLR3CALLBACKMEMBER(int, pfnAttach,(PVUSBIROOTHUBPORT pInterface, PVUSBIDEVICE pDev, unsigned uPort));
606
607 /**
608 * A device is being detached from a port in the roothub.
609 *
610 * @param pInterface Pointer to this structure.
611 * @param pDev Pointer to the device being detached.
612 * @param uPort The port number assigned to the device.
613 */
614 DECLR3CALLBACKMEMBER(void, pfnDetach,(PVUSBIROOTHUBPORT pInterface, PVUSBIDEVICE pDev, unsigned uPort));
615
616 /**
617 * Reset the root hub.
618 *
619 * @returns VBox status code.
620 * @param pInterface Pointer to this structure.
621 * @param pResetOnLinux Whether or not to do real reset on linux.
622 */
623 DECLR3CALLBACKMEMBER(int, pfnReset,(PVUSBIROOTHUBPORT pInterface, bool fResetOnLinux));
624
625 /**
626 * Transfer completion callback routine.
627 *
628 * VUSB will call this when a transfer have been completed
629 * in a one or another way.
630 *
631 * @param pInterface Pointer to this structure.
632 * @param pUrb Pointer to the URB in question.
633 */
634 DECLR3CALLBACKMEMBER(void, pfnXferCompletion,(PVUSBIROOTHUBPORT pInterface, PVUSBURB urb));
635
636 /**
637 * Handle transfer errors.
638 *
639 * VUSB calls this when a transfer attempt failed. This function will respond
640 * indicating whether to retry or complete the URB with failure.
641 *
642 * @returns Retry indicator.
643 * @param pInterface Pointer to this structure.
644 * @param pUrb Pointer to the URB in question.
645 */
646 DECLR3CALLBACKMEMBER(bool, pfnXferError,(PVUSBIROOTHUBPORT pInterface, PVUSBURB pUrb));
647
648 /**
649 * Processes a new frame if periodic frame processing is enabled.
650 *
651 * @returns Flag whether there was activity which influences the frame rate.
652 * @param pInterface Pointer to this structure.
653 * @param u32FrameNo The frame number.
654 */
655 DECLR3CALLBACKMEMBER(bool, pfnStartFrame, (PVUSBIROOTHUBPORT pInterface, uint32_t u32FrameNo));
656
657 /**
658 * Informs the callee about a change in the frame rate due to too many idle cycles or
659 * when seeing activity after some idle time.
660 *
661 * @returns nothing.
662 * @param pInterface Pointer to this structure.
663 * @param u32Framerate The new frame rate.
664 */
665 DECLR3CALLBACKMEMBER(void, pfnFrameRateChanged, (PVUSBIROOTHUBPORT pInterface, uint32_t u32FrameRate));
666
667 /** Alignment dummy. */
668 RTR3PTR Alignment;
669
670} VUSBIROOTHUBPORT;
671/** VUSBIROOTHUBPORT interface ID. */
672#define VUSBIROOTHUBPORT_IID "6571aece-6c33-4714-a8ac-9508a3b8b429"
673
674/** Pointer to a VUSB RootHub connector interface. */
675typedef struct VUSBIROOTHUBCONNECTOR *PVUSBIROOTHUBCONNECTOR;
676/**
677 * The VUSB RootHub connector interface provided by the VBox USB RootHub driver
678 * (up).
679 * Pair with VUSBIROOTHUBPORT.
680 */
681typedef struct VUSBIROOTHUBCONNECTOR
682{
683 /**
684 * Sets the URB parameters for the caller.
685 *
686 * @returns VBox status code.
687 * @param pInterface Pointer to this struct.
688 * @param cbHci Size of the data private to the HCI for each URB when allocated.
689 * @param cbHciTd Size of one transfer descriptor. The number of transfer descriptors
690 * is given VUSBIROOTHUBCONNECTOR::pfnNewUrb for each URB to calculate the
691 * final amount of memory required for the TDs.
692 *
693 * @note This must be called before starting to allocate any URB or otherwise there will be no
694 * data available for the HCI.
695 */
696 DECLR3CALLBACKMEMBER(int, pfnSetUrbParams, (PVUSBIROOTHUBCONNECTOR pInterface, size_t cbHci, size_t cbHciTd));
697
698 /**
699 * Allocates a new URB for a transfer.
700 *
701 * Either submit using pfnSubmitUrb or free using VUSBUrbFree().
702 *
703 * @returns Pointer to a new URB.
704 * @returns NULL on failure - try again later.
705 * This will not fail if the device wasn't found. We'll fail it
706 * at submit time, since that makes the usage of this api simpler.
707 * @param pInterface Pointer to this struct.
708 * @param DstAddress The destination address of the URB.
709 * @param pDev Optional device pointer the URB is for.
710 * @param enmType Type of the URB.
711 * @param enmDir Data transfer direction.
712 * @param cbData The amount of data space required.
713 * @param cTds The amount of TD space.
714 * @param pszTag Custom URB tag assigned by the caller, only for
715 * logged builds and optional.
716 *
717 * @note pDev should be NULL in most cases. The only useful case is for USB3 where
718 * it is required for the SET_ADDRESS request because USB3 uses unicast traffic.
719 */
720 DECLR3CALLBACKMEMBER(PVUSBURB, pfnNewUrb,(PVUSBIROOTHUBCONNECTOR pInterface, uint8_t DstAddress, PVUSBIDEVICE pDev,
721 VUSBXFERTYPE enmType, VUSBDIRECTION enmDir, uint32_t cbData, uint32_t cTds, const char *pszTag));
722
723 /**
724 * Free an URB not submitted yet.
725 *
726 * @returns VBox status code.
727 * @param pInterface Pointer to this struct.
728 * @param pUrb Pointer to the URB to free returned by VUSBIROOTHUBCONNECTOR::pfnNewUrb.
729 */
730 DECLR3CALLBACKMEMBER(int, pfnFreeUrb, (PVUSBIROOTHUBCONNECTOR pInterface, PVUSBURB pUrb));
731
732 /**
733 * Submits a URB for transfer.
734 * The transfer will do asynchronously if possible.
735 *
736 * @returns VBox status code.
737 * @param pInterface Pointer to this struct.
738 * @param pUrb Pointer to the URB returned by pfnNewUrb.
739 * The URB will be freed in case of failure.
740 * @param pLed Pointer to USB Status LED
741 */
742 DECLR3CALLBACKMEMBER(int, pfnSubmitUrb,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBURB pUrb, struct PDMLED *pLed));
743
744 /**
745 * Call to service asynchronous URB completions in a polling fashion.
746 *
747 * Reaped URBs will be finished by calling the completion callback,
748 * thus there is no return code or input or anything from this function
749 * except for potential state changes elsewhere.
750 *
751 * @returns VINF_SUCCESS if no URBs are pending upon return.
752 * @returns VERR_TIMEOUT if one or more URBs are still in flight upon returning.
753 * @returns Other VBox status code.
754 *
755 * @param pInterface Pointer to this struct.
756 * @param pDevice Pointer to a USB device.
757 * @param cMillies Number of milliseconds to poll for completion.
758 */
759 DECLR3CALLBACKMEMBER(void, pfnReapAsyncUrbs,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, RTMSINTERVAL cMillies));
760
761 /**
762 * Cancels and completes - with CRC failure - all URBs queued on an endpoint.
763 * This is done in response to guest URB cancellation.
764 *
765 * @returns VBox status code.
766 * @param pInterface Pointer to this struct.
767 * @param pUrb Pointer to a previously submitted URB.
768 */
769 DECLR3CALLBACKMEMBER(int, pfnCancelUrbsEp,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBURB pUrb));
770
771 /**
772 * Cancels and completes - with CRC failure - all in-flight async URBs.
773 * This is typically done before saving a state.
774 *
775 * @param pInterface Pointer to this struct.
776 */
777 DECLR3CALLBACKMEMBER(void, pfnCancelAllUrbs,(PVUSBIROOTHUBCONNECTOR pInterface));
778
779 /**
780 * Cancels and completes - with CRC failure - all URBs queued on an endpoint.
781 * This is done in response to a guest endpoint/pipe abort.
782 *
783 * @returns VBox status code.
784 * @param pInterface Pointer to this struct.
785 * @param pDevice Pointer to a USB device.
786 * @param EndPt Endpoint number.
787 * @param enmDir Endpoint direction.
788 */
789 DECLR3CALLBACKMEMBER(int, pfnAbortEp,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, int EndPt, VUSBDIRECTION enmDir));
790
791 /**
792 * Attach the device to the root hub.
793 * The device must not be attached to any hub for this call to succeed.
794 *
795 * @returns VBox status code.
796 * @param pInterface Pointer to this struct.
797 * @param pDevice Pointer to the device (interface) to attach.
798 */
799 DECLR3CALLBACKMEMBER(int, pfnAttachDevice,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice));
800
801 /**
802 * Detach the device from the root hub.
803 * The device must already be attached for this call to succeed.
804 *
805 * @returns VBox status code.
806 * @param pInterface Pointer to this struct.
807 * @param pDevice Pointer to the device (interface) to detach.
808 */
809 DECLR3CALLBACKMEMBER(int, pfnDetachDevice,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice));
810
811 /**
812 * Sets periodic frame processing.
813 *
814 * @returns VBox status code.
815 * @param pInterface Pointer to this struct.
816 * @param uFrameRate The target frame rate in Hertz, 0 disables periodic frame processing.
817 * The real frame rate might be lower if there is no activity for a certain period or
818 * higher if there is a need for catching up with where the guest expects the device to be.
819 */
820 DECLR3CALLBACKMEMBER(int, pfnSetPeriodicFrameProcessing, (PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uFrameRate));
821
822 /**
823 * Returns the current frame rate for the periodic frame processing.
824 *
825 * @returns Frame rate for periodic frame processing.
826 * @retval 0 if disabled.
827 * @param pInterface Pointer to this struct.
828 */
829 DECLR3CALLBACKMEMBER(uint32_t, pfnGetPeriodicFrameRate, (PVUSBIROOTHUBCONNECTOR pInterface));
830
831} VUSBIROOTHUBCONNECTOR;
832AssertCompileSizeAlignment(VUSBIROOTHUBCONNECTOR, 8);
833/** VUSBIROOTHUBCONNECTOR interface ID. */
834#define VUSBIROOTHUBCONNECTOR_IID "662d7822-b9c6-43b5-88b6-5d59f0106e46"
835
836
837#ifdef IN_RING3
838/** @copydoc VUSBIROOTHUBCONNECTOR::pfnSetUrbParams */
839DECLINLINE(int) VUSBIRhSetUrbParams(PVUSBIROOTHUBCONNECTOR pInterface, size_t cbHci, size_t cbHciTd)
840{
841 return pInterface->pfnSetUrbParams(pInterface, cbHci, cbHciTd);
842}
843
844/** @copydoc VUSBIROOTHUBCONNECTOR::pfnNewUrb */
845DECLINLINE(PVUSBURB) VUSBIRhNewUrb(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t DstAddress, PVUSBIDEVICE pDev,
846 VUSBXFERTYPE enmType, VUSBDIRECTION enmDir, uint32_t cbData, uint32_t cTds, const char *pszTag)
847{
848 return pInterface->pfnNewUrb(pInterface, DstAddress, pDev, enmType, enmDir, cbData, cTds, pszTag);
849}
850
851/** @copydoc VUSBIROOTHUBCONNECTOR::pfnFreeUrb */
852DECLINLINE(int) VUSBIRhFreeUrb(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBURB pUrb)
853{
854 return pInterface->pfnFreeUrb(pInterface, pUrb);
855}
856
857/** @copydoc VUSBIROOTHUBCONNECTOR::pfnSubmitUrb */
858DECLINLINE(int) VUSBIRhSubmitUrb(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBURB pUrb, struct PDMLED *pLed)
859{
860 return pInterface->pfnSubmitUrb(pInterface, pUrb, pLed);
861}
862
863/** @copydoc VUSBIROOTHUBCONNECTOR::pfnReapAsyncUrbs */
864DECLINLINE(void) VUSBIRhReapAsyncUrbs(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice, RTMSINTERVAL cMillies)
865{
866 pInterface->pfnReapAsyncUrbs(pInterface, pDevice, cMillies);
867}
868
869/** @copydoc VUSBIROOTHUBCONNECTOR::pfnCancelAllUrbs */
870DECLINLINE(void) VUSBIRhCancelAllUrbs(PVUSBIROOTHUBCONNECTOR pInterface)
871{
872 pInterface->pfnCancelAllUrbs(pInterface);
873}
874
875/** @copydoc VUSBIROOTHUBCONNECTOR::pfnAttachDevice */
876DECLINLINE(int) VUSBIRhAttachDevice(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice)
877{
878 return pInterface->pfnAttachDevice(pInterface, pDevice);
879}
880
881/** @copydoc VUSBIROOTHUBCONNECTOR::pfnDetachDevice */
882DECLINLINE(int) VUSBIRhDetachDevice(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBIDEVICE pDevice)
883{
884 return pInterface->pfnDetachDevice(pInterface, pDevice);
885}
886
887/** @copydoc VUSBIROOTHUBCONNECTOR::pfnSetPeriodicFrameProcessing */
888DECLINLINE(int) VUSBIRhSetPeriodicFrameProcessing(PVUSBIROOTHUBCONNECTOR pInterface, uint32_t uFrameRate)
889{
890 return pInterface->pfnSetPeriodicFrameProcessing(pInterface, uFrameRate);
891}
892
893/** @copydoc VUSBIROOTHUBCONNECTOR::pfnSetPeriodicFrameProcessing */
894DECLINLINE(uint32_t) VUSBIRhGetPeriodicFrameRate(PVUSBIROOTHUBCONNECTOR pInterface)
895{
896 return pInterface->pfnGetPeriodicFrameRate(pInterface);
897}
898#endif /* IN_RING3 */
899
900#endif /* ! RDESKTOP */
901
902
903/**
904 * VUSB device reset completion callback function.
905 * This is called by the reset thread when the reset has been completed.
906 *
907 * @param pDev Pointer to the virtual USB device core.
908 * @param rc The VBox status code of the reset operation.
909 * @param pvUser User specific argument.
910 *
911 * @thread The reset thread or EMT.
912 */
913typedef DECLCALLBACK(void) FNVUSBRESETDONE(PVUSBIDEVICE pDevice, int rc, void *pvUser);
914/** Pointer to a device reset completion callback function (FNUSBRESETDONE). */
915typedef FNVUSBRESETDONE *PFNVUSBRESETDONE;
916
917/**
918 * The state of a VUSB Device.
919 *
920 * @remark The order of these states is vital.
921 */
922typedef enum VUSBDEVICESTATE
923{
924 VUSB_DEVICE_STATE_INVALID = 0,
925 VUSB_DEVICE_STATE_DETACHED,
926 VUSB_DEVICE_STATE_ATTACHED,
927 VUSB_DEVICE_STATE_POWERED,
928 VUSB_DEVICE_STATE_DEFAULT,
929 VUSB_DEVICE_STATE_ADDRESS,
930 VUSB_DEVICE_STATE_CONFIGURED,
931 VUSB_DEVICE_STATE_SUSPENDED,
932 /** The device is being reset. Don't mess with it.
933 * Next states: VUSB_DEVICE_STATE_DEFAULT, VUSB_DEVICE_STATE_DESTROYED
934 */
935 VUSB_DEVICE_STATE_RESET,
936 /** The device has been destroyed. */
937 VUSB_DEVICE_STATE_DESTROYED,
938 /** The usual 32-bit hack. */
939 VUSB_DEVICE_STATE_32BIT_HACK = 0x7fffffff
940} VUSBDEVICESTATE;
941
942#ifndef RDESKTOP
943
944/**
945 * USB Device Interface (up).
946 * No interface pair.
947 */
948typedef struct VUSBIDEVICE
949{
950 /**
951 * Resets the device.
952 *
953 * Since a device reset shall take at least 10ms from the guest point of view,
954 * it must be performed asynchronously. We create a thread which performs this
955 * operation and ensures it will take at least 10ms.
956 *
957 * At times - like init - a synchronous reset is required, this can be done
958 * by passing NULL for pfnDone.
959 *
960 * -- internal stuff, move it --
961 * While the device is being reset it is in the VUSB_DEVICE_STATE_RESET state.
962 * On completion it will be in the VUSB_DEVICE_STATE_DEFAULT state if successful,
963 * or in the VUSB_DEVICE_STATE_DETACHED state if the rest failed.
964 * -- internal stuff, move it --
965 *
966 * @returns VBox status code.
967 * @param pInterface Pointer to this structure.
968 * @param fResetOnLinux Set if we can permit a real reset and a potential logical
969 * device reconnect on linux hosts.
970 * @param pfnDone Pointer to the completion routine. If NULL a synchronous
971 * reset is preformed not respecting the 10ms.
972 * @param pvUser User argument to the completion routine.
973 * @param pVM The cross context VM structure. Required if pfnDone
974 * is not NULL.
975 */
976 DECLR3CALLBACKMEMBER(int, pfnReset,(PVUSBIDEVICE pInterface, bool fResetOnLinux,
977 PFNVUSBRESETDONE pfnDone, void *pvUser, PVM pVM));
978
979 /**
980 * Powers on the device.
981 *
982 * @returns VBox status code.
983 * @param pInterface Pointer to the device interface structure.
984 */
985 DECLR3CALLBACKMEMBER(int, pfnPowerOn,(PVUSBIDEVICE pInterface));
986
987 /**
988 * Powers off the device.
989 *
990 * @returns VBox status code.
991 * @param pInterface Pointer to the device interface structure.
992 */
993 DECLR3CALLBACKMEMBER(int, pfnPowerOff,(PVUSBIDEVICE pInterface));
994
995 /**
996 * Get the state of the device.
997 *
998 * @returns Device state.
999 * @param pInterface Pointer to the device interface structure.
1000 */
1001 DECLR3CALLBACKMEMBER(VUSBDEVICESTATE, pfnGetState,(PVUSBIDEVICE pInterface));
1002
1003 /**
1004 * Returns whether the device implements the saved state handlers
1005 * and doesn't need to get detached.
1006 *
1007 * @returns true if the device supports saving the state, false otherwise.
1008 * @param pInterface Pointer to the device interface structure.
1009 */
1010 DECLR3CALLBACKMEMBER(bool, pfnIsSavedStateSupported,(PVUSBIDEVICE pInterface));
1011
1012 /**
1013 * Get the speed the device is operating at.
1014 *
1015 * @returns Device state.
1016 * @param pInterface Pointer to the device interface structure.
1017 */
1018 DECLR3CALLBACKMEMBER(VUSBSPEED, pfnGetSpeed,(PVUSBIDEVICE pInterface));
1019
1020} VUSBIDEVICE;
1021/** VUSBIDEVICE interface ID. */
1022#define VUSBIDEVICE_IID "af576b38-e8ca-4db7-810a-2596d8d57ca0"
1023
1024
1025#ifdef IN_RING3
1026/**
1027 * Resets the device.
1028 *
1029 * Since a device reset shall take at least 10ms from the guest point of view,
1030 * it must be performed asynchronously. We create a thread which performs this
1031 * operation and ensures it will take at least 10ms.
1032 *
1033 * At times - like init - a synchronous reset is required, this can be done
1034 * by passing NULL for pfnDone.
1035 *
1036 * -- internal stuff, move it --
1037 * While the device is being reset it is in the VUSB_DEVICE_STATE_RESET state.
1038 * On completion it will be in the VUSB_DEVICE_STATE_DEFAULT state if successful,
1039 * or in the VUSB_DEVICE_STATE_DETACHED state if the rest failed.
1040 * -- internal stuff, move it --
1041 *
1042 * @returns VBox status code.
1043 * @param pInterface Pointer to the device interface structure.
1044 * @param fResetOnLinux Set if we can permit a real reset and a potential logical
1045 * device reconnect on linux hosts.
1046 * @param pfnDone Pointer to the completion routine. If NULL a
1047 * synchronous reset is preformed not respecting the
1048 * 10ms.
1049 * @param pvUser User argument to the completion routine.
1050 * @param pVM The cross context VM structure. Required if pfnDone
1051 * is not NULL.
1052 *
1053 * NULL is acceptable Required if callback in EMT is desired, NULL is otherwise
1054 * acceptable.
1055 */
1056DECLINLINE(int) VUSBIDevReset(PVUSBIDEVICE pInterface, bool fResetOnLinux, PFNVUSBRESETDONE pfnDone, void *pvUser, PVM pVM)
1057{
1058 return pInterface->pfnReset(pInterface, fResetOnLinux, pfnDone, pvUser, pVM);
1059}
1060
1061/**
1062 * Powers on the device.
1063 *
1064 * @returns VBox status code.
1065 * @param pInterface Pointer to the device interface structure.
1066 */
1067DECLINLINE(int) VUSBIDevPowerOn(PVUSBIDEVICE pInterface)
1068{
1069 return pInterface->pfnPowerOn(pInterface);
1070}
1071
1072/**
1073 * Powers off the device.
1074 *
1075 * @returns VBox status code.
1076 * @param pInterface Pointer to the device interface structure.
1077 */
1078DECLINLINE(int) VUSBIDevPowerOff(PVUSBIDEVICE pInterface)
1079{
1080 return pInterface->pfnPowerOff(pInterface);
1081}
1082
1083/**
1084 * Get the state of the device.
1085 *
1086 * @returns Device state.
1087 * @param pInterface Pointer to the device interface structure.
1088 */
1089DECLINLINE(VUSBDEVICESTATE) VUSBIDevGetState(PVUSBIDEVICE pInterface)
1090{
1091 return pInterface->pfnGetState(pInterface);
1092}
1093
1094/**
1095 * @copydoc VUSBIDEVICE::pfnIsSavedStateSupported
1096 */
1097DECLINLINE(bool) VUSBIDevIsSavedStateSupported(PVUSBIDEVICE pInterface)
1098{
1099 return pInterface->pfnIsSavedStateSupported(pInterface);
1100}
1101#endif /* IN_RING3 */
1102
1103#endif /* ! RDESKTOP */
1104
1105/** @name URB
1106 * @{ */
1107
1108/**
1109 * VUSB Transfer status codes.
1110 */
1111typedef enum VUSBSTATUS
1112{
1113 /** Transer was ok. */
1114 VUSBSTATUS_OK = 0,
1115 /** Transfer stalled, endpoint halted. */
1116 VUSBSTATUS_STALL,
1117 /** Device not responding. */
1118 VUSBSTATUS_DNR,
1119 /** CRC error. */
1120 VUSBSTATUS_CRC,
1121 /** Data overrun error. */
1122 VUSBSTATUS_DATA_UNDERRUN,
1123 /** Data overrun error. */
1124 VUSBSTATUS_DATA_OVERRUN,
1125 /** The isochronous buffer hasn't been touched. */
1126 VUSBSTATUS_NOT_ACCESSED,
1127 /** Canceled/undone URB (VUSB internal). */
1128 VUSBSTATUS_UNDO,
1129 /** Canceled URB. */
1130 VUSBSTATUS_CANCELED,
1131 /** Invalid status. */
1132 VUSBSTATUS_INVALID = 0x7f
1133} VUSBSTATUS;
1134
1135
1136/**
1137 * The URB states
1138 */
1139typedef enum VUSBURBSTATE
1140{
1141 /** The usual invalid state. */
1142 VUSBURBSTATE_INVALID = 0,
1143 /** The URB is free, i.e. not in use.
1144 * Next state: ALLOCATED */
1145 VUSBURBSTATE_FREE,
1146 /** The URB is allocated, i.e. being prepared for submission.
1147 * Next state: FREE, IN_FLIGHT */
1148 VUSBURBSTATE_ALLOCATED,
1149 /** The URB is in flight.
1150 * Next state: REAPED, CANCELLED */
1151 VUSBURBSTATE_IN_FLIGHT,
1152 /** The URB has been reaped and is being completed.
1153 * Next state: FREE */
1154 VUSBURBSTATE_REAPED,
1155 /** The URB has been cancelled and is awaiting reaping and immediate freeing.
1156 * Next state: FREE */
1157 VUSBURBSTATE_CANCELLED,
1158 /** The end of the valid states (exclusive). */
1159 VUSBURBSTATE_END,
1160 /** The usual 32-bit blow up. */
1161 VUSBURBSTATE_32BIT_HACK = 0x7fffffff
1162} VUSBURBSTATE;
1163
1164
1165/**
1166 * Information about a isochronous packet.
1167 */
1168typedef struct VUSBURBISOCPKT
1169{
1170 /** The size of the packet.
1171 * IN: The packet size. I.e. the number of bytes to the next packet or end of buffer.
1172 * OUT: The actual size transferred. */
1173 uint16_t cb;
1174 /** The offset of the packet. (Relative to VUSBURB::abData[0].)
1175 * OUT: This can be changed by the USB device if it does some kind of buffer squeezing. */
1176 uint16_t off;
1177 /** The status of the transfer.
1178 * IN: VUSBSTATUS_INVALID
1179 * OUT: VUSBSTATUS_INVALID if nothing was done, otherwise the correct status. */
1180 VUSBSTATUS enmStatus;
1181} VUSBURBISOCPKT;
1182/** Pointer to a isochronous packet. */
1183typedef VUSBURBISOCPKT *PVUSBURBISOCPTK;
1184/** Pointer to a const isochronous packet. */
1185typedef const VUSBURBISOCPKT *PCVUSBURBISOCPKT;
1186
1187/** Private controller emulation specific data for the associated USB request descriptor. */
1188typedef struct VUSBURBHCIINT *PVUSBURBHCI;
1189/** Private controller emulation specific TD data. */
1190typedef struct VUSBURBHCITDINT *PVUSBURBHCITD;
1191/** Private VUSB/roothub related state for the associated URB. */
1192typedef struct VUSBURBVUSBINT *PVUSBURBVUSB;
1193
1194/**
1195 * Asynchronous USB request descriptor
1196 */
1197typedef struct VUSBURB
1198{
1199 /** URB magic value. */
1200 uint32_t u32Magic;
1201 /** The USR state. */
1202 VUSBURBSTATE enmState;
1203 /** Flag whether the URB is about to be completed,
1204 * either by the I/O thread or the cancellation worker.
1205 */
1206 volatile bool fCompleting;
1207 /** URB description, can be null. intended for logging. */
1208 char *pszDesc;
1209
1210#ifdef RDESKTOP
1211 /** The next URB in rdesktop-vrdp's linked list */
1212 PVUSBURB pNext;
1213 /** The previous URB in rdesktop-vrdp's linked list */
1214 PVUSBURB pPrev;
1215 /** The vrdp handle for the URB */
1216 uint32_t handle;
1217 /** Pointer used to find the usb proxy device */
1218 struct VUSBDEV *pDev;
1219#endif
1220
1221 /** The VUSB stack private data. */
1222 PVUSBURBVUSB pVUsb;
1223 /** Private host controller data associated with this URB. */
1224 PVUSBURBHCI pHci;
1225 /** Pointer to the host controller transfer descriptor array. */
1226 PVUSBURBHCITD paTds;
1227
1228 /** The device data. */
1229 struct VUSBURBDEV
1230 {
1231 /** Pointer to private device specific data. */
1232 void *pvPrivate;
1233 /** Used by the device when linking the URB in some list of its own. */
1234 PVUSBURB pNext;
1235 } Dev;
1236
1237 /** The device address.
1238 * This is set at allocation time. */
1239 uint8_t DstAddress;
1240
1241 /** The endpoint.
1242 * IN: Must be set before submitting the URB.
1243 * @remark This does not have the high bit (direction) set! */
1244 uint8_t EndPt;
1245 /** The transfer type.
1246 * IN: Set at allocation time. */
1247 VUSBXFERTYPE enmType;
1248 /** The transfer direction.
1249 * IN: Set at allocation time. */
1250 VUSBDIRECTION enmDir;
1251 /** Indicates whether it is OK to receive/send less data than requested.
1252 * IN: Must be initialized before submitting the URB. */
1253 bool fShortNotOk;
1254 /** The transfer status.
1255 * OUT: This is set when reaping the URB. */
1256 VUSBSTATUS enmStatus;
1257
1258 /** The number of isochronous packets describe in aIsocPkts.
1259 * This is ignored when enmType isn't VUSBXFERTYPE_ISOC. */
1260 uint32_t cIsocPkts;
1261 /** The iso packets within abData.
1262 * This is ignored when enmType isn't VUSBXFERTYPE_ISOC. */
1263 VUSBURBISOCPKT aIsocPkts[8];
1264
1265 /** The message length.
1266 * IN: The amount of data to send / receive - set at allocation time.
1267 * OUT: The amount of data sent / received. */
1268 uint32_t cbData;
1269 /** The message data.
1270 * IN: On host to device transfers, the data to send.
1271 * OUT: On device to host transfers, the data to received.
1272 * This array has actually a size of VUsb.cbDataAllocated, not 8KB! */
1273 uint8_t abData[8*_1K];
1274} VUSBURB;
1275
1276/** The magic value of a valid VUSBURB. (Murakami Haruki) */
1277#define VUSBURB_MAGIC UINT32_C(0x19490112)
1278
1279/** @} */
1280
1281
1282/** @} */
1283
1284RT_C_DECLS_END
1285
1286#endif
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette