6 // EHCI Operational Registers
8 #define EHCI_USBCMD 0x00
9 #define EHCI_USBSTS 0x04
10 #define EHCI_USBINTR 0x08
11 #define EHCI_FRINDEX 0x0C
12 #define EHCI_CTRLDSSEGMENT 0x10
13 #define EHCI_PERIODICLISTBASE 0x14
14 #define EHCI_ASYNCLISTBASE 0x18
15 #define EHCI_CONFIGFLAG 0x40
16 #define EHCI_PORTSC 0x44
19 // Interrupt Register Flags
21 #define EHCI_USBINTR_INTE 0x01
22 #define EHCI_USBINTR_ERR 0x02
23 #define EHCI_USBINTR_PC 0x04
24 #define EHCI_USBINTR_FLROVR 0x08
25 #define EHCI_USBINTR_HSERR 0x10
26 #define EHCI_USBINTR_ASYNC 0x20
30 // Status Register Flags
32 #define EHCI_STS_INT 0x01
33 #define EHCI_STS_ERR 0x02
34 #define EHCI_STS_PCD 0x04
35 #define EHCI_STS_FLR 0x08
36 #define EHCI_STS_FATAL 0x10
37 #define EHCI_STS_IAA 0x20
39 #define EHCI_STS_HALT 0x1000
40 #define EHCI_STS_RECL 0x2000
41 #define EHCI_STS_PSS 0x4000
42 #define EHCI_STS_ASS 0x8000
43 #define EHCI_ERROR_INT (EHCI_STS_FATAL | EHCI_STS_ERR)
46 // Port Register Flags
48 #define EHCI_PRT_CONNECTED 0x01
49 #define EHCI_PRT_CONNECTSTATUSCHANGE 0x02
50 #define EHCI_PRT_ENABLED 0x04
51 #define EHCI_PRT_ENABLEDSTATUSCHANGE 0x08
52 #define EHCI_PRT_OVERCURRENTACTIVE 0x10
53 #define EHCI_PRT_OVERCURRENTCHANGE 0x20
54 #define EHCI_PRT_FORCERESUME 0x40
55 #define EHCI_PRT_SUSPEND 0x80
56 #define EHCI_PRT_RESET 0x100
57 #define EHCI_PRT_SLOWSPEEDLINE 0x400
58 #define EHCI_PRT_POWER 0x1000
59 #define EHCI_PRT_RELEASEOWNERSHIP 0x2000
61 #define EHCI_PORTSC_DATAMASK 0xffffffd1
63 // Terminate Pointer used for QueueHeads and Element Transfer Descriptors to mark Pointers as the end
65 #define TERMINATE_POINTER 0x01
68 // QUEUE ELEMENT TRANSFER DESCRIPTOR, defines and structs
74 #define PID_CODE_OUT_TOKEN 0x00
75 #define PID_CODE_IN_TOKEN 0x01
76 #define PID_CODE_SETUP_TOKEN 0x02
78 #define DO_START_SPLIT 0x00
79 #define DO_COMPLETE_SPLIT 0x01
81 #define PING_STATE_DO_OUT 0x00
82 #define PING_STATE_DO_PING 0x01
84 typedef struct _PERIODICFRAMELIST
87 PHYSICAL_ADDRESS PhysicalAddr
;
89 } PERIODICFRAMELIST
, *PPERIODICFRAMELIST
;
92 // QUEUE ELEMENT TRANSFER DESCRIPTOR TOKEN
94 typedef struct _QETD_TOKEN_BITS
97 ULONG SplitTransactionState
:1;
98 ULONG MissedMicroFrame
:1;
99 ULONG TransactionError
:1;
100 ULONG BabbleDetected
:1;
101 ULONG DataBufferError
:1;
105 ULONG ErrorCounter
:2;
107 ULONG InterruptOnComplete
:1;
108 ULONG TotalBytesToTransfer
:15;
110 } QETD_TOKEN_BITS
, *PQETD_TOKEN_BITS
;
113 // QUEUE ELEMENT TRANSFER DESCRIPTOR
115 typedef struct _QUEUE_TRANSFER_DESCRIPTOR
119 ULONG AlternateNextPointer
;
122 QETD_TOKEN_BITS Bits
;
125 ULONG BufferPointer
[5];
129 LIST_ENTRY LinkedDescriptors
;
130 ULONG TotalBytesToTransfer
;
131 } QUEUE_TRANSFER_DESCRIPTOR
, *PQUEUE_TRANSFER_DESCRIPTOR
;
134 // EndPointSpeeds Flags and END_POINT_CHARACTERISTICS
136 #define QH_ENDPOINT_FULLSPEED 0x00
137 #define QH_ENDPOINT_LOWSPEED 0x01
138 #define QH_ENDPOINT_HIGHSPEED 0x02
139 typedef struct _END_POINT_CHARACTERISTICS
141 ULONG DeviceAddress
:7;
142 ULONG InactiveOnNextTransaction
:1;
143 ULONG EndPointNumber
:4;
144 ULONG EndPointSpeed
:2;
145 ULONG QEDTDataToggleControl
:1;
146 ULONG HeadOfReclamation
:1;
147 ULONG MaximumPacketLength
:11;
148 ULONG ControlEndPointFlag
:1;
149 ULONG NakCountReload
:4;
150 } END_POINT_CHARACTERISTICS
, *PEND_POINT_CHARACTERISTICS
;
155 typedef struct _END_POINT_CAPABILITIES
157 ULONG InterruptScheduleMask
:8;
158 ULONG SplitCompletionMask
:8;
161 ULONG NumberOfTransactionPerFrame
:2;
162 } END_POINT_CAPABILITIES
, *PEND_POINT_CAPABILITIES
;
165 // QUEUE HEAD Flags and Struct
167 #define QH_TYPE_IDT 0x00
168 #define QH_TYPE_QH 0x02
169 #define QH_TYPE_SITD 0x04
170 #define QH_TYPE_FSTN 0x06
172 typedef struct _QUEUE_HEAD
175 ULONG HorizontalLinkPointer
;
176 END_POINT_CHARACTERISTICS EndPointCharacteristics
;
177 END_POINT_CAPABILITIES EndPointCapabilities
;
178 // TERMINATE_POINTER not valid for this member
179 ULONG CurrentLinkPointer
;
180 // TERMINATE_POINTER valid
182 // TERMINATE_POINTER valid, bits 1:4 is NAK_COUNTERd
183 ULONG AlternateNextPointer
;
184 // Only DataToggle, InterruptOnComplete, ErrorCounter, PingState valid
187 QETD_TOKEN_BITS Bits
;
190 ULONG BufferPointer
[5];
194 LIST_ENTRY LinkedQueueHeads
;
196 } QUEUE_HEAD
, *PQUEUE_HEAD
;
199 // Command register content
201 typedef struct _EHCI_USBCMD_CONTENT
205 ULONG FrameListSize
: 2;
206 ULONG PeriodicEnable
: 1;
207 ULONG AsyncEnable
: 1;
209 ULONG LightReset
: 1;
210 ULONG AsyncParkCount
: 2;
212 ULONG AsyncParkEnable
: 1;
214 ULONG IntThreshold
: 8;
216 } EHCI_USBCMD_CONTENT
, *PEHCI_USBCMD_CONTENT
;
218 typedef struct _EHCI_HCS_CONTENT
221 ULONG PortPowerControl
: 1;
223 ULONG PortRouteRules
: 1;
224 ULONG PortPerCHC
: 4;
226 ULONG PortIndicator
: 1;
228 ULONG DbgPortNum
: 4;
231 } EHCI_HCS_CONTENT
, *PEHCI_HCS_CONTENT
;
233 typedef struct _EHCI_HCC_CONTENT
235 ULONG CurAddrBits
: 1;
236 ULONG VarFrameList
: 1;
239 ULONG IsoSchedThreshold
: 4;
240 ULONG EECPCapable
: 8;
241 ULONG Reserved2
: 16;
243 } EHCI_HCC_CONTENT
, *PEHCI_HCC_CONTENT
;
245 typedef struct _EHCI_CAPS
{
251 EHCI_HCS_CONTENT HCSParams
;
256 EHCI_HCC_CONTENT HCCParams
;
259 UCHAR PortRoute
[15];
260 } EHCI_CAPS
, *PEHCI_CAPS
;
270 PHYSICAL_ADDRESS PhysicalBase
;
272 }DMA_MEMORY_ALLOCATOR
, *LPDMA_MEMORY_ALLOCATOR
;
274 typedef struct _EHCI_HOST_CONTROLLER
278 PVOID CommonBufferVA
;
279 PHYSICAL_ADDRESS CommonBufferPA
;
280 ULONG CommonBufferSize
;
281 PQUEUE_HEAD AsyncListQueue
;
283 LPDMA_MEMORY_ALLOCATOR DmaMemAllocator
;
284 } EHCI_HOST_CONTROLLER
, *PEHCI_HOST_CONTROLLER
;