10 /*-----------------------------------------------------
12 * --------------------------------------------------*/
14 #define I8042PRT_TAG '2408'
25 typedef struct _I8042_SETTINGS
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 */
42 ULONG CrashOnCtrlScroll
; /* done */
43 } I8042_SETTINGS
, *PI8042_SETTINGS
;
45 typedef enum _MOUSE_TIMEOUT_STATE
50 } MOUSE_TIMEOUT_STATE
, *PMOUSE_TIMEOUT_STATE
;
52 typedef struct _INTERRUPT_DATA
57 KINTERRUPT_MODE InterruptMode
;
58 BOOLEAN ShareInterrupt
;
60 } INTERRUPT_DATA
, *PINTERRUPT_DATA
;
62 #define WHEEL_DELTA 120
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
;
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 */
79 typedef struct _PORT_DEVICE_EXTENSION
81 PUCHAR DataPort
; /* Usually 0x60 */
82 PUCHAR ControlPort
; /* Usually 0x64 */
83 I8042_SETTINGS Settings
;
86 PI8042_KEYBOARD_EXTENSION KeyboardExtension
;
87 INTERRUPT_DATA KeyboardInterrupt
;
88 PI8042_MOUSE_EXTENSION MouseExtension
;
89 INTERRUPT_DATA MouseInterrupt
;
90 PKINTERRUPT HighestDIRQLInterrupt
;
96 BOOLEAN PacketComplete
;
97 NTSTATUS PacketResult
;
98 UCHAR PacketBuffer
[16];
102 PDEVICE_OBJECT CurrentIrpDevice
;
103 } PORT_DEVICE_EXTENSION
, *PPORT_DEVICE_EXTENSION
;
105 typedef struct _I8042_DRIVER_EXTENSION
107 UNICODE_STRING RegistryPath
;
109 PORT_DEVICE_EXTENSION Port
;
110 LIST_ENTRY DeviceListHead
;
111 KSPIN_LOCK DeviceListLock
;
112 } I8042_DRIVER_EXTENSION
, *PI8042_DRIVER_EXTENSION
;
114 typedef enum _I8042_DEVICE_TYPE
120 } I8042_DEVICE_TYPE
, *PI8042_DEVICE_TYPE
;
122 typedef struct _FDO_DEVICE_EXTENSION
124 I8042_DEVICE_TYPE Type
;
125 // Linkage in I8042_DRIVER_EXTENSION.DeviceListHead
126 LIST_ENTRY ListEntry
;
127 // Associated device object (FDO)
129 // Associated device object (PDO)
131 // Lower device object
132 PDEVICE_OBJECT LowerDevice
;
133 // Current state of the driver
134 DEVICE_STATE PnpState
;
136 PPORT_DEVICE_EXTENSION PortDeviceExtension
;
137 } FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
139 typedef struct _I8042_KEYBOARD_EXTENSION
141 FDO_DEVICE_EXTENSION Common
;
142 CONNECT_DATA KeyboardData
;
143 INTERNAL_I8042_HOOK_KEYBOARD KeyboardHook
; /* FIXME: IsrWritePort ignored */
146 KEYBOARD_ATTRIBUTES KeyboardAttributes
;
148 KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators
;
150 KEYBOARD_SCAN_STATE KeyboardScanState
;
152 PKEYBOARD_INPUT_DATA KeyboardBuffer
;
155 /* Power keys items */
159 UNICODE_STRING PowerInterfaceName
;
160 PIO_WORKITEM PowerWorkItem
;
165 PIO_WORKITEM DebugWorkItem
;
167 } I8042_KEYBOARD_EXTENSION
;
169 typedef enum _I8042_MOUSE_TYPE
173 IntellimouseExplorer
,
175 } I8042_MOUSE_TYPE
, *PI8042_MOUSE_TYPE
;
177 typedef struct _I8042_MOUSE_EXTENSION
179 FDO_DEVICE_EXTENSION Common
;
180 CONNECT_DATA MouseData
;
181 INTERNAL_I8042_HOOK_MOUSE MouseHook
;
184 MOUSE_ATTRIBUTES MouseAttributes
;
186 MOUSE_STATE MouseState
;
187 BOOLEAN MouseComplete
;
188 MOUSE_RESET_SUBSTATE MouseResetState
;
189 PMOUSE_INPUT_DATA MouseBuffer
;
191 USHORT MouseButtonState
;
192 ULARGE_INTEGER MousePacketStartTime
;
194 KTIMER TimerMouseTimeout
;
195 KDPC DpcMouseTimeout
;
196 MOUSE_TIMEOUT_STATE MouseTimeoutState
;
197 BOOLEAN MouseTimeoutActive
;
199 UCHAR MouseLogiBuffer
[3];
200 I8042_MOUSE_TYPE MouseType
;
201 } I8042_MOUSE_EXTENSION
;
203 typedef struct _I8042_HOOK_WORKITEM
205 PIO_WORKITEM WorkItem
;
207 } I8042_HOOK_WORKITEM
, *PI8042_HOOK_WORKITEM
;
209 /*-----------------------------------------------------
211 * --------------------------------------------------*/
213 #define MAX(a, b) ((a) >= (b) ? (a) : (b))
215 #define KEYBOARD_POWER_CODE 0x5E
216 #define KEYBOARD_SLEEP_CODE 0x5F
217 #define KEYBOARD_WAKE_CODE 0x63
219 /*-----------------------------------------------------
220 * Controller commands
221 * --------------------------------------------------*/
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
230 /*-----------------------------------------------------
232 * --------------------------------------------------*/
234 #define KBD_CMD_SET_LEDS 0xED
235 #define KBD_CMD_GET_ID 0xF2
237 /*-----------------------------------------------------
239 * --------------------------------------------------*/
241 #define KBD_SELF_TEST_OK 0x55
243 #define KBD_NACK 0xFC
244 #define KBD_RESEND 0xFE
246 /*-----------------------------------------------------
247 * Controller status register bits
248 * --------------------------------------------------*/
253 #define KBD_PERR 0x80
255 /*-----------------------------------------------------
256 * Controller command byte bits
257 * --------------------------------------------------*/
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
266 /*-----------------------------------------------------
268 * --------------------------------------------------*/
270 #define KBD_LED_SCROLL 0x01
271 #define KBD_LED_NUM 0x02
272 #define KBD_LED_CAPS 0x04
274 /*-----------------------------------------------------
276 * --------------------------------------------------*/
278 #define MOU_ENAB 0xF4
279 #define MOU_CMD_RESET 0xFF
281 /*-----------------------------------------------------
283 * --------------------------------------------------*/
285 #define MOUSE_ACK 0xFA
286 #define MOUSE_ERROR 0xFC
287 #define MOUSE_NACK 0xFE
289 /*-----------------------------------------------------
291 * --------------------------------------------------*/
295 IO_WORKITEM_ROUTINE i8042SendHookWorkItem
;
297 DRIVER_DISPATCH i8042Create
;
299 DRIVER_DISPATCH i8042Cleanup
;
301 DRIVER_DISPATCH i8042Close
;
306 i8042SynchWritePortKbd(
309 IN BOOLEAN WaitForAck
);
311 DRIVER_STARTIO i8042KbdStartIo
;
313 DRIVER_DISPATCH i8042KbdDeviceControl
;
315 DRIVER_DISPATCH i8042KbdInternalDeviceControl
;
317 KSERVICE_ROUTINE i8042KbdInterruptService
;
321 DRIVER_ADD_DEVICE i8042AddDevice
;
325 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
330 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
331 IN PFDO_DEVICE_EXTENSION FdoDeviceExtension
,
338 DRIVER_DISPATCH ForwardIrpAndForget
;
340 DRIVER_DISPATCH ForwardIrpAndWait
;
343 DuplicateUnicodeString(
345 IN PCUNICODE_STRING SourceString
,
346 OUT PUNICODE_STRING DestinationString
);
352 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
356 i8042MouHandleButtons(
357 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
362 IN PI8042_MOUSE_EXTENSION DeviceExtension
);
364 DRIVER_DISPATCH i8042MouInternalDeviceControl
;
366 KSERVICE_ROUTINE i8042MouInterruptService
;
372 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
373 IN UCHAR FlagsToDisable
,
374 IN UCHAR FlagsToEnable
);
376 DRIVER_DISPATCH i8042Pnp
;
381 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
388 IN PPORT_DEVICE_EXTENSION DeviceExtension
);
392 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
394 IN UCHAR SelectCmd OPTIONAL
);
398 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
399 IN UCHAR StatusFlags
,
401 #define i8042ReadKeyboardData(DeviceExtension, Data) \
402 i8042ReadData(DeviceExtension, KBD_OBF, Data)
403 #define i8042ReadMouseData(DeviceExtension, Data) \
404 i8042ReadData(DeviceExtension, MOU_OBF, Data)
408 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
413 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
420 IN BOOLEAN WaitForAck
);
424 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
427 IN BOOLEAN WaitForAck
);
431 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
439 IN PUNICODE_STRING RegistryPath
,
440 OUT PI8042_SETTINGS Settings
);