|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1990, 1991, 1992, 1993 Microsoft Corporation
4:
5: Module Name:
6:
7: i8042prt.h
8:
9: Abstract:
10:
11: These are the structures and defines that are used in the
12: Intel i8042 port driver.
13:
14: Revision History:
15:
16: --*/
17:
18: #ifndef _I8042PRT_
19: #define _I8042PRT_
20:
21: #include <ntddkbd.h>
22: #include <ntddmou.h>
23: #include "kbdmou.h"
24: #include "i8042cfg.h"
25:
26: //
27: // Define the timer values.
28: //
29:
30: #define I8042_ASYNC_NO_TIMEOUT -1
31: #define I8042_ASYNC_TIMEOUT 3
32:
33: //
34: // Define the default number of entries in the input data queue.
35: //
36:
37: #define DATA_QUEUE_SIZE 100
38:
39: //
40: // Define the default stall value.
41: //
42:
43: #define I8042_STALL_DEFAULT 50
44:
45: //
46: // Define the default "sync time" used to determine when the start
47: // of a new mouse data packet is expected. The value is in units
48: // of 100 nanoseconds.
49: //
50:
51: #define MOUSE_SYNCH_PACKET_100NS 10000000UL // 1 second, in 100 ns units
52:
53: //
54: // Define booleans.
55: //
56:
57: #define WAIT_FOR_ACKNOWLEDGE TRUE
58: #define NO_WAIT_FOR_ACKNOWLEDGE FALSE
59: #define AND_OPERATION TRUE
60: #define OR_OPERATION FALSE
61: #define ENABLE_OPERATION TRUE
62: #define DISABLE_OPERATION FALSE
63:
64: //
65: // Default keyboard scan code mode.
66: //
67:
68: #define KEYBOARD_SCAN_CODE_SET 0x01
69:
70: //
71: // Default number of function keys, number of LED indicators, and total
72: // number of keys located on the known types of keyboard.
73: //
74:
75: #define NUM_KNOWN_KEYBOARD_TYPES 4
76: #define KEYBOARD_TYPE_DEFAULT 4
77: #define KEYBOARD_INDICATORS_DEFAULT 0
78:
79: typedef struct _KEYBOARD_TYPE_INFORMATION {
80: USHORT NumberOfFunctionKeys;
81: USHORT NumberOfIndicators;
82: USHORT NumberOfKeysTotal;
83: } KEYBOARD_TYPE_INFORMATION, *PKEYBOARD_TYPE_INFORMATION;
84:
85: static const
86: KEYBOARD_TYPE_INFORMATION KeyboardTypeInformation[NUM_KNOWN_KEYBOARD_TYPES] = {
87: {10, 3, 84}, // PC/XT 83- 84-key keyboard (and compatibles)
88: {12, 3, 102}, // Olivetti M24 102-key keyboard (and compatibles)
89: {10, 3, 84}, // All AT type keyboards (84-86 keys)
90: {12, 3, 101} // Enhanced 101- or 102-key keyboards (and compatibles)
91: };
92:
93: //
94: // Minimum, maximum, and default values for keyboard typematic rate and delay.
95: //
96:
97: #define KEYBOARD_TYPEMATIC_RATE_MINIMUM 2
98: #define KEYBOARD_TYPEMATIC_RATE_MAXIMUM 30
99: #define KEYBOARD_TYPEMATIC_RATE_DEFAULT 30
100: #define KEYBOARD_TYPEMATIC_DELAY_MINIMUM 250
101: #define KEYBOARD_TYPEMATIC_DELAY_MAXIMUM 1000
102: #define KEYBOARD_TYPEMATIC_DELAY_DEFAULT 250
103:
104: //
105: // Define the 8042 mouse status bits.
106: //
107:
108: #define LEFT_BUTTON_DOWN 0x01
109: #define RIGHT_BUTTON_DOWN 0x02
110: #define MIDDLE_BUTTON_DOWN 0x04
111: #define X_DATA_SIGN 0x10
112: #define Y_DATA_SIGN 0x20
113: #define X_OVERFLOW 0x40
114: #define Y_OVERFLOW 0x80
115:
116: #define MOUSE_SIGN_OVERFLOW_MASK (X_DATA_SIGN | Y_DATA_SIGN | X_OVERFLOW | Y_OVERFLOW)
117:
118: //
119: // Define the maximum positive and negative values for mouse motion.
120: //
121:
122: #define MOUSE_MAXIMUM_POSITIVE_DELTA 0x000000FF
123: #define MOUSE_MAXIMUM_NEGATIVE_DELTA 0xFFFFFF00
124:
125: //
126: // Default number of buttons and sample rate for the i8042 mouse.
127: //
128:
129: #define MOUSE_NUMBER_OF_BUTTONS 2
130: #define MOUSE_SAMPLE_RATE 60
131:
132: //
133: // Define the mouse resolution specifier. Note that (2**MOUSE_RESOLUTION)
134: // specifies counts-per-millimeter. Counts-per-centimeter is
135: // (counts-per-millimeter * 10).
136: //
137:
138: #define MOUSE_RESOLUTION 3
139:
140: //
141: // Defines for DeviceExtension->HardwarePresent.
142: //
143:
144: #define KEYBOARD_HARDWARE_PRESENT 1
145: #define MOUSE_HARDWARE_PRESENT 2
146: #define BALLPOINT_HARDWARE_PRESENT 4
147:
148: //
149: // Define macros for performing I/O on the 8042 command/status and data
150: // registers.
151: //
152:
153: #define I8X_PUT_COMMAND_BYTE(Address, Byte) \
154: WRITE_PORT_UCHAR(Address, (UCHAR) Byte)
155: #define I8X_PUT_DATA_BYTE(Address, Byte) \
156: WRITE_PORT_UCHAR(Address, (UCHAR) Byte)
157: #define I8X_GET_STATUS_BYTE(Address) \
158: READ_PORT_UCHAR(Address)
159: #define I8X_GET_DATA_BYTE(Address) \
160: READ_PORT_UCHAR(Address)
161:
162: //
163: // Define commands to the 8042 controller.
164: //
165:
166: #define I8042_READ_CONTROLLER_COMMAND_BYTE 0x20
167: #define I8042_WRITE_CONTROLLER_COMMAND_BYTE 0x60
168: #define I8042_DISABLE_MOUSE_DEVICE 0xA7
169: #define I8042_ENABLE_MOUSE_DEVICE 0xA8
170: #define I8042_AUXILIARY_DEVICE_TEST 0xA9
171: #define I8042_KEYBOARD_DEVICE_TEST 0xAB
172: #define I8042_DISABLE_KEYBOARD_DEVICE 0xAD
173: #define I8042_ENABLE_KEYBOARD_DEVICE 0xAE
174: #define I8042_WRITE_TO_AUXILIARY_DEVICE 0xD4
175:
176: //
177: // Define the 8042 Controller Command Byte.
178: //
179:
180: #define CCB_ENABLE_KEYBOARD_INTERRUPT 0x01
181: #define CCB_ENABLE_MOUSE_INTERRUPT 0x02
182: #define CCB_DISABLE_KEYBOARD_DEVICE 0x10
183: #define CCB_DISABLE_MOUSE_DEVICE 0x20
184: #define CCB_KEYBOARD_TRANSLATE_MODE 0x40
185:
186:
187: //
188: // Define the 8042 Controller Status Register bits.
189: //
190:
191: #define OUTPUT_BUFFER_FULL 0x01
192: #define INPUT_BUFFER_FULL 0x02
193: #define MOUSE_OUTPUT_BUFFER_FULL 0x20
194:
195: //
196: // Define the 8042 responses.
197: //
198:
199: #define ACKNOWLEDGE 0xFA
200: #define RESEND 0xFE
201:
202: //
203: // Define commands to the keyboard (through the 8042 data port).
204: //
205:
206: #define SET_KEYBOARD_INDICATORS 0xED
207: #define SELECT_SCAN_CODE_SET 0xF0
208: #define READ_KEYBOARD_ID 0xF2
209: #define SET_KEYBOARD_TYPEMATIC 0xF3
210: #define SET_ALL_TYPEMATIC_MAKE_BREAK 0xFA
211: #define KEYBOARD_RESET 0xFF
212:
213: //
214: // Define the keyboard responses.
215: //
216:
217: #define KEYBOARD_COMPLETE_SUCCESS 0xAA
218: #define KEYBOARD_COMPLETE_FAILURE 0xFC
219: #define KEYBOARD_BREAK_CODE 0xF0
220: #define KEYBOARD_DEBUG_HOTKEY_ENH 0x37 // SysReq scan code for Enhanced Keyboard
221: #define KEYBOARD_DEBUG_HOTKEY_AT 0x54 // SysReq scan code for 84-key Keyboard
222:
223: //
224: // Define commands to the mouse (through the 8042 data port).
225: //
226:
227: #define SET_MOUSE_RESOLUTION 0xE8
228: #define SET_MOUSE_SAMPLING_RATE 0xF3
229: #define MOUSE_RESET 0xFF
230: #define ENABLE_MOUSE_TRANSMISSION 0xF4
231:
232: //
233: // Define the mouse responses.
234: //
235:
236: #define MOUSE_COMPLETE 0xAA
237: #define MOUSE_ID_BYTE 0x00
238:
239: //
240: // Define the i8042 controller input/output ports.
241: //
242:
243: typedef enum _I8042_IO_PORT_TYPE {
244: DataPort = 0,
245: CommandPort,
246: MaximumPortCount
247:
248: } I8042_IO_PORT_TYPE;
249:
250: //
251: // Define the device types attached to the i8042 controller.
252: //
253:
254: typedef enum _I8042_DEVICE_TYPE {
255: ControllerDeviceType,
256: KeyboardDeviceType,
257: MouseDeviceType,
258: UndefinedDeviceType
259: } I8042_DEVICE_TYPE;
260:
261: //
262: // Define the keyboard output states.
263: //
264:
265: typedef enum _KEYBOARD_STATE {
266: Idle,
267: SendFirstByte,
268: SendLastByte
269: } KEYBOARD_STATE;
270:
271: //
272: // Define the keyboard scan code input states.
273: //
274:
275: typedef enum _KEYBOARD_SCAN_STATE {
276: Normal,
277: GotE0,
278: GotE1
279: } KEYBOARD_SCAN_STATE;
280:
281: //
282: // Define the mouse states.
283: //
284:
285: typedef enum _MOUSE_STATE {
286: MouseIdle,
287: XMovement,
288: YMovement,
289: MouseExpectingACK
290: } MOUSE_STATE;
291:
292: //
293: // Define the keyboard set request packet.
294: //
295:
296: typedef struct _KEYBOARD_SET_PACKET {
297: USHORT State;
298: UCHAR FirstByte;
299: UCHAR LastByte;
300: } KEYBOARD_SET_PACKET, *PKEYBOARD_SET_PACKET;
301:
302: //
303: // Intel i8042 configuration information.
304: //
305:
306: typedef struct _I8042_CONFIGURATION_INFORMATION {
307:
308: //
309: // Bus interface type.
310: //
311:
312: INTERFACE_TYPE InterfaceType;
313:
314: //
315: // Bus Number.
316: //
317:
318: ULONG BusNumber;
319:
320: //
321: // The port/register resources used by this device.
322: //
323:
324: CM_PARTIAL_RESOURCE_DESCRIPTOR PortList[MaximumPortCount];
325: ULONG PortListCount;
326:
327: //
328: // Keyboard interrupt resources.
329: //
330:
331: CM_PARTIAL_RESOURCE_DESCRIPTOR KeyboardInterrupt;
332:
333: //
334: // Mouse interrupt resources.
335: //
336:
337: CM_PARTIAL_RESOURCE_DESCRIPTOR MouseInterrupt;
338:
339: //
340: // Flag that indicates whether floating point context should be saved.
341: //
342:
343: BOOLEAN FloatingSave;
344:
345: //
346: // Number of retries allowed.
347: //
348:
349: USHORT ResendIterations;
350:
351: //
352: // Number of polling iterations allowed.
353: //
354:
355: USHORT PollingIterations;
356:
357: //
358: // Maximum number of polling iterations allowed.
359: //
360:
361: USHORT PollingIterationsMaximum;
362:
363: //
364: // Maximum number of times to check the Status register in
365: // the ISR before deciding the interrupt is spurious.
366: //
367:
368: USHORT PollStatusIterations;
369:
370: //
371: // Microseconds to stall in KeStallExecutionProcessor calls.
372: //
373:
374: USHORT StallMicroseconds;
375:
376: //
377: // Keyboard attributes.
378: //
379:
380: KEYBOARD_ATTRIBUTES KeyboardAttributes;
381:
382: //
383: // Initial values of keyboard typematic rate and delay.
384: //
385:
386: KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatCurrent;
387:
388: //
389: // Current indicator (LED) setting.
390: //
391:
392: KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators;
393:
394: //
395: // Mouse attributes.
396: //
397:
398: MOUSE_ATTRIBUTES MouseAttributes;
399:
400: USHORT MouseResolution;
401:
402: } I8042_CONFIGURATION_INFORMATION, *PI8042_CONFIGURATION_INFORMATION;
403:
404: //
405: // Define the keyboard portion of the port device extension.
406: //
407:
408: typedef struct _PORT_KEYBOARD_EXTENSION {
409:
410: //
411: // Keyboard class connection data.
412: //
413:
414: CONNECT_DATA ConnectData;
415:
416: //
417: // Number of input data items currently in the keyboard InputData queue.
418: //
419:
420: ULONG InputCount;
421:
422: //
423: // Start of the port keyboard input data queue (really a circular buffer).
424: //
425:
426: PKEYBOARD_INPUT_DATA InputData;
427:
428: //
429: // Insertion pointer for keyboard InputData.
430: //
431:
432: PKEYBOARD_INPUT_DATA DataIn;
433:
434: //
435: // Removal pointer for keyboard InputData.
436: //
437:
438: PKEYBOARD_INPUT_DATA DataOut;
439:
440: //
441: // Points one input packet past the end of the InputData buffer.
442: //
443:
444: PKEYBOARD_INPUT_DATA DataEnd;
445:
446: //
447: // Current keyboard input packet.
448: //
449:
450: KEYBOARD_INPUT_DATA CurrentInput;
451:
452: //
453: // Current keyboard scan input state.
454: //
455:
456: KEYBOARD_SCAN_STATE CurrentScanState;
457:
458: //
459: // Current keyboard output packet (for set requests).
460: //
461:
462: KEYBOARD_SET_PACKET CurrentOutput;
463:
464: //
465: // Current resend count.
466: //
467:
468: USHORT ResendCount;
469:
470: //
471: // Request sequence number (used for error logging).
472: //
473:
474: ULONG SequenceNumber;
475:
476: //
477: // Timer used to retry the ISR DPC routine when the class
478: // driver is unable to consume all the port driver's data.
479: //
480:
481: KTIMER DataConsumptionTimer;
482:
483: //
484: // Indicates which keyboard port device this driver created (UnitId
485: // is the suffix appended to the keyboard port basename for the
486: // call to IoCreateDevice).
487: //
488:
489: USHORT UnitId;
490:
491: //
492: // Indicates whether it is okay to log overflow errors.
493: //
494:
495: BOOLEAN OkayToLogOverflow;
496:
497: } PORT_KEYBOARD_EXTENSION, *PPORT_KEYBOARD_EXTENSION;
498:
499: //
500: // Define the mouse portion of the port device extension.
501: //
502:
503: typedef struct _PORT_MOUSE_EXTENSION {
504:
505: //
506: // Mouse class connection data.
507: //
508:
509: CONNECT_DATA ConnectData;
510:
511: //
512: // Number of input data items currently in the mouse InputData queue.
513: //
514:
515: ULONG InputCount;
516:
517: //
518: // Start of the port mouse input data queue (really a circular buffer).
519: //
520:
521: PMOUSE_INPUT_DATA InputData;
522:
523: //
524: // Insertion pointer for mouse InputData.
525: //
526:
527: PMOUSE_INPUT_DATA DataIn;
528:
529: //
530: // Removal pointer for mouse InputData.
531: //
532:
533: PMOUSE_INPUT_DATA DataOut;
534:
535: //
536: // Points one input packet past the end of the InputData buffer.
537: //
538:
539: PMOUSE_INPUT_DATA DataEnd;
540:
541: //
542: // Current mouse input packet.
543: //
544:
545: MOUSE_INPUT_DATA CurrentInput;
546:
547: //
548: // Current mouse input state.
549: //
550:
551: USHORT InputState;
552:
553: //
554: // Current mouse sign and overflow data.
555: //
556:
557: UCHAR CurrentSignAndOverflow;
558:
559: //
560: // Previous mouse sign and overflow data.
561: //
562:
563: UCHAR PreviousSignAndOverflow;
564:
565: //
566: // Previous mouse button data.
567: //
568:
569: UCHAR PreviousButtons;
570:
571: //
572: // Request sequence number (used for error logging).
573: //
574:
575: ULONG SequenceNumber;
576:
577: //
578: // Timer used to retry the ISR DPC routine when the class
579: // driver is unable to consume all the port driver's data.
580: //
581:
582: KTIMER DataConsumptionTimer;
583:
584: //
585: // The tick count (since system boot) at which the mouse last interrupted.
586: // Retrieved via KeQueryTickCount. Used to determine whether a byte of
587: // the mouse data packet has been lost. Allows the driver to synch
588: // up with the true mouse input state.
589: //
590:
591: LARGE_INTEGER PreviousTick;
592:
593: //
594: // Indicates which pointer port device this driver created (UnitId
595: // is the suffix appended to the pointer port basename for the
596: // call to IoCreateDevice).
597: //
598:
599: USHORT UnitId;
600:
601: //
602: // Indicates whether it is okay to log overflow errors.
603: //
604:
605: BOOLEAN OkayToLogOverflow;
606:
607: //
608: // Number of interval timer ticks to wait before deciding that the
609: // next mouse interrupt is for the start of a new packet. Used to
610: // synch up again if a byte of the mouse packet gets lost.
611: //
612:
613: ULONG SynchTickCount;
614:
615: } PORT_MOUSE_EXTENSION, *PPORT_MOUSE_EXTENSION;
616:
617: //
618: // Port device extension.
619: //
620:
621: typedef struct _DEVICE_EXTENSION {
622:
623: //
624: // Indicate which hardware is actually present (keyboard and/or mouse).
625: //
626:
627: ULONG HardwarePresent;
628:
629: //
630: // Reference count for number of keyboard enables.
631: //
632:
633: LONG KeyboardEnableCount;
634:
635: //
636: // Reference count for number of mouse enables.
637: //
638:
639: LONG MouseEnableCount;
640:
641: //
642: // Pointer to the device object.
643: //
644:
645: PDEVICE_OBJECT DeviceObject;
646:
647: //
648: // The mapped addresses for this device's registers.
649: //
650:
651: PUCHAR DeviceRegisters[MaximumPortCount];
652:
653: //
654: // Keyboard-specific port connection data.
655: //
656:
657: PORT_KEYBOARD_EXTENSION KeyboardExtension;
658:
659: //
660: // Mouse-specific port connection data.
661: //
662:
663: PORT_MOUSE_EXTENSION MouseExtension;
664:
665: //
666: // Port configuration information.
667: //
668:
669: I8042_CONFIGURATION_INFORMATION Configuration;
670:
671: //
672: // i8042 keyboard and mouse interrupt objects.
673: //
674:
675: PKINTERRUPT KeyboardInterruptObject;
676: PKINTERRUPT MouseInterruptObject;
677: KSPIN_LOCK SharedInterruptSpinLock;
678:
679: //
680: // DPC queue for completion of requests that fail by exceeding
681: // the maximum number of retries.
682: //
683:
684: KDPC RetriesExceededDpc;
685:
686: //
687: // DPC queue for logging overrun and internal driver errors.
688: //
689:
690: KDPC ErrorLogDpc;
691:
692: //
693: // Keyboard ISR DPC queue.
694: //
695:
696: KDPC KeyboardIsrDpc;
697:
698: //
699: // Keyboard ISR DPC recall queue.
700: //
701:
702: KDPC KeyboardIsrDpcRetry;
703:
704: //
705: // Used by the ISR and the ISR DPC (in I8xDpcVariableOperation calls)
706: // to control processing by the ISR DPC.
707: //
708:
709: LONG DpcInterlockKeyboard;
710:
711: //
712: // Mouse ISR DPC queue.
713: //
714:
715: KDPC MouseIsrDpc;
716:
717: //
718: // Mouse ISR DPC recall queue.
719: //
720:
721: KDPC MouseIsrDpcRetry;
722:
723: //
724: // Used by the ISR and the ISR DPC (in I8xDpcVariableOperation calls)
725: // to control processing by the ISR DPC.
726: //
727:
728: LONG DpcInterlockMouse;
729:
730: //
731: // DPC queue for command timeouts.
732: //
733:
734: KDPC TimeOutDpc;
735:
736: //
737: // Timer used to timeout i8042 commands.
738: //
739:
740: KTIMER CommandTimer;
741:
742: //
743: // Timer count used by the command time out routine.
744: //
745:
746: LONG TimerCount;
747:
748: //
749: // Set at intialization to indicate that the register
750: // addresses must be unmapped when the driver is unloaded.
751: //
752:
753: BOOLEAN UnmapRegistersRequired;
754:
755: } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
756:
757: //
758: // Define the port InitializeDataQueue context structure.
759: //
760:
761: typedef struct _I8042_INITIALIZE_DATA_CONTEXT {
762: IN PDEVICE_EXTENSION DeviceExtension;
763: IN CCHAR DeviceType;
764: } I8042_INITIALIZE_DATA_CONTEXT, *PI8042_INITIALIZE_DATA_CONTEXT;
765:
766: //
767: // Define the port TransmitControllerCommandByte context structure.
768: //
769:
770: typedef struct _I8042_TRANSMIT_CCB_CONTEXT {
771: IN ULONG HardwareDisableEnableMask;
772: IN BOOLEAN AndOperation;
773: IN UCHAR ByteMask;
774: OUT NTSTATUS Status;
775: } I8042_TRANSMIT_CCB_CONTEXT, *PI8042_TRANSMIT_CCB_CONTEXT;
776:
777: //
778: // Define the port DeviceEnableDisable context structure.
779: //
780:
781: typedef struct _I8042_DEVICE_ENABLE_DISABLE_CONTEXT {
782: IN PDEVICE_EXTENSION DeviceExtension;
783: IN ULONG EnableMask;
784: IN BOOLEAN AndOperation;
785: OUT NTSTATUS Status;
786: } I8042_DEVICE_ENABLE_DISABLE_CONTEXT,
787: *PI8042_DEVICE_ENABLE_DISABLE_CONTEXT;
788:
789: //
790: // Define the port Get/SetDataQueuePointer context structures.
791: //
792:
793: typedef struct _GET_DATA_POINTER_CONTEXT {
794: IN PDEVICE_EXTENSION DeviceExtension;
795: IN CCHAR DeviceType;
796: OUT PVOID DataIn;
797: OUT PVOID DataOut;
798: OUT ULONG InputCount;
799: } GET_DATA_POINTER_CONTEXT, *PGET_DATA_POINTER_CONTEXT;
800:
801: typedef struct _SET_DATA_POINTER_CONTEXT {
802: IN PDEVICE_EXTENSION DeviceExtension;
803: IN CCHAR DeviceType;
804: IN ULONG InputCount;
805: IN PVOID DataOut;
806: } SET_DATA_POINTER_CONTEXT, *PSET_DATA_POINTER_CONTEXT;
807:
808: //
809: // Define the port timer context structure.
810: //
811:
812: typedef struct _TIMER_CONTEXT {
813: IN PDEVICE_OBJECT DeviceObject;
814: IN PLONG TimerCounter;
815: OUT LONG NewTimerCount;
816: } TIMER_CONTEXT, *PTIMER_CONTEXT;
817:
818: //
819: // Define the port KeyboardInitiate context structure.
820: //
821:
822: typedef struct _KEYBOARD_INITIATE_CONTEXT {
823: IN PDEVICE_OBJECT DeviceObject;
824: IN UCHAR FirstByte;
825: IN UCHAR LastByte;
826: } KEYBOARD_INITIATE_CONTEXT, *PKEYBOARD_INITIATE_CONTEXT;
827:
828: //
829: // Statically allocate the (known) scancode-to-indicator-light mapping.
830: // This information is returned by the
831: // IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION device control request.
832: //
833:
834: #define KEYBOARD_NUMBER_OF_INDICATORS 3
835:
836: static const INDICATOR_LIST IndicatorList[KEYBOARD_NUMBER_OF_INDICATORS] = {
837: {0x3A, KEYBOARD_CAPS_LOCK_ON},
838: {0x45, KEYBOARD_NUM_LOCK_ON},
839: {0x46, KEYBOARD_SCROLL_LOCK_ON}};
840:
841: //
842: // Define the context structure and operations for I8xDpcVariableOperation.
843: //
844:
845: typedef enum _OPERATION_TYPE {
846: IncrementOperation,
847: DecrementOperation,
848: WriteOperation,
849: ReadOperation
850: } OPERATION_TYPE;
851:
852: typedef struct _VARIABLE_OPERATION_CONTEXT {
853: IN PLONG VariableAddress;
854: IN OPERATION_TYPE Operation;
855: IN OUT PLONG NewValue;
856: } VARIABLE_OPERATION_CONTEXT, *PVARIABLE_OPERATION_CONTEXT;
857:
858: //
859: // Function prototypes.
860: //
861:
862:
863: NTSTATUS
864: DriverEntry(
865: IN PDRIVER_OBJECT DriverObject,
866: IN PUNICODE_STRING RegistryPath
867: );
868:
869: VOID
870: I8042CompletionDpc(
871: IN PKDPC Dpc,
872: IN PDEVICE_OBJECT DeviceObject,
873: IN PIRP Irp,
874: IN PVOID Context
875: );
876:
877: VOID
878: I8042ErrorLogDpc(
879: IN PKDPC Dpc,
880: IN PDEVICE_OBJECT DeviceObject,
881: IN PIRP Irp,
882: IN PVOID Context
883: );
884:
885: NTSTATUS
886: I8042Flush(
887: IN PDEVICE_OBJECT DeviceObject,
888: IN PIRP Irp
889: );
890:
891: NTSTATUS
892: I8042InternalDeviceControl(
893: IN PDEVICE_OBJECT DeviceObject,
894: IN PIRP Irp
895: );
896:
897: BOOLEAN
898: I8042KeyboardInterruptService(
899: IN PKINTERRUPT Interrupt,
900: IN PVOID Context
901: );
902:
903: VOID
904: I8042KeyboardIsrDpc(
905: IN PKDPC Dpc,
906: IN PDEVICE_OBJECT DeviceObject,
907: IN PIRP Irp,
908: IN PVOID Context
909: );
910:
911: BOOLEAN
912: I8042MouseInterruptService(
913: IN PKINTERRUPT Interrupt,
914: IN PVOID Context
915: );
916:
917: VOID
918: I8042MouseIsrDpc(
919: IN PKDPC Dpc,
920: IN PDEVICE_OBJECT DeviceObject,
921: IN PIRP Irp,
922: IN PVOID Context
923: );
924:
925: NTSTATUS
926: I8042OpenCloseDispatch(
927: IN PDEVICE_OBJECT DeviceObject,
928: IN PIRP Irp
929: );
930:
931: VOID
932: I8042RetriesExceededDpc(
933: IN PKDPC Dpc,
934: IN PDEVICE_OBJECT DeviceObject,
935: IN PIRP Irp,
936: IN PVOID Context
937: );
938:
939: VOID
940: I8042StartIo(
941: IN PDEVICE_OBJECT DeviceObject,
942: IN PIRP Irp
943: );
944:
945: VOID
946: I8042TimeOutDpc(
947: IN PKDPC Dpc,
948: IN PDEVICE_OBJECT DeviceObject,
949: IN PVOID SystemContext1,
950: IN PVOID SystemContext2
951: );
952:
953: VOID
954: I8042Unload(
955: IN PDRIVER_OBJECT DriverObject
956: );
957:
958: VOID
959: I8xBuildResourceList(
960: IN PDEVICE_EXTENSION DeviceExtension,
961: OUT PCM_RESOURCE_LIST *ResourceList,
962: OUT PULONG ResourceListSize
963: );
964:
965: UCHAR
966: I8xConvertTypematicParameters(
967: IN USHORT Rate,
968: IN USHORT Delay
969: );
970:
971: #if DBG
972:
973: VOID
974: I8xDebugPrint(
975: ULONG DebugPrintLevel,
976: PCCHAR DebugMessage,
977: ...
978: );
979:
980: extern ULONG i8042Debug;
981: #define I8xPrint(x) I8xDebugPrint x
982: #else
983: #define I8xPrint(x)
984: #endif
985:
986: VOID
987: I8xDecrementTimer(
988: IN PTIMER_CONTEXT Context
989: );
990:
991: VOID
992: I8xDeviceEnableDisable(
993: IN PVOID Context
994: );
995:
996: VOID
997: I8xDpcVariableOperation(
998: IN PVOID Context
999: );
1000:
1001: VOID
1002: I8xDrainOutputBuffer(
1003: IN PUCHAR DataAddress,
1004: IN PUCHAR CommandAddress
1005: );
1006:
1007: VOID
1008: I8xGetByteAsynchronous(
1009: IN CCHAR DeviceType,
1010: IN PDEVICE_EXTENSION DeviceExtension,
1011: OUT PUCHAR Byte
1012: );
1013:
1014: NTSTATUS
1015: I8xGetBytePolled(
1016: IN CCHAR DeviceType,
1017: IN PDEVICE_EXTENSION DeviceExtension,
1018: OUT PUCHAR Byte
1019: );
1020:
1021: NTSTATUS
1022: I8xGetControllerCommand(
1023: IN ULONG HardwareDisableEnableMask,
1024: IN PDEVICE_EXTENSION DeviceExtension,
1025: OUT PUCHAR Byte
1026: );
1027:
1028: VOID
1029: I8xGetDataQueuePointer(
1030: IN PVOID Context
1031: );
1032:
1033: VOID
1034: I8xInitializeDataQueue(
1035: IN PVOID Context
1036: );
1037:
1038: VOID
1039: I8xInitializeHardware(
1040: IN PDEVICE_OBJECT DeviceObject
1041: );
1042:
1043: NTSTATUS
1044: I8xInitializeKeyboard(
1045: IN PDEVICE_OBJECT DeviceObject
1046: );
1047:
1048: NTSTATUS
1049: I8xInitializeMouse(
1050: IN PDEVICE_OBJECT DeviceObject
1051: );
1052:
1053: VOID
1054: I8xKeyboardConfiguration(
1055: IN PDEVICE_EXTENSION DeviceExtension,
1056: IN PUNICODE_STRING RegistryPath,
1057: IN PUNICODE_STRING KeyboardDeviceName,
1058: IN PUNICODE_STRING PointerDeviceName
1059: );
1060:
1061: VOID
1062: I8xKeyboardInitiateIo(
1063: IN PVOID Context
1064: );
1065:
1066: VOID
1067: I8xKeyboardInitiateWrapper(
1068: IN PVOID Context
1069: );
1070:
1071: NTSTATUS
1072: I8xKeyboardPeripheralCallout(
1073: IN PVOID Context,
1074: IN PUNICODE_STRING PathName,
1075: IN INTERFACE_TYPE BusType,
1076: IN ULONG BusNumber,
1077: IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
1078: IN CONFIGURATION_TYPE ControllerType,
1079: IN ULONG ControllerNumber,
1080: IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
1081: IN CONFIGURATION_TYPE PeripheralType,
1082: IN ULONG PeripheralNumber,
1083: IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation
1084: );
1085:
1086: VOID
1087: I8xLogError(
1088: IN PDEVICE_OBJECT DeviceObject,
1089: IN NTSTATUS ErrorCode,
1090: IN ULONG UniqueErrorValue,
1091: IN NTSTATUS FinalStatus,
1092: IN PULONG DumpData,
1093: IN ULONG DumpCount
1094: );
1095:
1096: VOID
1097: I8xMouseConfiguration(
1098: IN PDEVICE_EXTENSION DeviceExtension,
1099: IN PUNICODE_STRING RegistryPath,
1100: IN PUNICODE_STRING KeyboardDeviceName,
1101: IN PUNICODE_STRING PointerDeviceName
1102: );
1103:
1104: NTSTATUS
1105: I8xMouseEnableTransmission(
1106: IN PDEVICE_OBJECT DeviceObject
1107: );
1108:
1109: NTSTATUS
1110: I8xMousePeripheralCallout(
1111: IN PVOID Context,
1112: IN PUNICODE_STRING PathName,
1113: IN INTERFACE_TYPE BusType,
1114: IN ULONG BusNumber,
1115: IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
1116: IN CONFIGURATION_TYPE ControllerType,
1117: IN ULONG ControllerNumber,
1118: IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
1119: IN CONFIGURATION_TYPE PeripheralType,
1120: IN ULONG PeripheralNumber,
1121: IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation
1122: );
1123:
1124: VOID
1125: I8xPutByteAsynchronous(
1126: IN CCHAR PortType,
1127: IN PDEVICE_EXTENSION DeviceExtension,
1128: IN UCHAR Byte
1129: );
1130:
1131: NTSTATUS
1132: I8xPutBytePolled(
1133: IN CCHAR PortType,
1134: IN BOOLEAN WaitForAcknowledge,
1135: IN CCHAR AckDeviceType,
1136: IN PDEVICE_EXTENSION DeviceExtension,
1137: IN UCHAR Byte
1138: );
1139:
1140: NTSTATUS
1141: I8xPutControllerCommand(
1142: IN PDEVICE_EXTENSION DeviceExtension,
1143: IN UCHAR Byte
1144: );
1145:
1146: VOID
1147: I8xServiceParameters(
1148: IN PDEVICE_EXTENSION DeviceExtension,
1149: IN PUNICODE_STRING RegistryPath,
1150: IN PUNICODE_STRING KeyboardDeviceName,
1151: IN PUNICODE_STRING PointerDeviceName
1152: );
1153:
1154: VOID
1155: I8xSetDataQueuePointer(
1156: IN PVOID Context
1157: );
1158:
1159: VOID
1160: I8xTransmitControllerCommand(
1161: IN PDEVICE_EXTENSION DeviceExtension,
1162: IN PVOID Context
1163: );
1164:
1165: BOOLEAN
1166: I8xWriteDataToKeyboardQueue(
1167: IN PPORT_KEYBOARD_EXTENSION KeyboardExtension,
1168: IN PKEYBOARD_INPUT_DATA InputData
1169: );
1170:
1171: BOOLEAN
1172: I8xWriteDataToMouseQueue(
1173: IN PPORT_MOUSE_EXTENSION MouseExtension,
1174: IN PMOUSE_INPUT_DATA InputData
1175: );
1176:
1177: #endif // _I8042PRT_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.