4 #include <ddk/ntddkbd.h>
5 #include <ddk/ntdd8042.h>
9 #define KBD_BUFFER_SIZE 32
11 // should be in ntdd8042.h
14 (*KEYBOARD_CLASS_SERVICE_CALLBACK
) (
15 IN PDEVICE_OBJECT DeviceObject
,
16 IN PKEYBOARD_INPUT_DATA InputDataStart
,
17 IN PKEYBOARD_INPUT_DATA InputDataEnd
,
18 IN OUT PULONG InputDataConsumed
21 /* I'm not actually sure if this is in the ddk, would seem logical */
23 (*MOUSE_CLASS_SERVICE_CALLBACK
) (
24 IN PDEVICE_OBJECT DeviceObject
,
25 IN PMOUSE_INPUT_DATA InputDataStart
,
26 IN PMOUSE_INPUT_DATA InputDataEnd
,
27 IN OUT PULONG InputDataConsumed
30 typedef struct _CONNECT_DATA
{
31 PDEVICE_OBJECT ClassDeviceObject
;
33 } CONNECT_DATA
, *PCONNECT_DATA
;
35 #define IOCTL_INTERNAL_KEYBOARD_CONNECT \
36 CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0080, METHOD_NEITHER, FILE_ANY_ACCESS)
38 #define IOCTL_INTERNAL_MOUSE_CONNECT \
39 CTL_CODE(FILE_DEVICE_MOUSE, 0x0080, METHOD_NEITHER, FILE_ANY_ACCESS)
41 /* For some bizarre reason, these are different from the defines in
42 * w32api. I'm quite sure these are correct though, needs to be checked
45 #define KEYBOARD_SCROLL_LOCK_ON 0x01
46 #define KEYBOARD_NUM_LOCK_ON 0x02
47 #define KEYBOARD_CAPS_LOCK_ON 0x04
49 /*-----------------------------------------------------
51 * --------------------------------------------------*/
52 typedef struct _COMMAND_CONTEXT
66 } COMMAND_CONTEXT
, *PCOMMAND_CONTEXT
;
68 typedef enum _MOUSE_TIMEOUT_STATE
73 } MOUSE_TIMEOUT_STATE
, *PMOUSE_TIMEOUT_STATE
;
75 /* TODO: part of this should be in the _ATTRIBUTES structs instead */
76 typedef struct _I8042_SETTINGS
78 DWORD Headless
; /* done */
80 DWORD CrashSysRq
; /* done */
81 DWORD ReportResetErrors
;
82 DWORD PollStatusIterations
; /* done */
83 DWORD ResendIterations
; /* done */
84 DWORD PollingIterations
;
85 DWORD PollingIterationsMaximum
;
86 DWORD OverrideKeyboardType
;
87 DWORD OverrideKeyboardSubtype
;
88 DWORD MouseResendStallTime
;
89 DWORD MouseSynchIn100ns
;
90 DWORD MouseResolution
;
91 DWORD NumberOfButtons
;
92 DWORD EnableWheelDetection
;
93 } I8042_SETTINGS
, *PI8042_SETTINGS
;
95 typedef enum _I8042_MOUSE_TYPE
101 } I8042_MOUSE_TYPE
, *PI8042_MOUSE_TYPE
;
103 typedef enum _I8042_DEVICE_TYPE
107 } I8042_DEVICE_TYPE
, *PI8042_DEVICE_TYPE
;
109 typedef struct _I8042_DEVICE
111 LIST_ENTRY ListEntry
;
113 } I8042_DEVICE
, *PI8042_DEVICE
;
115 typedef struct _DEVICE_EXTENSION
117 PDEVICE_OBJECT KeyboardObject
;
118 PDEVICE_OBJECT MouseObject
;
120 CONNECT_DATA KeyboardData
;
121 CONNECT_DATA MouseData
;
123 BOOLEAN KeyboardExists
;
124 BOOLEAN KeyboardIsAT
;
127 BOOLEAN KeyboardClaimed
;
128 BOOLEAN MouseClaimed
;
131 LIST_ENTRY BusDevices
;
133 INTERNAL_I8042_START_INFORMATION KeyboardStartInformation
;
134 INTERNAL_I8042_START_INFORMATION MouseStartInformation
;
136 INTERNAL_I8042_HOOK_KEYBOARD KeyboardHook
;
137 INTERNAL_I8042_HOOK_MOUSE MouseHook
;
139 PKINTERRUPT KeyboardInterruptObject
;
140 PKINTERRUPT MouseInterruptObject
;
141 PKINTERRUPT HighestDIRQLInterrupt
;
146 KTIMER TimerMouseTimeout
;
147 KDPC DpcMouseTimeout
;
148 MOUSE_TIMEOUT_STATE MouseTimeoutState
;
149 BOOLEAN MouseTimeoutActive
;
151 KEYBOARD_ATTRIBUTES KeyboardAttributes
;
152 KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators
;
153 KEYBOARD_TYPEMATIC_PARAMETERS KeyboardTypematic
;
159 KEYBOARD_SCAN_STATE KeyboardScanState
;
161 KEYBOARD_INPUT_DATA
*KeyboardBuffer
;
164 MOUSE_ATTRIBUTES MouseAttributes
;
166 MOUSE_STATE MouseState
;
167 BOOLEAN MouseComplete
;
168 MOUSE_RESET_SUBSTATE MouseResetState
;
169 MOUSE_INPUT_DATA
*MouseBuffer
;
171 USHORT MouseButtonState
;
173 UCHAR MouseLogiBuffer
[3];
174 UCHAR MouseLogitechID
;
175 I8042_MOUSE_TYPE MouseType
;
177 OUTPUT_PACKET Packet
;
179 BOOLEAN PacketComplete
;
180 NTSTATUS PacketResult
;
181 UCHAR PacketBuffer
[16];
185 PDEVICE_OBJECT CurrentIrpDevice
;
187 /* registry config values */
188 I8042_SETTINGS Settings
;
193 PIO_WORKITEM DebugWorkItem
;
194 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
;
196 typedef struct _FDO_DEVICE_EXTENSION
198 PDEVICE_EXTENSION PortDevExt
;
199 I8042_DEVICE_TYPE Type
;
200 PDEVICE_OBJECT DeviceObject
;
202 LIST_ENTRY BusDevices
;
203 } FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
205 typedef struct _I8042_HOOK_WORKITEM
207 PIO_WORKITEM WorkItem
;
208 PDEVICE_OBJECT Target
;
210 } I8042_HOOK_WORKITEM
, *PI8042_HOOK_WORKITEM
;
215 #define TAG_I8042 TAG('8', '0', '4', '2')
217 #define KBD_WRAP_MASK 0x1F
219 #define disable() __asm__("cli\n\t")
220 #define enable() __asm__("sti\n\t")
222 #define ALT_PRESSED (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)
223 #define CTRL_PRESSED (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)
227 * Keyboard controller ports
230 #define I8042_DATA_PORT 0x60
231 #define I8042_CTRL_PORT 0x64
235 * Controller commands
238 #define KBD_READ_MODE 0x20
239 #define KBD_WRITE_MODE 0x60
240 #define KBD_SELF_TEST 0xAA
241 #define KBD_LINE_TEST 0xAB
242 #define KBD_CTRL_ENABLE 0xAE
244 #define MOUSE_LINE_TEST 0xA9
245 #define MOUSE_CTRL_ENABLE 0xA8
247 #define KBD_READ_OUTPUT_PORT 0xD0
248 #define KBD_WRITE_OUTPUT_PORT 0xD1
254 #define KBD_SET_LEDS 0xED
255 #define KBD_GET_ID 0xF2
256 #define KBD_ENABLE 0xF4
257 #define KBD_DISABLE 0xF5
258 #define KBD_RESET 0xFF
265 #define KBD_BATCC 0xAA
267 #define KBD_NACK 0xFC
268 #define KBD_RESEND 0xFE
271 * Controller status register bits
278 #define KBD_PERR 0x80
285 #define KBD_LED_SCROLL 0x01
286 #define KBD_LED_NUM 0x02
287 #define KBD_LED_CAPS 0x04
292 #define MOUSE_ACK 0xFA
293 #define MOUSE_ERROR 0xFC
294 #define MOUSE_NACK 0xFE
297 NTSTATUS
I8042ReadData(BYTE
*Data
);
299 NTSTATUS
I8042ReadStatus(BYTE
*Status
);
301 NTSTATUS
I8042ReadDataWait(PDEVICE_EXTENSION DevExt
, BYTE
*Data
);
305 VOID STDCALL
I8042IsrWritePort(PDEVICE_EXTENSION DevExt
,
309 NTSTATUS STDCALL
I8042SynchWritePort(PDEVICE_EXTENSION DevExt
,
314 NTSTATUS STDCALL
I8042StartPacket(PDEVICE_EXTENSION DevExt
,
315 PDEVICE_OBJECT Device
,
320 BOOLEAN STDCALL
I8042PacketIsr(PDEVICE_EXTENSION DevExt
,
323 VOID
I8042PacketDpc(PDEVICE_EXTENSION DevExt
);
325 VOID STDCALL
I8042SendHookWorkItem(PDEVICE_OBJECT DeviceObject
,
328 BOOLEAN
I8042Write(PDEVICE_EXTENSION DevExt
, int addr
, BYTE data
);
331 VOID STDCALL
I8042IsrWritePortKbd(PVOID Context
,
334 NTSTATUS STDCALL
I8042SynchWritePortKbd(PVOID Context
,
338 BOOLEAN STDCALL
I8042InterruptServiceKbd(struct _KINTERRUPT
*Interrupt
,
341 VOID STDCALL
I8042DpcRoutineKbd(PKDPC Dpc
,
342 PVOID DeferredContext
,
343 PVOID SystemArgument1
,
344 PVOID SystemArgument2
);
346 BOOLEAN STDCALL
I8042StartIoKbd(PDEVICE_OBJECT DeviceObject
, PIRP Irp
);
348 NTSTATUS STDCALL
I8042InternalDeviceControlKbd(PDEVICE_OBJECT DeviceObject
,
351 BOOLEAN STDCALL
I8042KeyboardEnable(PDEVICE_EXTENSION DevExt
);
353 BOOLEAN STDCALL
I8042KeyboardEnableInterrupt(PDEVICE_EXTENSION DevExt
);
355 BOOLEAN STDCALL
I8042DetectKeyboard(PDEVICE_EXTENSION DevExt
);
358 VOID STDCALL
I8042ReadRegistry(PDRIVER_OBJECT DriverObject
,
359 PDEVICE_EXTENSION DevExt
);
362 VOID STDCALL
I8042DpcRoutineMouse(PKDPC Dpc
,
363 PVOID DeferredContext
,
364 PVOID SystemArgument1
,
365 PVOID SystemArgument2
);
367 VOID STDCALL
I8042DpcRoutineMouseTimeout(PKDPC Dpc
,
368 PVOID DeferredContext
,
369 PVOID SystemArgument1
,
370 PVOID SystemArgument2
);
372 BOOLEAN STDCALL
I8042InterruptServiceMouse(struct _KINTERRUPT
*Interrupt
,
375 NTSTATUS STDCALL
I8042InternalDeviceControlMouse(PDEVICE_OBJECT DeviceObject
,
378 VOID STDCALL
I8042QueueMousePacket(PVOID Context
);
380 VOID STDCALL
I8042MouseHandleButtons(PDEVICE_EXTENSION DevExt
,
383 VOID STDCALL
I8042MouseHandle(PDEVICE_EXTENSION DevExt
,
386 BOOLEAN STDCALL
I8042MouseEnable(PDEVICE_EXTENSION DevExt
);
387 BOOLEAN STDCALL
I8042MouseDisable(PDEVICE_EXTENSION DevExt
);
390 VOID
I8042MouseHandlePs2pp(PDEVICE_EXTENSION DevExt
, BYTE Input
);
392 #endif // _KEYBOARD_H_