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