b940ab2097bd6c6dbaa94ade39890be2cdb21d8e
[reactos.git] / drivers / usb / usbehci / hardware.h
1 #pragma once
2
3 #include <ntddk.h>
4
5
6 //
7 // Host Controller Capability Registers
8 //
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
14
15
16 //
17 // Extended Capabilities
18 //
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)
25
26
27 //
28 // EHCI Operational Registers
29 //
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
39
40 //
41 // Interrupt Register Flags
42 //
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
49 // Bits 6:31 Reserved
50
51 //
52 // Status Register Flags
53 //
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
60 // Bits 11:6 Reserved
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)
66
67 //
68 // Port Register Flags
69 //
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
82
83 #define EHCI_PORTSC_DATAMASK 0xffffffd1
84 //
85 // Terminate Pointer used for QueueHeads and Element Transfer Descriptors to mark Pointers as the end
86 //
87 #define TERMINATE_POINTER 0x01
88
89 //
90 // QUEUE ELEMENT TRANSFER DESCRIPTOR, defines and structs
91 //
92
93 //
94 // Token Flags
95 //
96 #define PID_CODE_OUT_TOKEN 0x00
97 #define PID_CODE_IN_TOKEN 0x01
98 #define PID_CODE_SETUP_TOKEN 0x02
99
100 #define DO_START_SPLIT 0x00
101 #define DO_COMPLETE_SPLIT 0x01
102
103 #define PING_STATE_DO_OUT 0x00
104 #define PING_STATE_DO_PING 0x01
105
106 typedef struct _PERIODICFRAMELIST
107 {
108 PULONG VirtualAddr;
109 PHYSICAL_ADDRESS PhysicalAddr;
110 ULONG Size;
111 } PERIODICFRAMELIST, *PPERIODICFRAMELIST;
112
113 //
114 // QUEUE ELEMENT TRANSFER DESCRIPTOR TOKEN
115 //
116 typedef struct _QETD_TOKEN_BITS
117 {
118 ULONG PingState:1;
119 ULONG SplitTransactionState:1;
120 ULONG MissedMicroFrame:1;
121 ULONG TransactionError:1;
122 ULONG BabbleDetected:1;
123 ULONG DataBufferError:1;
124 ULONG Halted:1;
125 ULONG Active:1;
126 ULONG PIDCode:2;
127 ULONG ErrorCounter:2;
128 ULONG CurrentPage:3;
129 ULONG InterruptOnComplete:1;
130 ULONG TotalBytesToTransfer:15;
131 ULONG DataToggle:1;
132 } QETD_TOKEN_BITS, *PQETD_TOKEN_BITS;
133
134 //
135 // QUEUE ELEMENT TRANSFER DESCRIPTOR
136 //
137 typedef struct _QUEUE_TRANSFER_DESCRIPTOR
138 {
139 //Hardware
140 ULONG NextPointer;
141 ULONG AlternateNextPointer;
142 union
143 {
144 QETD_TOKEN_BITS Bits;
145 ULONG DWord;
146 } Token;
147 ULONG BufferPointer[5];
148
149 //Software
150 ULONG PhysicalAddr;
151 LIST_ENTRY DescriptorEntry;
152 ULONG TotalBytesToTransfer;
153 } QUEUE_TRANSFER_DESCRIPTOR, *PQUEUE_TRANSFER_DESCRIPTOR;
154
155 C_ASSERT(FIELD_OFFSET(QUEUE_TRANSFER_DESCRIPTOR, PhysicalAddr) == 0x20);
156
157 //
158 // EndPointSpeeds Flags and END_POINT_CHARACTERISTICS
159 //
160 #define QH_ENDPOINT_FULLSPEED 0x00
161 #define QH_ENDPOINT_LOWSPEED 0x01
162 #define QH_ENDPOINT_HIGHSPEED 0x02
163 typedef struct _END_POINT_CHARACTERISTICS
164 {
165 ULONG DeviceAddress:7;
166 ULONG InactiveOnNextTransaction:1;
167 ULONG EndPointNumber:4;
168 ULONG EndPointSpeed:2;
169 ULONG QEDTDataToggleControl:1;
170 ULONG HeadOfReclamation:1;
171 ULONG MaximumPacketLength:11;
172 ULONG ControlEndPointFlag:1;
173 ULONG NakCountReload:4;
174 } END_POINT_CHARACTERISTICS, *PEND_POINT_CHARACTERISTICS;
175
176 //
177 // Capabilities
178 //
179 typedef struct _END_POINT_CAPABILITIES
180 {
181 ULONG InterruptScheduleMask:8;
182 ULONG SplitCompletionMask:8;
183 ULONG HubAddr:6;
184 ULONG PortNumber:6;
185 ULONG NumberOfTransactionPerFrame:2;
186 } END_POINT_CAPABILITIES, *PEND_POINT_CAPABILITIES;
187
188 //
189 // QUEUE HEAD Flags and Struct
190 //
191 #define QH_TYPE_IDT 0x00
192 #define QH_TYPE_QH 0x02
193 #define QH_TYPE_SITD 0x04
194 #define QH_TYPE_FSTN 0x06
195
196 typedef struct _QUEUE_HEAD
197 {
198 //Hardware
199 ULONG HorizontalLinkPointer;
200 END_POINT_CHARACTERISTICS EndPointCharacteristics;
201 END_POINT_CAPABILITIES EndPointCapabilities;
202 // TERMINATE_POINTER not valid for this member
203 ULONG CurrentLinkPointer;
204 // TERMINATE_POINTER valid
205 ULONG NextPointer;
206 // TERMINATE_POINTER valid, bits 1:4 is NAK_COUNTERd
207 ULONG AlternateNextPointer;
208 // Only DataToggle, InterruptOnComplete, ErrorCounter, PingState valid
209 union
210 {
211 QETD_TOKEN_BITS Bits;
212 ULONG DWord;
213 } Token;
214 ULONG BufferPointer[5];
215
216 //Software
217 ULONG PhysicalAddr;
218 LIST_ENTRY LinkedQueueHeads;
219 LIST_ENTRY TransferDescriptorListHead;
220 PVOID Request;
221 } QUEUE_HEAD, *PQUEUE_HEAD;
222
223 C_ASSERT(sizeof(END_POINT_CHARACTERISTICS) == 4);
224 C_ASSERT(sizeof(END_POINT_CAPABILITIES) == 4);
225
226 C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, HorizontalLinkPointer) == 0x00);
227 C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, EndPointCharacteristics) == 0x04);
228 C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, EndPointCapabilities) == 0x08);
229 C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, CurrentLinkPointer) == 0xC);
230 C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, NextPointer) == 0x10);
231 C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, AlternateNextPointer) == 0x14);
232 C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, Token) == 0x18);
233 C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, BufferPointer) == 0x1C);
234 C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, PhysicalAddr) == 0x30);
235
236
237 //
238 // Command register content
239 //
240 typedef struct _EHCI_USBCMD_CONTENT
241 {
242 ULONG Run : 1;
243 ULONG HCReset : 1;
244 ULONG FrameListSize : 2;
245 ULONG PeriodicEnable : 1;
246 ULONG AsyncEnable : 1;
247 ULONG DoorBell : 1;
248 ULONG LightReset : 1;
249 ULONG AsyncParkCount : 2;
250 ULONG Reserved : 1;
251 ULONG AsyncParkEnable : 1;
252 ULONG Reserved1 : 4;
253 ULONG IntThreshold : 8;
254 ULONG Reserved2 : 8;
255 } EHCI_USBCMD_CONTENT, *PEHCI_USBCMD_CONTENT;
256
257 typedef struct _EHCI_HCS_CONTENT
258 {
259 ULONG PortCount : 4;
260 ULONG PortPowerControl: 1;
261 ULONG Reserved : 2;
262 ULONG PortRouteRules : 1;
263 ULONG PortPerCHC : 4;
264 ULONG CHCCount : 4;
265 ULONG PortIndicator : 1;
266 ULONG Reserved2 : 3;
267 ULONG DbgPortNum : 4;
268 ULONG Reserved3 : 8;
269
270 } EHCI_HCS_CONTENT, *PEHCI_HCS_CONTENT;
271
272 typedef struct _EHCI_HCC_CONTENT
273 {
274 ULONG CurAddrBits : 1;
275 ULONG VarFrameList : 1;
276 ULONG ParkMode : 1;
277 ULONG Reserved : 1;
278 ULONG IsoSchedThreshold : 4;
279 ULONG EECPCapable : 8;
280 ULONG Reserved2 : 16;
281
282 } EHCI_HCC_CONTENT, *PEHCI_HCC_CONTENT;
283
284 typedef struct _EHCI_CAPS {
285 UCHAR Length;
286 UCHAR Reserved;
287 USHORT HCIVersion;
288 union
289 {
290 EHCI_HCS_CONTENT HCSParams;
291 ULONG HCSParamsLong;
292 };
293 union
294 {
295 EHCI_HCC_CONTENT HCCParams;
296 ULONG HCCParamsLong;
297 };
298 UCHAR PortRoute [15];
299 } EHCI_CAPS, *PEHCI_CAPS;
300
301 typedef struct
302 {
303 ULONG PortStatus;
304 ULONG PortChange;
305 }EHCI_PORT_STATUS;
306
307