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