5 /* USB Command Register */
6 #define EHCI_USBCMD 0x00
7 #define EHCI_USBSTS 0x04
8 #define EHCI_USBINTR 0x08
9 #define EHCI_FRINDEX 0x0C
10 #define EHCI_CTRLDSSEGMENT 0x10
11 #define EHCI_PERIODICLISTBASE 0x14
12 #define EHCI_ASYNCLISTBASE 0x18
13 #define EHCI_CONFIGFLAG 0x40
14 #define EHCI_PORTSC 0x44
16 /* USB Interrupt Register Flags 32 Bits */
17 #define EHCI_USBINTR_INTE 0x01
18 #define EHCI_USBINTR_ERR 0x02
19 #define EHCI_USBINTR_PC 0x04
20 #define EHCI_USBINTR_FLROVR 0x08
21 #define EHCI_USBINTR_HSERR 0x10
22 #define EHCI_USBINTR_ASYNC 0x20
23 /* Bits 6:31 Reserved */
25 /* Status Register Flags 32 Bits */
26 #define EHCI_STS_INT 0x01
27 #define EHCI_STS_ERR 0x02
28 #define EHCI_STS_PCD 0x04
29 #define EHCI_STS_FLR 0x08
30 #define EHCI_STS_FATAL 0x10
31 #define EHCI_STS_IAA 0x20
32 /* Bits 11:6 Reserved */
33 #define EHCI_STS_HALT 0x1000
34 #define EHCI_STS_RECL 0x2000
35 #define EHCI_STS_PSS 0x4000
36 #define EHCI_STS_ASS 0x8000
37 #define EHCI_ERROR_INT ( EHCI_STS_FATAL | EHCI_STS_ERR )
40 /* Last bit in QUEUE ELEMENT TRANSFER DESCRIPTOR Next Pointer */
41 /* Used for Queue Element Transfer Descriptor Pointers
42 and Queue Head Horizontal Link Pointers */
43 #define TERMINATE_POINTER 0x01
45 /* QUEUE ELEMENT TRANSFER DESCRIPTOR, Token defines and structs */
47 /* PIDCodes for QETD_TOKEN
48 OR with QUEUE_TRANSFER_DESCRIPTOR Token.PIDCode*/
49 #define PID_CODE_OUT_TOKEN 0x00
50 #define PID_CODE_IN_TOKEN 0x01
51 #define PID_CODE_SETUP_TOKEN 0x02
53 /* Split Transaction States
54 OR with QUEUE_TRANSFER_DESCRIPTOR Token.SplitTransactionState */
55 #define DO_START_SPLIT 0x00
56 #define DO_COMPLETE_SPLIT 0x01
58 /* Ping States, OR with QUEUE_TRANSFER_DESCRIPTOR Token. */
59 #define PING_STATE_DO_OUT 0x00
60 #define PING_STATE_DO_PING 0x01
62 typedef struct _PERIODICFRAMELIST
65 PHYSICAL_ADDRESS PhysicalAddr
;
67 } PERIODICFRAMELIST
, *PPERIODICFRAMELIST
;
70 /* QUEUE ELEMENT TRANSFER DESCRIPTOR TOKEN */
71 typedef struct _QETD_TOKEN_BITS
74 ULONG SplitTransactionState
:1;
75 ULONG MissedMicroFrame
:1;
76 ULONG TransactionError
:1;
77 ULONG BabbleDetected
:1;
78 ULONG DataBufferError
:1;
84 ULONG InterruptOnComplete
:1;
85 ULONG TotalBytesToTransfer
:15;
87 } QETD_TOKEN_BITS
, *PQETD_TOKEN_BITS
;
89 /* QUEUE ELEMENT TRANSFER DESCRIPTOR */
90 typedef struct _QUEUE_TRANSFER_DESCRIPTOR
94 ULONG AlternateNextPointer
;
100 ULONG BufferPointer
[5];
104 struct _QUEUE_TRANSFER_DESCRIPTOR
*PreviousDescriptor
;
105 struct _QUEUE_TRANSFER_DESCRIPTOR
*NextDescriptor
;
106 } QUEUE_TRANSFER_DESCRIPTOR
, *PQUEUE_TRANSFER_DESCRIPTOR
;
108 /* EndPointSpeeds of END_POINT_CHARACTERISTICS */
109 #define QH_ENDPOINT_FULLSPEED 0x00
110 #define QH_ENDPOINT_LOWSPEED 0x01
111 #define QH_ENDPOINT_HIGHSPEED 0x02
113 typedef struct _END_POINT_CHARACTERISTICS
115 ULONG DeviceAddress
:7;
116 ULONG InactiveOnNextTransaction
:1;
117 ULONG EndPointNumber
:4;
118 ULONG EndPointSpeed
:2;
119 ULONG QEDTDataToggleControl
:1;
120 ULONG HeadOfReclamation
:1;
121 ULONG MaximumPacketLength
:11;
122 ULONG ControlEndPointFlag
:1;
123 ULONG NakCountReload
:4;
124 } END_POINT_CHARACTERISTICS
, *PEND_POINT_CHARACTERISTICS
;
126 typedef struct _END_POINT_CAPABILITIES
128 ULONG InterruptScheduleMask
:8;
129 ULONG SplitCompletionMask
:8;
133 ULONG NumberOfTransactionPerFrame
:2;
134 } END_POINT_CAPABILITIES
, *PEND_POINT_CAPABILITIES
;
137 /* QUEUE HEAD defines and structs */
139 /* QUEUE HEAD Select Types, OR with QUEUE_HEAD HorizontalLinkPointer */
140 #define QH_TYPE_IDT 0x00
141 #define QH_TYPE_QH 0x02
142 #define QH_TYPE_SITD 0x04
143 #define QH_TYPE_FSTN 0x06
146 typedef struct _QUEUE_HEAD
149 ULONG HorizontalLinkPointer
;
150 END_POINT_CHARACTERISTICS EndPointCharacteristics
;
151 END_POINT_CAPABILITIES EndPointCapabilities
;
152 /* TERMINATE_POINTER not valid for this member */
153 ULONG CurrentLinkPointer
;
154 /* TERMINATE_POINTER valid */
156 /* TERMINATE_POINTER valid, bits 1:4 is NAK_COUNTER */
157 ULONG AlternateNextPointer
;
158 /* Only DataToggle, InterruptOnComplete, ErrorCounter, PingState valid */
161 QETD_TOKEN_BITS Bits
;
164 ULONG BufferPointer
[5];
168 struct _QUEUE_HEAD
*PreviousQueueHead
;
169 struct _QUEUE_HEAD
*NextQueueHead
;
170 PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor
;
174 } QUEUE_HEAD
, *PQUEUE_HEAD
;
176 /* USBCMD register 32 bits */
177 typedef struct _EHCI_USBCMD_CONTENT
181 ULONG FrameListSize
: 2;
182 ULONG PeriodicEnable
: 1;
183 ULONG AsyncEnable
: 1;
185 ULONG LightReset
: 1;
186 ULONG AsyncParkCount
: 2;
188 ULONG AsyncParkEnable
: 1;
190 ULONG IntThreshold
: 8;
193 } EHCI_USBCMD_CONTENT
, *PEHCI_USBCMD_CONTENT
;
195 typedef struct _EHCI_USBSTS_CONTENT
197 ULONG USBInterrupt
:1;
198 ULONG ErrorInterrupt
:1;
199 ULONG DetectChangeInterrupt
:1;
200 ULONG FrameListRolloverInterrupt
:1;
201 ULONG HostSystemErrorInterrupt
:1;
202 ULONG AsyncAdvanceInterrupt
:1;
206 ULONG PeriodicScheduleStatus
:1;
207 ULONG AsynchronousScheduleStatus
:1;
208 } EHCI_USBSTS_CONTEXT
, *PEHCI_USBSTS_CONTEXT
;
210 typedef struct _EHCI_USBPORTSC_CONTENT
212 ULONG CurrentConnectStatus
:1;
213 ULONG ConnectStatusChange
:1;
215 ULONG PortEnableChanged
:1;
216 ULONG OverCurrentActive
:1;
217 ULONG OverCurrentChange
:1;
218 ULONG ForcePortResume
:1;
225 } EHCI_USBPORTSC_CONTENT
, *PEHCI_USBPORTSC_CONTENT
;
227 typedef struct _EHCI_HCS_CONTENT
230 ULONG PortPowerControl
: 1;
232 ULONG PortRouteRules
: 1;
233 ULONG PortPerCHC
: 4;
235 ULONG PortIndicator
: 1;
237 ULONG DbgPortNum
: 4;
240 } EHCI_HCS_CONTENT
, *PEHCI_HCS_CONTENT
;
242 typedef struct _EHCI_HCC_CONTENT
244 ULONG CurAddrBits
: 1;
245 ULONG VarFrameList
: 1;
248 ULONG IsoSchedThreshold
: 4;
249 ULONG EECPCapable
: 8;
250 ULONG Reserved2
: 16;
252 } EHCI_HCC_CONTENT
, *PEHCI_HCC_CONTENT
;
254 typedef struct _EHCI_CAPS
{
260 EHCI_HCS_CONTENT HCSParams
;
265 } EHCI_CAPS
, *PEHCI_CAPS
;
267 typedef struct _EHCI_HOST_CONTROLLER
271 PVOID CommonBufferVA
;
272 PHYSICAL_ADDRESS CommonBufferPA
;
273 ULONG CommonBufferSize
;
274 PQUEUE_HEAD AsyncListQueue
;
276 } EHCI_HOST_CONTROLLER
, *PEHCI_HOST_CONTROLLER
;
279 ReadControllerStatus(PEHCI_HOST_CONTROLLER hcd
);
282 ClearControllerStatus(PEHCI_HOST_CONTROLLER hcd
, ULONG Status
);
285 GetCapabilities(PEHCI_CAPS PCap
, ULONG CapRegister
);
288 ResetPort(PEHCI_HOST_CONTROLLER hcd
, UCHAR Port
);
291 StartEhci(PEHCI_HOST_CONTROLLER hcd
);
294 StopEhci(PEHCI_HOST_CONTROLLER hcd
);
297 SetAsyncListQueueRegister(PEHCI_HOST_CONTROLLER hcd
, ULONG PhysicalAddr
);
300 GetAsyncListQueueRegister(PEHCI_HOST_CONTROLLER hcd
);
303 SetPeriodicFrameListRegister(PEHCI_HOST_CONTROLLER hcd
, ULONG PhysicalAddr
);
306 GetPeriodicFrameListRegister(PEHCI_HOST_CONTROLLER hcd
);