Annotation of XNU/iokit/IOKit/ps2/ApplePS2Device.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: 
                     23: #ifndef _APPLEPS2DEVICE_H
                     24: #define _APPLEPS2DEVICE_H
                     25: 
                     26: #include <IOKit/IOService.h>
                     27: 
                     28: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                     29: // Definitions
                     30: //
                     31: // Data Port (0x60) Commands.  These commands are all transmitted directly to
                     32: // the physical keyboard and/or mouse, so expect an acknowledge for each byte
                     33: // that you send through this port.
                     34: //
                     35: 
                     36: #define kDP_SetMouseScaling1To1        0xE6 // (mouse)
                     37: #define kDP_SetMouseScaling2To1        0xE7 // (mouse)
                     38: #define kDP_SetMouseResolution         0xE8 // (mouse)
                     39: #define kDP_GetMouseInformation        0xE9 // (mouse)
                     40: #define kDP_SetMouseStreamMode         0xEA // (mouse)
                     41: #define kDP_SetKeyboardLEDs            0xED // (keyboard)
                     42: #define kDP_TestKeyboardEcho           0xEE // (keyboard)
                     43: #define kDP_GetSetKeyboardASCs         0xF0 // (keyboard)
                     44: #define kDP_GetId                      0xF2 // (keyboard+mouse)
                     45: #define kDP_SetKeyboardTypematic       0xF3 // (keyboard)
                     46: #define kDP_SetMouseSampleRate         0xF3 // (mouse)
                     47: #define kDP_Enable                     0xF4 // (keyboard+mouse)
                     48: #define kDP_SetDefaultsAndDisable      0xF5 // (keyboard+mouse)
                     49: #define kDP_SetDefaults                0xF6 // (keyboard+mouse)
                     50: #define kDP_SetAllTypematic            0xF7 // (keyboard)
                     51: #define kDP_SetAllMakeRelease          0xF8 // (keyboard)
                     52: #define kDP_SetAllMakeOnly             0xF9 // (keyboard)
                     53: #define kDP_SetAllTypematicMakeRelease 0xFA // (keyboard)
                     54: #define kDP_SetKeyMakeRelease          0xFB // (keyboard)
                     55: #define kDP_SetKeyMakeOnly             0xFC // (keyboard)
                     56: #define kDP_Reset                      0xFF // (keyboard+mouse)
                     57: 
                     58: //
                     59: // Command Port (0x64) Commands.  These commands all access registers local
                     60: // to the motherboard, ie. nothing is transmitted,  thus these commands and
                     61: // any associated data passed thru the Data Port do not return acknowledges.
                     62: //
                     63: 
                     64: #define kCP_GetCommandByte             0x20 // (keyboard+mouse)
                     65: #define kCP_ReadControllerRAMBase      0x21 //
                     66: #define kCP_SetCommandByte             0x60 // (keyboard+mouse)
                     67: #define kCP_WriteControllerRAMBase     0x61 //
                     68: #define kCP_TestPassword               0xA4 //
                     69: #define kCP_GetPassword                0xA5 //
                     70: #define kCP_VerifyPassword             0xA6 //
                     71: #define kCP_DisableMouseClock          0xA7 // (mouse)
                     72: #define kCP_EnableMouseClock           0xA8 // (mouse)
                     73: #define kCP_TestMousePort              0xA9 //
                     74: #define kCP_TestController             0xAA //
                     75: #define kCP_TestKeyboardPort           0xAB //
                     76: #define kCP_GetControllerDiagnostic    0xAC //
                     77: #define kCP_DisableKeyboardClock       0xAD // (keyboard)
                     78: #define kCP_EnableKeyboardClock        0xAE // (keyboard)
                     79: #define kCP_ReadInputPort              0xC0 //
                     80: #define kCP_PollInputPortLow           0xC1 //
                     81: #define kCP_PollInputPortHigh          0xC2 //
                     82: #define kCP_ReadOutputPort             0xD0 //
                     83: #define kCP_WriteOutputPort            0xD1 //
                     84: #define kCP_WriteKeyboardOutputBuffer  0xD2 // (keyboard)
                     85: #define kCP_WriteMouseOutputBuffer     0xD3 // (mouse)
                     86: #define kCP_TransmitToMouse            0xD4 // (mouse)
                     87: #define kCP_ReadTestInputs             0xE0 //
                     88: #define kCP_PulseOutputBitBase         0xF0 //
                     89: 
                     90: //
                     91: // Bit definitions for the 8-bit "Command Byte" register, which is accessed
                     92: // through the Command Port (0x64).
                     93: //
                     94: 
                     95: #define kCB_EnableKeyboardIRQ           0x01    // Enable Keyboard IRQ
                     96: #define kCB_EnableMouseIRQ              0x02    // Enable Mouse IRQ
                     97: #define kCB_SystemFlag                  0x04    // Set System Flag
                     98: #define kCB_InhibitOverride             0x08    // Inhibit Override
                     99: #define kCB_DisableKeyboardClock        0x10    // Disable Keyboard Clock
                    100: #define kCB_DisableMouseClock           0x20    // Disable Mouse Clock
                    101: #define kCB_TranslateMode               0x40    // Keyboard Translate Mode
                    102: 
                    103: //
                    104: // Bit definitions for the 8-bit "LED" register, which is accessed through
                    105: // the Data Port (0x64).  Undefined bit positions must be zero.
                    106: //
                    107: 
                    108: #define kLED_ScrollLock         0x01    // Scroll Lock
                    109: #define kLED_NumLock            0x02    // Num Lock
                    110: #define kLED_CapsLock           0x04    // Caps Lock
                    111: 
                    112: //
                    113: // Scan Codes used for special purposes on the keyboard and/or mouse receive
                    114: // port.  These values would be received from your interrupt handler or from
                    115: // a ReadDataPort command primitive.    These values do not represent actual
                    116: // keys, but indicate some sort of status.
                    117: //
                    118: 
                    119: #define kSC_Acknowledge         0xFA    // ack for transmitted commands
                    120: #define kSC_Extend              0xE0    // marker for "extended" sequence
                    121: #define kSC_Pause               0xE1    // marker for pause key sequence
                    122: #define kSC_Resend              0xFE    // request to resend keybd cmd
                    123: #define kSC_Reset               0xAA    // the keyboard/mouse has reset
                    124: #define kSC_UpBit               0x80    // OR'd in if key below is released
                    125: 
                    126: //
                    127: // Scan Codes for some modifier keys.
                    128: //
                    129: 
                    130: #define kSC_Alt                 0x38    // (extended = right key)
                    131: #define kSC_Ctrl                0x1D    // (extended = right key)
                    132: #define kSC_ShiftLeft           0x2A
                    133: #define kSC_ShiftRight          0x36
                    134: #define kSC_WindowsLeft         0x5B    // extended
                    135: #define kSC_WindowsRight        0x5C    // extended
                    136: 
                    137: //
                    138: // Scan Codes for some keys.
                    139: //
                    140: 
                    141: #define kSC_Delete              0x53    // (extended = gray key)
                    142: #define kSC_NumLock             0x45
                    143: 
                    144: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                    145: // PS/2 Command Primitives
                    146: //
                    147: // o  kPS2C_ReadDataPort:
                    148: //    o  Description: Reads the next available byte off the data port (60h).
                    149: //    o  Out Field:   Holds byte that was read.
                    150: //
                    151: // o  kPS2C_ReadDataAndCompare:
                    152: //    o  Description: Reads the next available byte off the data port (60h),
                    153: //                    and compares it with the byte in the In Field.  If the
                    154: //                    comparison fails, the request is aborted (refer to the 
                    155: //                    commandsCount field in the request structure).
                    156: //    o  In Field:    Holds byte that comparison should be made to.
                    157: //
                    158: // o  kPS2C_WriteDataPort:
                    159: //    o  Description: Writes the byte in the In Field to the data port (60h).
                    160: //    o  In Field:    Holds byte that should be written.
                    161: //
                    162: // o  kPS2C_WriteCommandPort:
                    163: //    o  Description: Writes the byte in the In Field to the command port (64h).
                    164: //    o  In Field:    Holds byte that should be written.
                    165: //
                    166: 
                    167: enum PS2CommandEnum
                    168: {
                    169:   kPS2C_ReadDataPort,
                    170:   kPS2C_ReadDataPortAndCompare,
                    171:   kPS2C_WriteDataPort,
                    172:   kPS2C_WriteCommandPort
                    173: };
                    174: typedef enum PS2CommandEnum PS2CommandEnum;
                    175: 
                    176: struct PS2Command
                    177: {
                    178:   PS2CommandEnum command;
                    179:   UInt8          inOrOut;
                    180: };
                    181: typedef struct PS2Command PS2Command;
                    182: 
                    183: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                    184: // PS/2 Request Structure
                    185: //
                    186: // o  General Notes:
                    187: //    o  allocateRequest allocates the request structure -- use it always.
                    188: //    o  freeRequest deallocates the request structure -- use it always.
                    189: //    o  It is the driver's responsibility to free the request structure:
                    190: //       o  after a submitRequestAndBlock call returns, or
                    191: //       o  in the completion routine for each submitRequest issued.
                    192: //    o  It is not the driver's resposiblity to free the request structure:
                    193: //       o  when no completion routine is specified in a request issued via
                    194: //          submitRequest, in which case the request is freed automatically
                    195: //          by the controller.  This case is called "fire-and-forget".
                    196: //    o  On completion, the requester can see how far the processing got by
                    197: //       looking at the commandsCount field.  If it is equal to the original
                    198: //       number of commands, then the request was successful.  If isn't, the
                    199: //       value represents the zero-based index of the command that failed.
                    200: //
                    201: // o  General Notes For Inquisitive Minds:
                    202: //    o  Requests are executed atomically with respect to all other requests,
                    203: //       that is, if a keyboard request is currently being processed, then a
                    204: //       request submitted by the mouse driver or one submitted by a separate
                    205: //       thread of control in the keyboard driver will get queued until the
                    206: //       controller is available again.
                    207: //    o  Request processing can be preempted to service interrupts on other
                    208: //       PS/2 devices,  should other-device data arrive unexpectedly on the
                    209: //       input stream while processing a request.
                    210: //    o  The request processor knows when to read the mouse input stream
                    211: //       over the keyboard input stream for a given command sequence. It
                    212: //       does not depend on which driver it came from, rest assurred. If
                    213: //       the mouse driver so chose, it could send keyboard commands.
                    214: //
                    215: // o  commands:
                    216: //    o  Description:  Holds list of commands that controller should execute.
                    217: //    o  Comments:     Refer to PS2Command structure.
                    218: //
                    219: // o  commandsCount:
                    220: //    o  Description:  Holds the number of commands in the command list.
                    221: //    o  Comments:     Number of commands should never exceed kMaxCommands.
                    222: //
                    223: // o  completionRoutineTarget, Action, and Param:
                    224: //    o  Description:  Object and method of the completion routine, which is
                    225: //                     called when the request has finished. The Param field
                    226: //                     may be filled with anything you want; it is passed to
                    227: //                     completion routine when it is called.  These fields
                    228: //                     are optional.   If left null, the request structure
                    229: //                     will be deallocated automatically by the controller
                    230: //                     on completion of the request.
                    231: //    o  Prototype:    void completionRoutine(void * target, void * param);
                    232: //    o  Comments:     Never issue submitRequestAndBlock or otherwise BLOCK on
                    233: //                     any request sent down to your device from the completion
                    234: //                     routine.  Obey, or deadlock.
                    235: //
                    236: 
                    237: #define kMaxCommands 20
                    238: 
                    239: typedef void (*PS2CompletionAction)(void * target, void * param);
                    240: 
                    241: struct PS2Request
                    242: {
                    243:   UInt8               commandsCount;
                    244:   PS2Command          commands[kMaxCommands];
                    245:   void *              completionTarget;
                    246:   PS2CompletionAction completionAction;
                    247:   void *              completionParam;
                    248: };
                    249: typedef struct PS2Request PS2Request;
                    250: 
                    251: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                    252: // ApplePS2KeyboardDevice and ApplePS2MouseDevice Class Descriptions
                    253: //
                    254: //
                    255: // o  General Notes:
                    256: //    o  When the probe method is invoked on the client driver, the controller
                    257: //       guarantees that the keyboard clock is enabled and the keyboard itself
                    258: //       is disabled.  This implies the client driver can send commands to the
                    259: //       keyboard without a problem, and the keyboard itself will not send any
                    260: //       asynchronous key data that may mess up the responses expected by the
                    261: //       commands sent to it.
                    262: //
                    263: // o  installInterruptAction:
                    264: //    o  Description:   Ask the device to deliver asynchronous data to driver.
                    265: //    o  In Fields:     Target/action of completion routine.
                    266: //
                    267: // o  installInterruptAction Interrupt Routine:
                    268: //    o  Description:  Delivers a newly read byte from the input data stream.
                    269: //    o  Prototype:    void interruptOccurred(void * target, UInt8 byte);
                    270: //    o  In Fields:    Byte that was read.
                    271: //    o  Comments:     Never issue submitRequestAndBlock or otherwise BLOCK on
                    272: //                     any request sent down to your device from the interrupt
                    273: //                     routine.  Obey, or deadlock.
                    274: //
                    275: // o  uninstallInterruptHandler:
                    276: //    o  Description:  Ask the device to stop delivering asynchronous data.
                    277: //
                    278: // o  allocateRequest:
                    279: //    o  Description:  Allocate a request structure, blocks until successful.
                    280: //    o  Result:       Request structure pointer.
                    281: //    o  Comments:     Request structure is guaranteed to be zeroed.
                    282: //
                    283: // o  freeRequest:
                    284: //    o  Description:  Deallocate a request structure.
                    285: //    o  In Fields:    Request structure pointer.
                    286: //
                    287: // o  submitRequest:
                    288: //    o  Description:  Submit the request to the controller for processing.
                    289: //    o  In Fields:    Request structure pointer.
                    290: //    o  Result:       kern_return_t queueing status.
                    291: //
                    292: // o  submitRequestAndBlock:
                    293: //    o  Description:  Submit the request to the controller for processing, then
                    294: //                     block the calling thread until the request completes.
                    295: //    o  In Fields:    Request structure pointer.
                    296: //
                    297: 
                    298: typedef void (*PS2InterruptAction)(void * target, UInt8 data);
                    299: 
                    300: #endif /* !_APPLEPS2DEVICE_H */

unix.superglobalmegacorp.com

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