2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
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.
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
20 * @APPLE_LICENSE_HEADER_END@
23 #ifndef _APPLEPS2DEVICE_H
24 #define _APPLEPS2DEVICE_H
26 #include <IOKit/IOService.h>
28 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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.
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)
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.
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 //
91 // Bit definitions for the 8-bit "Command Byte" register, which is accessed
92 // through the Command Port (0x64).
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
104 // Bit definitions for the 8-bit "LED" register, which is accessed through
105 // the Data Port (0x64). Undefined bit positions must be zero.
108 #define kLED_ScrollLock 0x01 // Scroll Lock
109 #define kLED_NumLock 0x02 // Num Lock
110 #define kLED_CapsLock 0x04 // Caps Lock
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.
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
127 // Scan Codes for some modifier keys.
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
138 // Scan Codes for some keys.
141 #define kSC_Delete 0x53 // (extended = gray key)
142 #define kSC_NumLock 0x45
144 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
145 // PS/2 Command Primitives
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.
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.
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.
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.
170 kPS2C_ReadDataPortAndCompare
,
172 kPS2C_WriteCommandPort
174 typedef enum PS2CommandEnum PS2CommandEnum
;
178 PS2CommandEnum command
;
181 typedef struct PS2Command PS2Command
;
183 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
184 // PS/2 Request Structure
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.
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.
216 // o Description: Holds list of commands that controller should execute.
217 // o Comments: Refer to PS2Command structure.
220 // o Description: Holds the number of commands in the command list.
221 // o Comments: Number of commands should never exceed kMaxCommands.
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.
237 #define kMaxCommands 20
239 typedef void (*PS2CompletionAction
)(void * target
, void * param
);
244 PS2Command commands
[kMaxCommands
];
245 void * completionTarget
;
246 PS2CompletionAction completionAction
;
247 void * completionParam
;
249 typedef struct PS2Request PS2Request
;
251 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
252 // ApplePS2KeyboardDevice and ApplePS2MouseDevice Class Descriptions
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.
263 // o installInterruptAction:
264 // o Description: Ask the device to deliver asynchronous data to driver.
265 // o In Fields: Target/action of completion routine.
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.
275 // o uninstallInterruptHandler:
276 // o Description: Ask the device to stop delivering asynchronous data.
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.
284 // o Description: Deallocate a request structure.
285 // o In Fields: Request structure pointer.
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.
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.
298 typedef void (*PS2InterruptAction
)(void * target
, UInt8 data
);
300 #endif /* !_APPLEPS2DEVICE_H */