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
;
107 PDRIVER_OBJECT DriverObject
;
108 PDEVICE_OBJECT DeviceObject
;
109 PDEVICE_OBJECT LowerDevice
;
113 PVOID RootHubDeviceHandle
;
114 PDMA_ADAPTER pDmaAdapter
;
120 KINTERRUPT_MODE Mode
;
122 PKINTERRUPT EhciInterrupt
;
136 BUS_INTERFACE_STANDARD BusInterface
;
141 ULONG ResourceMemory
;
144 EHCI_HOST_CONTROLLER hcd
;
145 PERIODICFRAMELIST PeriodicFrameList
;
147 FAST_MUTEX FrameListMutex
;
149 BOOLEAN AsyncComplete
;
151 //PULONG ResourceBase;
153 } FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
155 typedef struct _PDO_DEVICE_EXTENSION
157 COMMON_DEVICE_EXTENSION Common
;
158 PDEVICE_OBJECT DeviceObject
;
159 PDEVICE_OBJECT ControllerFdo
;
160 PUSB_DEVICE UsbDevices
[127];
162 KSPIN_LOCK IrpQueueLock
;
165 ULONG ChildDeviceCount
;
167 PVOID CallbackContext
;
168 RH_INIT_CALLBACK
*CallbackRoutine
;
169 USB_IDLE_CALLBACK IdleCallback
;
174 KEVENT QueueDrainedEvent
;
176 } PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
178 typedef struct _WORKITEMDATA
180 WORK_QUEUE_ITEM WorkItem
;
182 } WORKITEMDATA
, *PWORKITEMDATA
;
185 UrbWorkerThread(PVOID Context
);
188 GetBusInterface(PDEVICE_OBJECT pcifido
, PBUS_INTERFACE_STANDARD busInterface
);
191 ForwardAndWaitCompletionRoutine(PDEVICE_OBJECT DeviceObject
, PIRP Irp
, PKEVENT Event
);
194 ForwardAndWait(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
197 ForwardIrpAndForget(PDEVICE_OBJECT DeviceObject
,PIRP Irp
);
200 FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
);
203 PdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
);
206 AddDevice(PDRIVER_OBJECT DriverObject
, PDEVICE_OBJECT Pdo
);
209 DuplicateUnicodeString(ULONG Flags
, PCUNICODE_STRING SourceString
, PUNICODE_STRING DestinationString
);
212 GetSymbolicName(PDEVICE_OBJECT DeviceObject
);
215 GetPhysicalDeviceObjectName(PDEVICE_OBJECT DeviceObject
);
218 PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
221 FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
224 ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension
, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
, UCHAR Address
, ULONG Port
, PVOID Buffer
, ULONG BufferLength
);
227 RequestURBCancel (PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
230 RemoveUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PIRP Irp
);
233 QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
236 CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
);
239 HandleUrbRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
);
242 DeviceHandleToUsbDevice(PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PUSB_DEVICE_HANDLE DeviceHandle
);
245 DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
248 DumpFullConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
);
252 DumpTransferDescriptor(PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor
);
255 DumpQueueHead(PQUEUE_HEAD QueueHead
);