13 #define USB_POOL_TAG (ULONG)'ebsu'
15 #define DEVICEINTIALIZED 0x01
16 #define DEVICESTARTED 0x02
17 #define DEVICEBUSY 0x04
18 #define DEVICESTOPPED 0x08
19 #define DEVICESTALLED 0x10
20 #define DEVICEREMOVED 0x20
23 #define MAX_USB_DEVICES 127
24 #define EHCI_MAX_SIZE_TRANSFER 0x100000
26 #define C_HUB_LOCAL_POWER 0
27 #define C_HUB_OVER_CURRENT 1
28 #define PORT_CONNECTION 0
30 #define PORT_SUSPEND 2
31 #define PORT_OVER_CURRENT 3
34 #define PORT_LOW_SPEED 9
35 #define PORT_HIGH_SPEED 9
36 #define C_PORT_CONNECTION 16
37 #define C_PORT_ENABLE 17
38 #define C_PORT_SUSPEND 18
39 #define C_PORT_OVER_CURRENT 19
40 #define C_PORT_RESET 20
42 #define PORT_INDICATOR 22
43 #define USB_PORT_STATUS_CHANGE 0x4000
45 typedef struct _USB_ENDPOINT
49 struct _USB_INTERFACE
*Interface
;
50 USB_ENDPOINT_DESCRIPTOR EndPointDescriptor
;
51 } USB_ENDPOINT
, *PUSB_ENDPOINT
;
53 typedef struct _USB_INTERFACE
55 struct _USB_CONFIGURATION
*Config
;
56 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
57 USB_ENDPOINT
*EndPoints
[];
58 } USB_INTERFACE
, *PUSB_INTERFACE
;
60 typedef struct _USB_CONFIGURATION
62 struct _USB_DEVICE
*Device
;
63 USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
;
64 USB_INTERFACE
*Interfaces
[];
65 } USB_CONFIGURATION
, *PUSB_CONFIGURATION
;
67 typedef struct _USB_DEVICE
73 USB_DEVICE_SPEED DeviceSpeed
;
74 USB_DEVICE_TYPE DeviceType
;
76 PDEVICE_OBJECT UsbDevicePdo
;
77 USB_DEVICE_DESCRIPTOR DeviceDescriptor
;
78 UNICODE_STRING LanguageIDs
;
79 UNICODE_STRING iManufacturer
;
80 UNICODE_STRING iProduct
;
81 UNICODE_STRING iSerialNumber
;
82 USB_CONFIGURATION
*ActiveConfig
;
83 USB_INTERFACE
*ActiveInterface
;
84 USB_CONFIGURATION
**Configs
;
85 } USB_DEVICE
, *PUSB_DEVICE
;
89 typedef struct _COMMON_DEVICE_EXTENSION
92 PDRIVER_OBJECT DriverObject
;
93 PDEVICE_OBJECT DeviceObject
;
94 } COMMON_DEVICE_EXTENSION
, *PCOMMON_DEVICE_EXTENSION
;
96 typedef struct _EHCIPORTS
102 } EHCIPORTS
, *PEHCIPORTS
;
104 typedef struct _FDO_DEVICE_EXTENSION
106 COMMON_DEVICE_EXTENSION Common
;
108 PDEVICE_OBJECT LowerDevice
;
112 PVOID RootHubDeviceHandle
;
113 PDMA_ADAPTER pDmaAdapter
;
119 KINTERRUPT_MODE Mode
;
121 PKINTERRUPT EhciInterrupt
;
135 BUS_INTERFACE_STANDARD BusInterface
;
140 ULONG ResourceMemory
;
143 EHCI_HOST_CONTROLLER hcd
;
144 PERIODICFRAMELIST PeriodicFrameList
;
146 FAST_MUTEX FrameListMutex
;
148 BOOLEAN AsyncComplete
;
150 //PULONG ResourceBase;
152 } FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
154 typedef struct _PDO_DEVICE_EXTENSION
156 COMMON_DEVICE_EXTENSION Common
;
157 PDEVICE_OBJECT DeviceObject
;
158 PDEVICE_OBJECT ControllerFdo
;
159 PUSB_DEVICE UsbDevices
[127];
161 KSPIN_LOCK IrpQueueLock
;
164 ULONG ChildDeviceCount
;
166 PVOID CallbackContext
;
167 RH_INIT_CALLBACK
*CallbackRoutine
;
168 USB_IDLE_CALLBACK IdleCallback
;
173 KEVENT QueueDrainedEvent
;
175 } PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
177 typedef struct _WORKITEMDATA
179 WORK_QUEUE_ITEM WorkItem
;
181 } WORKITEMDATA
, *PWORKITEMDATA
;
184 UrbWorkerThread(PVOID Context
);
187 GetBusInterface(PDEVICE_OBJECT pcifido
, PBUS_INTERFACE_STANDARD busInterface
);
190 ForwardAndWaitCompletionRoutine(PDEVICE_OBJECT DeviceObject
, PIRP Irp
, PKEVENT Event
);
193 ForwardAndWait(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
196 ForwardIrpAndForget(PDEVICE_OBJECT DeviceObject
,PIRP Irp
);
199 FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
);
202 PdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
);
205 AddDevice(PDRIVER_OBJECT DriverObject
, PDEVICE_OBJECT Pdo
);
208 DuplicateUnicodeString(ULONG Flags
, PCUNICODE_STRING SourceString
, PUNICODE_STRING DestinationString
);
211 GetSymbolicName(PDEVICE_OBJECT DeviceObject
);
214 GetPhysicalDeviceObjectName(PDEVICE_OBJECT DeviceObject
);
217 PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
220 FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
223 ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension
, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
, UCHAR Address
, ULONG Port
, PVOID Buffer
, ULONG BufferLength
);
226 RequestURBCancel (PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
229 RemoveUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PIRP Irp
);
232 QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
235 CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
);
238 HandleUrbRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
241 DeviceHandleToUsbDevice(PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PUSB_DEVICE_HANDLE DeviceHandle
);
244 DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
247 DumpFullConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
);
251 DumpTransferDescriptor(PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor
);
254 DumpQueueHead(PQUEUE_HEAD QueueHead
);