Annotation of XNU/iokit/IOKit/ps2/ApplePS2Device.h, revision 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.