Sync up to trunk head.
[reactos.git] / drivers / input / i8042prt / i8042prt.h
1 #pragma once
2
3 #include <ntifs.h>
4 #include <kbdmou.h>
5 #include <ntdd8042.h>
6 #include <ntddkbd.h>
7 #include <bugcodes.h>
8 #include <poclass.h>
9 #include <kdfuncs.h>
10 #include <debug.h>
11
12 /*-----------------------------------------------------
13 * Structures
14 * --------------------------------------------------*/
15
16 #define I8042PRT_TAG '2408'
17
18 typedef enum
19 {
20 dsStopped,
21 dsStarted,
22 dsPaused,
23 dsRemoved,
24 dsSurpriseRemoved
25 } DEVICE_STATE;
26
27 typedef struct _I8042_SETTINGS
28 {
29 /* Registry settings */
30 ULONG KeyboardDataQueueSize; /* done */
31 UNICODE_STRING KeyboardDeviceBaseName;
32 ULONG MouseDataQueueSize; /* done */
33 ULONG MouseResolution;
34 ULONG MouseSynchIn100ns;
35 ULONG NumberOfButtons;
36 UNICODE_STRING PointerDeviceBaseName;
37 ULONG PollStatusIterations; /* done */
38 ULONG OverrideKeyboardType;
39 ULONG OverrideKeyboardSubtype;
40 ULONG PollingIterations; /* done */
41 ULONG PollingIterationsMaximum;
42 ULONG ResendIterations; /* done */
43 ULONG SampleRate;
44 ULONG CrashOnCtrlScroll; /* done */
45 } I8042_SETTINGS, *PI8042_SETTINGS;
46
47 typedef enum _MOUSE_TIMEOUT_STATE
48 {
49 NoChange,
50 TimeoutStart,
51 TimeoutCancel
52 } MOUSE_TIMEOUT_STATE, *PMOUSE_TIMEOUT_STATE;
53
54 typedef struct _INTERRUPT_DATA
55 {
56 PKINTERRUPT Object;
57 ULONG Vector;
58 KIRQL Dirql;
59 KINTERRUPT_MODE InterruptMode;
60 BOOLEAN ShareInterrupt;
61 KAFFINITY Affinity;
62 } INTERRUPT_DATA, *PINTERRUPT_DATA;
63
64 #define WHEEL_DELTA 120
65
66 struct _I8042_KEYBOARD_EXTENSION;
67 typedef struct _I8042_KEYBOARD_EXTENSION *PI8042_KEYBOARD_EXTENSION;
68 struct _I8042_MOUSE_EXTENSION;
69 typedef struct _I8042_MOUSE_EXTENSION *PI8042_MOUSE_EXTENSION;
70
71 /* PORT_DEVICE_EXTENSION.Flags */
72 #define KEYBOARD_PRESENT 0x01 /* A keyboard is attached */
73 #define KEYBOARD_CONNECTED 0x02 /* Keyboard received IOCTL_INTERNAL_KEYBOARD_CONNECT */
74 #define KEYBOARD_STARTED 0x04 /* Keyboard FDO received IRP_MN_START_DEVICE */
75 #define KEYBOARD_INITIALIZED 0x08 /* Keyboard interrupt is connected */
76 #define MOUSE_PRESENT 0x10 /* A mouse is attached */
77 #define MOUSE_CONNECTED 0x20 /* Mouse received IOCTL_INTERNAL_MOUSE_CONNECT */
78 #define MOUSE_STARTED 0x40 /* Mouse FDO received IRP_MN_START_DEVICE */
79 #define MOUSE_INITIALIZED 0x80 /* Mouse interrupt is connected */
80
81 typedef struct _PORT_DEVICE_EXTENSION
82 {
83 PUCHAR DataPort; /* Usually 0x60 */
84 PUCHAR ControlPort; /* Usually 0x64 */
85 I8042_SETTINGS Settings;
86 ULONG Flags;
87
88 PI8042_KEYBOARD_EXTENSION KeyboardExtension;
89 INTERRUPT_DATA KeyboardInterrupt;
90 PI8042_MOUSE_EXTENSION MouseExtension;
91 INTERRUPT_DATA MouseInterrupt;
92 PKINTERRUPT HighestDIRQLInterrupt;
93 KSPIN_LOCK SpinLock;
94 KIRQL HighestDirql;
95
96 OUTPUT_PACKET Packet;
97 ULONG PacketResends;
98 BOOLEAN PacketComplete;
99 NTSTATUS PacketResult;
100 UCHAR PacketBuffer[16];
101 UCHAR PacketPort;
102
103 PIRP CurrentIrp;
104 PDEVICE_OBJECT CurrentIrpDevice;
105 } PORT_DEVICE_EXTENSION, *PPORT_DEVICE_EXTENSION;
106
107 typedef struct _I8042_DRIVER_EXTENSION
108 {
109 UNICODE_STRING RegistryPath;
110
111 PORT_DEVICE_EXTENSION Port;
112 LIST_ENTRY DeviceListHead;
113 KSPIN_LOCK DeviceListLock;
114 } I8042_DRIVER_EXTENSION, *PI8042_DRIVER_EXTENSION;
115
116 typedef enum _I8042_DEVICE_TYPE
117 {
118 Unknown,
119 Keyboard,
120 Mouse,
121 PhysicalDeviceObject
122 } I8042_DEVICE_TYPE, *PI8042_DEVICE_TYPE;
123
124 typedef struct _FDO_DEVICE_EXTENSION
125 {
126 I8042_DEVICE_TYPE Type;
127 // Linkage in I8042_DRIVER_EXTENSION.DeviceListHead
128 LIST_ENTRY ListEntry;
129 // Associated device object (FDO)
130 PDEVICE_OBJECT Fdo;
131 // Associated device object (PDO)
132 PDEVICE_OBJECT Pdo;
133 // Lower device object
134 PDEVICE_OBJECT LowerDevice;
135 // Current state of the driver
136 DEVICE_STATE PnpState;
137
138 PPORT_DEVICE_EXTENSION PortDeviceExtension;
139 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
140
141 typedef struct _I8042_KEYBOARD_EXTENSION
142 {
143 FDO_DEVICE_EXTENSION Common;
144 CONNECT_DATA KeyboardData;
145 INTERNAL_I8042_HOOK_KEYBOARD KeyboardHook; /* FIXME: IsrWritePort ignored */
146 KDPC DpcKeyboard;
147
148 KEYBOARD_ATTRIBUTES KeyboardAttributes;
149
150 KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators;
151
152 KEYBOARD_SCAN_STATE KeyboardScanState;
153 BOOLEAN KeyComplete;
154 PKEYBOARD_INPUT_DATA KeyboardBuffer;
155 ULONG KeysInBuffer;
156
157 /* Power keys items */
158 ULONG ReportedCaps;
159 ULONG NewCaps;
160 ULONG LastPowerKey;
161 UNICODE_STRING PowerInterfaceName;
162 PIO_WORKITEM PowerWorkItem;
163 PIRP PowerIrp;
164
165 /* Debug items */
166 ULONG ComboPosition;
167 PIO_WORKITEM DebugWorkItem;
168 BOOLEAN TabPressed;
169 } I8042_KEYBOARD_EXTENSION;
170
171 typedef enum _I8042_MOUSE_TYPE
172 {
173 GenericPS2,
174 Intellimouse,
175 IntellimouseExplorer,
176 Ps2pp
177 } I8042_MOUSE_TYPE, *PI8042_MOUSE_TYPE;
178
179 typedef struct _I8042_MOUSE_EXTENSION
180 {
181 FDO_DEVICE_EXTENSION Common;
182 CONNECT_DATA MouseData;
183 INTERNAL_I8042_HOOK_MOUSE MouseHook;
184 KDPC DpcMouse;
185
186 MOUSE_ATTRIBUTES MouseAttributes;
187
188 MOUSE_STATE MouseState;
189 BOOLEAN MouseComplete;
190 MOUSE_RESET_SUBSTATE MouseResetState;
191 PMOUSE_INPUT_DATA MouseBuffer;
192 ULONG MouseInBuffer;
193 USHORT MouseButtonState;
194 ULARGE_INTEGER MousePacketStartTime;
195
196 KTIMER TimerMouseTimeout;
197 KDPC DpcMouseTimeout;
198 MOUSE_TIMEOUT_STATE MouseTimeoutState;
199 BOOLEAN MouseTimeoutActive;
200
201 UCHAR MouseLogiBuffer[3];
202 I8042_MOUSE_TYPE MouseType;
203 } I8042_MOUSE_EXTENSION;
204
205 typedef struct _I8042_HOOK_WORKITEM
206 {
207 PIO_WORKITEM WorkItem;
208 PIRP Irp;
209 } I8042_HOOK_WORKITEM, *PI8042_HOOK_WORKITEM;
210
211 /*-----------------------------------------------------
212 * Some defines
213 * --------------------------------------------------*/
214
215 #define MAX(a, b) ((a) >= (b) ? (a) : (b))
216
217 #define KEYBOARD_POWER_CODE 0x5E
218 #define KEYBOARD_SLEEP_CODE 0x5F
219 #define KEYBOARD_WAKE_CODE 0x63
220
221 /*-----------------------------------------------------
222 * Controller commands
223 * --------------------------------------------------*/
224
225 #define KBD_READ_MODE 0x20
226 #define KBD_WRITE_MODE 0x60
227 #define MOUSE_ENAB 0xA8
228 #define MOUSE_LINE_TEST 0xA9
229 #define CTRL_SELF_TEST 0xAA
230 #define CTRL_WRITE_MOUSE 0xD4
231
232 /*-----------------------------------------------------
233 * Keyboard commands
234 * --------------------------------------------------*/
235
236 #define KBD_CMD_SET_LEDS 0xED
237 #define KBD_CMD_GET_ID 0xF2
238
239 /*-----------------------------------------------------
240 * Keyboard responses
241 * --------------------------------------------------*/
242
243 #define KBD_SELF_TEST_OK 0x55
244 #define KBD_ACK 0xFA
245 #define KBD_NACK 0xFC
246 #define KBD_RESEND 0xFE
247
248 /*-----------------------------------------------------
249 * Controller status register bits
250 * --------------------------------------------------*/
251
252 #define KBD_OBF 0x01
253 #define KBD_IBF 0x02
254 #define MOU_OBF 0x20
255 #define KBD_PERR 0x80
256
257 /*-----------------------------------------------------
258 * Controller command byte bits
259 * --------------------------------------------------*/
260
261 #define CCB_KBD_INT_ENAB 0x01
262 #define CCB_MOUSE_INT_ENAB 0x02
263 #define CCB_SYSTEM_FLAG 0x04
264 #define CCB_KBD_DISAB 0x10
265 #define CCB_MOUSE_DISAB 0x20
266 #define CCB_TRANSLATE 0x40
267
268 /*-----------------------------------------------------
269 * LED bits
270 * --------------------------------------------------*/
271
272 #define KBD_LED_SCROLL 0x01
273 #define KBD_LED_NUM 0x02
274 #define KBD_LED_CAPS 0x04
275
276 /*-----------------------------------------------------
277 * Mouse commands
278 * --------------------------------------------------*/
279
280 #define MOU_ENAB 0xF4
281 #define MOU_CMD_RESET 0xFF
282
283 /*-----------------------------------------------------
284 * Mouse responses
285 * --------------------------------------------------*/
286
287 #define MOUSE_ACK 0xFA
288 #define MOUSE_ERROR 0xFC
289 #define MOUSE_NACK 0xFE
290
291 /*-----------------------------------------------------
292 * Prototypes
293 * --------------------------------------------------*/
294
295 /* createclose.c */
296
297 IO_WORKITEM_ROUTINE i8042SendHookWorkItem;
298
299 DRIVER_DISPATCH i8042Create;
300
301 DRIVER_DISPATCH i8042Cleanup;
302
303 DRIVER_DISPATCH i8042Close;
304
305 /* keyboard.c */
306
307 NTSTATUS NTAPI
308 i8042SynchWritePortKbd(
309 IN PVOID Context,
310 IN UCHAR Value,
311 IN BOOLEAN WaitForAck);
312
313 DRIVER_STARTIO i8042KbdStartIo;
314
315 DRIVER_DISPATCH i8042KbdDeviceControl;
316
317 DRIVER_DISPATCH i8042KbdInternalDeviceControl;
318
319 KSERVICE_ROUTINE i8042KbdInterruptService;
320
321 /* i8042prt.c */
322
323 DRIVER_ADD_DEVICE i8042AddDevice;
324
325 BOOLEAN
326 i8042PacketIsr(
327 IN PPORT_DEVICE_EXTENSION DeviceExtension,
328 IN UCHAR Output);
329
330 NTSTATUS
331 i8042StartPacket(
332 IN PPORT_DEVICE_EXTENSION DeviceExtension,
333 IN PFDO_DEVICE_EXTENSION FdoDeviceExtension,
334 IN PUCHAR Bytes,
335 IN ULONG ByteCount,
336 IN PIRP Irp);
337
338 /* misc.c */
339
340 DRIVER_DISPATCH ForwardIrpAndForget;
341
342 DRIVER_DISPATCH ForwardIrpAndWait;
343
344 NTSTATUS
345 DuplicateUnicodeString(
346 IN ULONG Flags,
347 IN PCUNICODE_STRING SourceString,
348 OUT PUNICODE_STRING DestinationString);
349
350 /* mouse.c */
351
352 VOID
353 i8042MouHandle(
354 IN PI8042_MOUSE_EXTENSION DeviceExtension,
355 IN UCHAR Output);
356
357 VOID
358 i8042MouHandleButtons(
359 IN PI8042_MOUSE_EXTENSION DeviceExtension,
360 IN USHORT Mask);
361
362 NTSTATUS
363 i8042MouInitialize(
364 IN PI8042_MOUSE_EXTENSION DeviceExtension);
365
366 DRIVER_DISPATCH i8042MouInternalDeviceControl;
367
368 KSERVICE_ROUTINE i8042MouInterruptService;
369
370 /* pnp.c */
371
372 BOOLEAN
373 i8042ChangeMode(
374 IN PPORT_DEVICE_EXTENSION DeviceExtension,
375 IN UCHAR FlagsToDisable,
376 IN UCHAR FlagsToEnable);
377
378 DRIVER_DISPATCH i8042Pnp;
379
380 /* ps2pp.c */
381 VOID
382 i8042MouHandlePs2pp(
383 IN PI8042_MOUSE_EXTENSION DeviceExtension,
384 IN UCHAR Input);
385
386 /* readwrite.c */
387
388 VOID
389 i8042Flush(
390 IN PPORT_DEVICE_EXTENSION DeviceExtension);
391
392 BOOLEAN
393 i8042IsrWritePort(
394 IN PPORT_DEVICE_EXTENSION DeviceExtension,
395 IN UCHAR Value,
396 IN UCHAR SelectCmd OPTIONAL);
397
398 NTSTATUS
399 i8042ReadData(
400 IN PPORT_DEVICE_EXTENSION DeviceExtension,
401 IN UCHAR StatusFlags,
402 OUT PUCHAR Data);
403 #define i8042ReadKeyboardData(DeviceExtension, Data) \
404 i8042ReadData(DeviceExtension, KBD_OBF, Data)
405 #define i8042ReadMouseData(DeviceExtension, Data) \
406 i8042ReadData(DeviceExtension, MOU_OBF, Data)
407
408 NTSTATUS
409 i8042ReadDataWait(
410 IN PPORT_DEVICE_EXTENSION DeviceExtension,
411 OUT PUCHAR Data);
412
413 NTSTATUS
414 i8042ReadStatus(
415 IN PPORT_DEVICE_EXTENSION DeviceExtension,
416 OUT PUCHAR Status);
417
418 NTSTATUS NTAPI
419 i8042SynchReadPort(
420 IN PVOID Context,
421 OUT PUCHAR Value,
422 IN BOOLEAN WaitForAck);
423
424 NTSTATUS NTAPI
425 i8042SynchWritePort(
426 IN PPORT_DEVICE_EXTENSION DeviceExtension,
427 IN UCHAR Port,
428 IN UCHAR Value,
429 IN BOOLEAN WaitForAck);
430
431 BOOLEAN
432 i8042Write(
433 IN PPORT_DEVICE_EXTENSION DeviceExtension,
434 IN PUCHAR addr,
435 IN UCHAR data);
436
437 /* registry.c */
438
439 NTSTATUS
440 ReadRegistryEntries(
441 IN PUNICODE_STRING RegistryPath,
442 OUT PI8042_SETTINGS Settings);
443
444 /* setup.c */
445
446 BOOLEAN
447 IsFirstStageSetup(
448 VOID);
449
450 NTSTATUS
451 i8042AddLegacyKeyboard(
452 IN PDRIVER_OBJECT DriverObject,
453 IN PUNICODE_STRING RegistryPath);