/* * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * The contents of this file constitute Original Code as defined in and * are subject to the Apple Public Source License Version 1.1 (the * "License"). You may not use this file except in compliance with the * License. Please obtain a copy of the License at * http://www.apple.com/publicsource and read it before using this file. * * This Original Code and all software distributed under the License are * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the * License for the specific language governing rights and limitations * under the License. * * @APPLE_LICENSE_HEADER_END@ */ #ifndef _APPLEPS2DEVICE_H #define _APPLEPS2DEVICE_H #include <IOKit/IOService.h> // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Definitions // // Data Port (0x60) Commands. These commands are all transmitted directly to // the physical keyboard and/or mouse, so expect an acknowledge for each byte // that you send through this port. // #define kDP_SetMouseScaling1To1 0xE6 // (mouse) #define kDP_SetMouseScaling2To1 0xE7 // (mouse) #define kDP_SetMouseResolution 0xE8 // (mouse) #define kDP_GetMouseInformation 0xE9 // (mouse) #define kDP_SetMouseStreamMode 0xEA // (mouse) #define kDP_SetKeyboardLEDs 0xED // (keyboard) #define kDP_TestKeyboardEcho 0xEE // (keyboard) #define kDP_GetSetKeyboardASCs 0xF0 // (keyboard) #define kDP_GetId 0xF2 // (keyboard+mouse) #define kDP_SetKeyboardTypematic 0xF3 // (keyboard) #define kDP_SetMouseSampleRate 0xF3 // (mouse) #define kDP_Enable 0xF4 // (keyboard+mouse) #define kDP_SetDefaultsAndDisable 0xF5 // (keyboard+mouse) #define kDP_SetDefaults 0xF6 // (keyboard+mouse) #define kDP_SetAllTypematic 0xF7 // (keyboard) #define kDP_SetAllMakeRelease 0xF8 // (keyboard) #define kDP_SetAllMakeOnly 0xF9 // (keyboard) #define kDP_SetAllTypematicMakeRelease 0xFA // (keyboard) #define kDP_SetKeyMakeRelease 0xFB // (keyboard) #define kDP_SetKeyMakeOnly 0xFC // (keyboard) #define kDP_Reset 0xFF // (keyboard+mouse) // // Command Port (0x64) Commands. These commands all access registers local // to the motherboard, ie. nothing is transmitted, thus these commands and // any associated data passed thru the Data Port do not return acknowledges. // #define kCP_GetCommandByte 0x20 // (keyboard+mouse) #define kCP_ReadControllerRAMBase 0x21 // #define kCP_SetCommandByte 0x60 // (keyboard+mouse) #define kCP_WriteControllerRAMBase 0x61 // #define kCP_TestPassword 0xA4 // #define kCP_GetPassword 0xA5 // #define kCP_VerifyPassword 0xA6 // #define kCP_DisableMouseClock 0xA7 // (mouse) #define kCP_EnableMouseClock 0xA8 // (mouse) #define kCP_TestMousePort 0xA9 // #define kCP_TestController 0xAA // #define kCP_TestKeyboardPort 0xAB // #define kCP_GetControllerDiagnostic 0xAC // #define kCP_DisableKeyboardClock 0xAD // (keyboard) #define kCP_EnableKeyboardClock 0xAE // (keyboard) #define kCP_ReadInputPort 0xC0 // #define kCP_PollInputPortLow 0xC1 // #define kCP_PollInputPortHigh 0xC2 // #define kCP_ReadOutputPort 0xD0 // #define kCP_WriteOutputPort 0xD1 // #define kCP_WriteKeyboardOutputBuffer 0xD2 // (keyboard) #define kCP_WriteMouseOutputBuffer 0xD3 // (mouse) #define kCP_TransmitToMouse 0xD4 // (mouse) #define kCP_ReadTestInputs 0xE0 // #define kCP_PulseOutputBitBase 0xF0 // // // Bit definitions for the 8-bit "Command Byte" register, which is accessed // through the Command Port (0x64). // #define kCB_EnableKeyboardIRQ 0x01 // Enable Keyboard IRQ #define kCB_EnableMouseIRQ 0x02 // Enable Mouse IRQ #define kCB_SystemFlag 0x04 // Set System Flag #define kCB_InhibitOverride 0x08 // Inhibit Override #define kCB_DisableKeyboardClock 0x10 // Disable Keyboard Clock #define kCB_DisableMouseClock 0x20 // Disable Mouse Clock #define kCB_TranslateMode 0x40 // Keyboard Translate Mode // // Bit definitions for the 8-bit "LED" register, which is accessed through // the Data Port (0x64). Undefined bit positions must be zero. // #define kLED_ScrollLock 0x01 // Scroll Lock #define kLED_NumLock 0x02 // Num Lock #define kLED_CapsLock 0x04 // Caps Lock // // Scan Codes used for special purposes on the keyboard and/or mouse receive // port. These values would be received from your interrupt handler or from // a ReadDataPort command primitive. These values do not represent actual // keys, but indicate some sort of status. // #define kSC_Acknowledge 0xFA // ack for transmitted commands #define kSC_Extend 0xE0 // marker for "extended" sequence #define kSC_Pause 0xE1 // marker for pause key sequence #define kSC_Resend 0xFE // request to resend keybd cmd #define kSC_Reset 0xAA // the keyboard/mouse has reset #define kSC_UpBit 0x80 // OR'd in if key below is released // // Scan Codes for some modifier keys. // #define kSC_Alt 0x38 // (extended = right key) #define kSC_Ctrl 0x1D // (extended = right key) #define kSC_ShiftLeft 0x2A #define kSC_ShiftRight 0x36 #define kSC_WindowsLeft 0x5B // extended #define kSC_WindowsRight 0x5C // extended // // Scan Codes for some keys. // #define kSC_Delete 0x53 // (extended = gray key) #define kSC_NumLock 0x45 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // PS/2 Command Primitives // // o kPS2C_ReadDataPort: // o Description: Reads the next available byte off the data port (60h). // o Out Field: Holds byte that was read. // // o kPS2C_ReadDataAndCompare: // o Description: Reads the next available byte off the data port (60h), // and compares it with the byte in the In Field. If the // comparison fails, the request is aborted (refer to the // commandsCount field in the request structure). // o In Field: Holds byte that comparison should be made to. // // o kPS2C_WriteDataPort: // o Description: Writes the byte in the In Field to the data port (60h). // o In Field: Holds byte that should be written. // // o kPS2C_WriteCommandPort: // o Description: Writes the byte in the In Field to the command port (64h). // o In Field: Holds byte that should be written. // enum PS2CommandEnum { kPS2C_ReadDataPort, kPS2C_ReadDataPortAndCompare, kPS2C_WriteDataPort, kPS2C_WriteCommandPort }; typedef enum PS2CommandEnum PS2CommandEnum; struct PS2Command { PS2CommandEnum command; UInt8 inOrOut; }; typedef struct PS2Command PS2Command; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // PS/2 Request Structure // // o General Notes: // o allocateRequest allocates the request structure -- use it always. // o freeRequest deallocates the request structure -- use it always. // o It is the driver's responsibility to free the request structure: // o after a submitRequestAndBlock call returns, or // o in the completion routine for each submitRequest issued. // o It is not the driver's resposiblity to free the request structure: // o when no completion routine is specified in a request issued via // submitRequest, in which case the request is freed automatically // by the controller. This case is called "fire-and-forget". // o On completion, the requester can see how far the processing got by // looking at the commandsCount field. If it is equal to the original // number of commands, then the request was successful. If isn't, the // value represents the zero-based index of the command that failed. // // o General Notes For Inquisitive Minds: // o Requests are executed atomically with respect to all other requests, // that is, if a keyboard request is currently being processed, then a // request submitted by the mouse driver or one submitted by a separate // thread of control in the keyboard driver will get queued until the // controller is available again. // o Request processing can be preempted to service interrupts on other // PS/2 devices, should other-device data arrive unexpectedly on the // input stream while processing a request. // o The request processor knows when to read the mouse input stream // over the keyboard input stream for a given command sequence. It // does not depend on which driver it came from, rest assurred. If // the mouse driver so chose, it could send keyboard commands. // // o commands: // o Description: Holds list of commands that controller should execute. // o Comments: Refer to PS2Command structure. // // o commandsCount: // o Description: Holds the number of commands in the command list. // o Comments: Number of commands should never exceed kMaxCommands. // // o completionRoutineTarget, Action, and Param: // o Description: Object and method of the completion routine, which is // called when the request has finished. The Param field // may be filled with anything you want; it is passed to // completion routine when it is called. These fields // are optional. If left null, the request structure // will be deallocated automatically by the controller // on completion of the request. // o Prototype: void completionRoutine(void * target, void * param); // o Comments: Never issue submitRequestAndBlock or otherwise BLOCK on // any request sent down to your device from the completion // routine. Obey, or deadlock. // #define kMaxCommands 20 typedef void (*PS2CompletionAction)(void * target, void * param); struct PS2Request { UInt8 commandsCount; PS2Command commands[kMaxCommands]; void * completionTarget; PS2CompletionAction completionAction; void * completionParam; }; typedef struct PS2Request PS2Request; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ApplePS2KeyboardDevice and ApplePS2MouseDevice Class Descriptions // // // o General Notes: // o When the probe method is invoked on the client driver, the controller // guarantees that the keyboard clock is enabled and the keyboard itself // is disabled. This implies the client driver can send commands to the // keyboard without a problem, and the keyboard itself will not send any // asynchronous key data that may mess up the responses expected by the // commands sent to it. // // o installInterruptAction: // o Description: Ask the device to deliver asynchronous data to driver. // o In Fields: Target/action of completion routine. // // o installInterruptAction Interrupt Routine: // o Description: Delivers a newly read byte from the input data stream. // o Prototype: void interruptOccurred(void * target, UInt8 byte); // o In Fields: Byte that was read. // o Comments: Never issue submitRequestAndBlock or otherwise BLOCK on // any request sent down to your device from the interrupt // routine. Obey, or deadlock. // // o uninstallInterruptHandler: // o Description: Ask the device to stop delivering asynchronous data. // // o allocateRequest: // o Description: Allocate a request structure, blocks until successful. // o Result: Request structure pointer. // o Comments: Request structure is guaranteed to be zeroed. // // o freeRequest: // o Description: Deallocate a request structure. // o In Fields: Request structure pointer. // // o submitRequest: // o Description: Submit the request to the controller for processing. // o In Fields: Request structure pointer. // o Result: kern_return_t queueing status. // // o submitRequestAndBlock: // o Description: Submit the request to the controller for processing, then // block the calling thread until the request completes. // o In Fields: Request structure pointer. // typedef void (*PS2InterruptAction)(void * target, UInt8 data); #endif /* !_APPLEPS2DEVICE_H */