Annotation of ntddk/src/input/i8042prt/i8042prt.h, revision 1.1.1.1

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_

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.