8 /*-----------------------------------------------------
10 * --------------------------------------------------*/
12 #define I8042PRT_TAG '2408'
23 typedef struct _I8042_SETTINGS
25 /* Registry settings */
26 ULONG KeyboardDataQueueSize
; /* done */
27 UNICODE_STRING KeyboardDeviceBaseName
;
28 ULONG MouseDataQueueSize
; /* done */
29 ULONG MouseResolution
;
30 ULONG MouseSynchIn100ns
;
31 ULONG NumberOfButtons
;
32 UNICODE_STRING PointerDeviceBaseName
;
33 ULONG PollStatusIterations
; /* done */
34 ULONG OverrideKeyboardType
;
35 ULONG OverrideKeyboardSubtype
;
36 ULONG PollingIterations
; /* done */
37 ULONG PollingIterationsMaximum
;
38 ULONG ResendIterations
; /* done */
40 ULONG CrashOnCtrlScroll
; /* done */
41 } I8042_SETTINGS
, *PI8042_SETTINGS
;
43 typedef enum _MOUSE_TIMEOUT_STATE
48 } MOUSE_TIMEOUT_STATE
, *PMOUSE_TIMEOUT_STATE
;
50 typedef struct _INTERRUPT_DATA
55 KINTERRUPT_MODE InterruptMode
;
56 BOOLEAN ShareInterrupt
;
58 } INTERRUPT_DATA
, *PINTERRUPT_DATA
;
60 #define WHEEL_DELTA 120
62 struct _I8042_KEYBOARD_EXTENSION
;
63 typedef struct _I8042_KEYBOARD_EXTENSION
*PI8042_KEYBOARD_EXTENSION
;
64 struct _I8042_MOUSE_EXTENSION
;
65 typedef struct _I8042_MOUSE_EXTENSION
*PI8042_MOUSE_EXTENSION
;
67 /* PORT_DEVICE_EXTENSION.Flags */
68 #define KEYBOARD_PRESENT 0x01 /* A keyboard is attached */
69 #define KEYBOARD_CONNECTED 0x02 /* Keyboard received IOCTL_INTERNAL_KEYBOARD_CONNECT */
70 #define KEYBOARD_STARTED 0x04 /* Keyboard FDO received IRP_MN_START_DEVICE */
71 #define KEYBOARD_INITIALIZED 0x08 /* Keyboard interrupt is connected */
72 #define MOUSE_PRESENT 0x10 /* A mouse is attached */
73 #define MOUSE_CONNECTED 0x20 /* Mouse received IOCTL_INTERNAL_MOUSE_CONNECT */
74 #define MOUSE_STARTED 0x40 /* Mouse FDO received IRP_MN_START_DEVICE */
75 #define MOUSE_INITIALIZED 0x80 /* Mouse interrupt is connected */
77 typedef struct _PORT_DEVICE_EXTENSION
79 PUCHAR DataPort
; /* Usually 0x60 */
80 PUCHAR ControlPort
; /* Usually 0x64 */
81 I8042_SETTINGS Settings
;
84 PI8042_KEYBOARD_EXTENSION KeyboardExtension
;
85 INTERRUPT_DATA KeyboardInterrupt
;
86 PI8042_MOUSE_EXTENSION MouseExtension
;
87 INTERRUPT_DATA MouseInterrupt
;
88 PKINTERRUPT HighestDIRQLInterrupt
;
94 BOOLEAN PacketComplete
;
95 NTSTATUS PacketResult
;
96 UCHAR PacketBuffer
[16];
100 PDEVICE_OBJECT CurrentIrpDevice
;
101 } PORT_DEVICE_EXTENSION
, *PPORT_DEVICE_EXTENSION
;
103 typedef struct _I8042_DRIVER_EXTENSION
105 UNICODE_STRING RegistryPath
;
107 PORT_DEVICE_EXTENSION Port
;
108 LIST_ENTRY DeviceListHead
;
109 KSPIN_LOCK DeviceListLock
;
110 } I8042_DRIVER_EXTENSION
, *PI8042_DRIVER_EXTENSION
;
112 typedef enum _I8042_DEVICE_TYPE
118 } I8042_DEVICE_TYPE
, *PI8042_DEVICE_TYPE
;
120 typedef struct _FDO_DEVICE_EXTENSION
122 I8042_DEVICE_TYPE Type
;
123 // Linkage in I8042_DRIVER_EXTENSION.DeviceListHead
124 LIST_ENTRY ListEntry
;
125 // Associated device object (FDO)
127 // Associated device object (PDO)
129 // Lower device object
130 PDEVICE_OBJECT LowerDevice
;
131 // Current state of the driver
132 DEVICE_STATE PnpState
;
134 PPORT_DEVICE_EXTENSION PortDeviceExtension
;
135 } FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
137 typedef struct _I8042_KEYBOARD_EXTENSION
139 FDO_DEVICE_EXTENSION Common
;
140 CONNECT_DATA KeyboardData
;
141 INTERNAL_I8042_HOOK_KEYBOARD KeyboardHook
; /* FIXME: IsrWritePort ignored */
144 KEYBOARD_ATTRIBUTES KeyboardAttributes
;
146 KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators
;
148 KEYBOARD_SCAN_STATE KeyboardScanState
;
150 PKEYBOARD_INPUT_DATA KeyboardBuffer
;
153 /* Power keys items */
157 UNICODE_STRING PowerInterfaceName
;
158 PIO_WORKITEM PowerWorkItem
;
163 PIO_WORKITEM DebugWorkItem
;
165 } I8042_KEYBOARD_EXTENSION
;
167 typedef enum _I8042_MOUSE_TYPE
171 IntellimouseExplorer
,
173 } I8042_MOUSE_TYPE
, *PI8042_MOUSE_TYPE
;
175 typedef struct _I8042_MOUSE_EXTENSION
177 FDO_DEVICE_EXTENSION Common
;
178 CONNECT_DATA MouseData
;
179 INTERNAL_I8042_HOOK_MOUSE MouseHook
;
182 MOUSE_ATTRIBUTES MouseAttributes
;
184 MOUSE_STATE MouseState
;
185 BOOLEAN MouseComplete
;
186 MOUSE_RESET_SUBSTATE MouseResetState
;
187 PMOUSE_INPUT_DATA MouseBuffer
;
189 USHORT MouseButtonState
;
190 ULARGE_INTEGER MousePacketStartTime
;
192 KTIMER TimerMouseTimeout
;
193 KDPC DpcMouseTimeout
;
194 MOUSE_TIMEOUT_STATE MouseTimeoutState
;
195 BOOLEAN MouseTimeoutActive
;
197 UCHAR MouseLogiBuffer
[3];
198 I8042_MOUSE_TYPE MouseType
;
199 } I8042_MOUSE_EXTENSION
;
201 typedef struct _I8042_HOOK_WORKITEM
203 PIO_WORKITEM WorkItem
;
205 } I8042_HOOK_WORKITEM
, *PI8042_HOOK_WORKITEM
;
207 /*-----------------------------------------------------
209 * --------------------------------------------------*/
211 #define MAX(a, b) ((a) >= (b) ? (a) : (b))
213 #define KEYBOARD_POWER_CODE 0x5E
214 #define KEYBOARD_SLEEP_CODE 0x5F
215 #define KEYBOARD_WAKE_CODE 0x63
217 /*-----------------------------------------------------
218 * Controller commands
219 * --------------------------------------------------*/
221 #define KBD_READ_MODE 0x20
222 #define KBD_WRITE_MODE 0x60
223 #define MOUSE_ENAB 0xA8
224 #define MOUSE_LINE_TEST 0xA9
225 #define CTRL_SELF_TEST 0xAA
226 #define CTRL_WRITE_MOUSE 0xD4
228 /*-----------------------------------------------------
230 * --------------------------------------------------*/
232 #define KBD_CMD_SET_LEDS 0xED
233 #define KBD_CMD_GET_ID 0xF2
235 /*-----------------------------------------------------
237 * --------------------------------------------------*/
239 #define KBD_SELF_TEST_OK 0x55
241 #define KBD_NACK 0xFC
242 #define KBD_RESEND 0xFE
244 /*-----------------------------------------------------
245 * Controller status register bits
246 * --------------------------------------------------*/
251 #define KBD_PERR 0x80
253 /*-----------------------------------------------------
254 * Controller command byte bits
255 * --------------------------------------------------*/
257 #define CCB_KBD_INT_ENAB 0x01
258 #define CCB_MOUSE_INT_ENAB 0x02
259 #define CCB_SYSTEM_FLAG 0x04
260 #define CCB_KBD_DISAB 0x10
261 #define CCB_MOUSE_DISAB 0x20
262 #define CCB_TRANSLATE 0x40
264 /*-----------------------------------------------------
266 * --------------------------------------------------*/
268 #define KBD_LED_SCROLL 0x01
269 #define KBD_LED_NUM 0x02
270 #define KBD_LED_CAPS 0x04
272 /*-----------------------------------------------------
274 * --------------------------------------------------*/
276 #define MOU_ENAB 0xF4
277 #define MOU_CMD_RESET 0xFF
279 /*-----------------------------------------------------
281 * --------------------------------------------------*/
283 #define MOUSE_ACK 0xFA
284 #define MOUSE_ERROR 0xFC
285 #define MOUSE_NACK 0xFE
287 /*-----------------------------------------------------
289 * --------------------------------------------------*/
293 IO_WORKITEM_ROUTINE i8042SendHookWorkItem
;
295 DRIVER_DISPATCH i8042Create
;
297 DRIVER_DISPATCH i8042Cleanup
;
299 DRIVER_DISPATCH i8042Close
;
304 i8042SynchWritePortKbd(
307 IN BOOLEAN WaitForAck
);
309 DRIVER_STARTIO i8042KbdStartIo
;
311 DRIVER_DISPATCH i8042KbdDeviceControl
;
313 DRIVER_DISPATCH i8042KbdInternalDeviceControl
;
315 KSERVICE_ROUTINE i8042KbdInterruptService
;
319 DRIVER_ADD_DEVICE i8042AddDevice
;
323 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
328 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
329 IN PFDO_DEVICE_EXTENSION FdoDeviceExtension
,
336 DRIVER_DISPATCH ForwardIrpAndForget
;
338 DRIVER_DISPATCH ForwardIrpAndWait
;
341 DuplicateUnicodeString(
343 IN PCUNICODE_STRING SourceString
,
344 OUT PUNICODE_STRING DestinationString
);
350 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
354 i8042MouHandleButtons(
355 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
360 IN PI8042_MOUSE_EXTENSION DeviceExtension
);
362 DRIVER_DISPATCH i8042MouInternalDeviceControl
;
364 KSERVICE_ROUTINE i8042MouInterruptService
;
370 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
371 IN UCHAR FlagsToDisable
,
372 IN UCHAR FlagsToEnable
);
374 DRIVER_DISPATCH i8042Pnp
;
379 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
386 IN PPORT_DEVICE_EXTENSION DeviceExtension
);
390 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
392 IN UCHAR SelectCmd OPTIONAL
);
396 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
397 IN UCHAR StatusFlags
,
399 #define i8042ReadKeyboardData(DeviceExtension, Data) \
400 i8042ReadData(DeviceExtension, KBD_OBF, Data)
401 #define i8042ReadMouseData(DeviceExtension, Data) \
402 i8042ReadData(DeviceExtension, MOU_OBF, Data)
406 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
411 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
418 IN BOOLEAN WaitForAck
);
422 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
425 IN BOOLEAN WaitForAck
);
429 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
437 IN PUNICODE_STRING RegistryPath
,
438 OUT PI8042_SETTINGS Settings
);
440 #endif /* _I8042PRT_PCH_ */