7 // Host Controller Capability Registers
9 #define EHCI_CAPLENGTH 0x00
10 #define EHCI_HCIVERSION 0x02
11 #define EHCI_HCSPARAMS 0x04
12 #define EHCI_HCCPARAMS 0x08
13 #define EHCI_HCSP_PORTROUTE 0x0c
17 // Extended Capabilities
19 #define EHCI_ECP_SHIFT 8
20 #define EHCI_ECP_MASK 0xff
21 #define EHCI_LEGSUP_CAPID_MASK 0xff
22 #define EHCI_LEGSUP_CAPID 0x01
23 #define EHCI_LEGSUP_OSOWNED (1 << 24)
24 #define EHCI_LEGSUP_BIOSOWNED (1 << 16)
28 // EHCI Operational Registers
30 #define EHCI_USBCMD 0x00
31 #define EHCI_USBSTS 0x04
32 #define EHCI_USBINTR 0x08
33 #define EHCI_FRINDEX 0x0C
34 #define EHCI_CTRLDSSEGMENT 0x10
35 #define EHCI_PERIODICLISTBASE 0x14
36 #define EHCI_ASYNCLISTBASE 0x18
37 #define EHCI_CONFIGFLAG 0x40
38 #define EHCI_PORTSC 0x44
41 // Interrupt Register Flags
43 #define EHCI_USBINTR_INTE 0x01
44 #define EHCI_USBINTR_ERR 0x02
45 #define EHCI_USBINTR_PC 0x04
46 #define EHCI_USBINTR_FLROVR 0x08
47 #define EHCI_USBINTR_HSERR 0x10
48 #define EHCI_USBINTR_ASYNC 0x20
52 // Status Register Flags
54 #define EHCI_STS_INT 0x01
55 #define EHCI_STS_ERR 0x02
56 #define EHCI_STS_PCD 0x04
57 #define EHCI_STS_FLR 0x08
58 #define EHCI_STS_FATAL 0x10
59 #define EHCI_STS_IAA 0x20
61 #define EHCI_STS_HALT 0x1000
62 #define EHCI_STS_RECL 0x2000
63 #define EHCI_STS_PSS 0x4000
64 #define EHCI_STS_ASS 0x8000
65 #define EHCI_ERROR_INT (EHCI_STS_FATAL | EHCI_STS_ERR)
68 // Port Register Flags
70 #define EHCI_PRT_CONNECTED 0x01
71 #define EHCI_PRT_CONNECTSTATUSCHANGE 0x02
72 #define EHCI_PRT_ENABLED 0x04
73 #define EHCI_PRT_ENABLEDSTATUSCHANGE 0x08
74 #define EHCI_PRT_OVERCURRENTACTIVE 0x10
75 #define EHCI_PRT_OVERCURRENTCHANGE 0x20
76 #define EHCI_PRT_FORCERESUME 0x40
77 #define EHCI_PRT_SUSPEND 0x80
78 #define EHCI_PRT_RESET 0x100
79 #define EHCI_PRT_SLOWSPEEDLINE 0x400
80 #define EHCI_PRT_POWER 0x1000
81 #define EHCI_PRT_RELEASEOWNERSHIP 0x2000
83 #define EHCI_PORTSC_DATAMASK 0xffffffd1
85 // Terminate Pointer used for QueueHeads and Element Transfer Descriptors to mark Pointers as the end
87 #define TERMINATE_POINTER 0x01
90 // QUEUE ELEMENT TRANSFER DESCRIPTOR, defines and structs
96 #define PID_CODE_OUT_TOKEN 0x00
97 #define PID_CODE_IN_TOKEN 0x01
98 #define PID_CODE_SETUP_TOKEN 0x02
100 #define DO_START_SPLIT 0x00
101 #define DO_COMPLETE_SPLIT 0x01
103 #define PING_STATE_DO_OUT 0x00
104 #define PING_STATE_DO_PING 0x01
106 typedef struct _PERIODICFRAMELIST
109 PHYSICAL_ADDRESS PhysicalAddr
;
111 } PERIODICFRAMELIST
, *PPERIODICFRAMELIST
;
114 // QUEUE ELEMENT TRANSFER DESCRIPTOR TOKEN
116 typedef struct _QETD_TOKEN_BITS
119 ULONG SplitTransactionState
:1;
120 ULONG MissedMicroFrame
:1;
121 ULONG TransactionError
:1;
122 ULONG BabbleDetected
:1;
123 ULONG DataBufferError
:1;
127 ULONG ErrorCounter
:2;
129 ULONG InterruptOnComplete
:1;
130 ULONG TotalBytesToTransfer
:15;
132 } QETD_TOKEN_BITS
, *PQETD_TOKEN_BITS
;
135 // QUEUE ELEMENT TRANSFER DESCRIPTOR
137 typedef struct _QUEUE_TRANSFER_DESCRIPTOR
141 ULONG AlternateNextPointer
;
144 QETD_TOKEN_BITS Bits
;
147 ULONG BufferPointer
[5];
151 LIST_ENTRY LinkedDescriptors
;
152 ULONG TotalBytesToTransfer
;
153 } QUEUE_TRANSFER_DESCRIPTOR
, *PQUEUE_TRANSFER_DESCRIPTOR
;
156 // EndPointSpeeds Flags and END_POINT_CHARACTERISTICS
158 #define QH_ENDPOINT_FULLSPEED 0x00
159 #define QH_ENDPOINT_LOWSPEED 0x01
160 #define QH_ENDPOINT_HIGHSPEED 0x02
161 typedef struct _END_POINT_CHARACTERISTICS
163 ULONG DeviceAddress
:7;
164 ULONG InactiveOnNextTransaction
:1;
165 ULONG EndPointNumber
:4;
166 ULONG EndPointSpeed
:2;
167 ULONG QEDTDataToggleControl
:1;
168 ULONG HeadOfReclamation
:1;
169 ULONG MaximumPacketLength
:11;
170 ULONG ControlEndPointFlag
:1;
171 ULONG NakCountReload
:4;
172 } END_POINT_CHARACTERISTICS
, *PEND_POINT_CHARACTERISTICS
;
177 typedef struct _END_POINT_CAPABILITIES
179 ULONG InterruptScheduleMask
:8;
180 ULONG SplitCompletionMask
:8;
183 ULONG NumberOfTransactionPerFrame
:2;
184 } END_POINT_CAPABILITIES
, *PEND_POINT_CAPABILITIES
;
187 // QUEUE HEAD Flags and Struct
189 #define QH_TYPE_IDT 0x00
190 #define QH_TYPE_QH 0x02
191 #define QH_TYPE_SITD 0x04
192 #define QH_TYPE_FSTN 0x06
194 typedef struct _QUEUE_HEAD
197 ULONG HorizontalLinkPointer
;
198 END_POINT_CHARACTERISTICS EndPointCharacteristics
;
199 END_POINT_CAPABILITIES EndPointCapabilities
;
200 // TERMINATE_POINTER not valid for this member
201 ULONG CurrentLinkPointer
;
202 // TERMINATE_POINTER valid
204 // TERMINATE_POINTER valid, bits 1:4 is NAK_COUNTERd
205 ULONG AlternateNextPointer
;
206 // Only DataToggle, InterruptOnComplete, ErrorCounter, PingState valid
209 QETD_TOKEN_BITS Bits
;
212 ULONG BufferPointer
[5];
216 LIST_ENTRY LinkedQueueHeads
;
218 } QUEUE_HEAD
, *PQUEUE_HEAD
;
221 // Command register content
223 typedef struct _EHCI_USBCMD_CONTENT
227 ULONG FrameListSize
: 2;
228 ULONG PeriodicEnable
: 1;
229 ULONG AsyncEnable
: 1;
231 ULONG LightReset
: 1;
232 ULONG AsyncParkCount
: 2;
234 ULONG AsyncParkEnable
: 1;
236 ULONG IntThreshold
: 8;
238 } EHCI_USBCMD_CONTENT
, *PEHCI_USBCMD_CONTENT
;
240 typedef struct _EHCI_HCS_CONTENT
243 ULONG PortPowerControl
: 1;
245 ULONG PortRouteRules
: 1;
246 ULONG PortPerCHC
: 4;
248 ULONG PortIndicator
: 1;
250 ULONG DbgPortNum
: 4;
253 } EHCI_HCS_CONTENT
, *PEHCI_HCS_CONTENT
;
255 typedef struct _EHCI_HCC_CONTENT
257 ULONG CurAddrBits
: 1;
258 ULONG VarFrameList
: 1;
261 ULONG IsoSchedThreshold
: 4;
262 ULONG EECPCapable
: 8;
263 ULONG Reserved2
: 16;
265 } EHCI_HCC_CONTENT
, *PEHCI_HCC_CONTENT
;
267 typedef struct _EHCI_CAPS
{
273 EHCI_HCS_CONTENT HCSParams
;
278 EHCI_HCC_CONTENT HCCParams
;
281 UCHAR PortRoute
[15];
282 } EHCI_CAPS
, *PEHCI_CAPS
;
292 PHYSICAL_ADDRESS PhysicalBase
;
294 }DMA_MEMORY_ALLOCATOR
, *LPDMA_MEMORY_ALLOCATOR
;
296 typedef struct _EHCI_HOST_CONTROLLER
300 PVOID CommonBufferVA
;
301 PHYSICAL_ADDRESS CommonBufferPA
;
302 ULONG CommonBufferSize
;
303 PQUEUE_HEAD AsyncListQueue
;
305 LPDMA_MEMORY_ALLOCATOR DmaMemAllocator
;
306 } EHCI_HOST_CONTROLLER
, *PEHCI_HOST_CONTROLLER
;