Unit PS2
Return to Unit Reference
Description
PS2 Keyboard/Mouse Controller Support unit
This unit provides supporting functions and defintions for PS/2 keyboard and mouse controller drivers.
The constants defined here are not a complete set but represent the most commonly used PS/2 functions and operations. Of most importance is the mouse packet and the keyboard scancode structures which provide support for receiving the actual data from a keyboard or a mouse.
This unit also includes the PS/2 scancode sets which define the actual values that are received in response to each key press and release. Currently only scancode set 2 is defined as in many instances that is considered the standard scancode set and some devices simply do not support scancode set 1 or 3.
Constants
PS2_KEYBOARD_COMMAND_*
Note: See: http://wiki.osdev.org/PS/2_Keyboard | |
PS2_KEYBOARD_COMMAND_SET_LEDS = $ED;
|
Set LEDS (Data: See below) |
PS2_KEYBOARD_COMMAND_ECHO = $EE;
|
Echo (Data: None) |
PS2_KEYBOARD_COMMAND_SCANCODE = $F0;
|
Get/set current scan code (Data: See below) |
PS2_KEYBOARD_COMMAND_IDENTIFY = $F2;
|
Identify (Data: None) (See: http://wiki.osdev.org/%228042%22_PS/2_Controller#Detecting_PS.2F2_Device_Types) |
PS2_KEYBOARD_COMMAND_SET_RATE_DELAY = $F3;
|
Set typematic rate and delay (Data: See below) |
PS2_KEYBOARD_COMMAND_ENABLE_SCAN = $F4;
|
Enable scanning (keyboard will send scan codes) (Data: None) |
PS2_KEYBOARD_COMMAND_DISABLE_SCAN = $F5;
|
Disable scanning (keyboard won't send scan codes) (Data: None) Note: May also restore default parameters |
PS2_KEYBOARD_COMMAND_SET_DEFAULTS = $F6;
|
Set default parameters (Data: None) |
PS2_KEYBOARD_COMMAND_SET_ALL_TYPEMATIC_ONLY = $F7;
|
Set all keys to typematic/autorepeat only (Scancode set 3 only) (Data: None) |
PS2_KEYBOARD_COMMAND_SET_ALL_MAKE_RELEASE = $F8;
|
Set all keys to make/release (Scancode set 3 only) (Data: None) |
PS2_KEYBOARD_COMMAND_SET_ALL_MAKE_ONLY = $F9;
|
Set all keys to make only (Scancode set 3 only) (Data: None) |
PS2_KEYBOARD_COMMAND_SET_ALL_MAKE_TYPEMATIC = $FA;
|
Set all keys to typematic/autorepeat/make/release (Scancode set 3 only) (Data: None) |
PS2_KEYBOARD_COMMAND_SET_TYPEMATIC_ONLY = $FB;
|
Set specific key to typematic/autorepeat only (Scancode set 3 only) (Data: Scancode for key) |
PS2_KEYBOARD_COMMAND_SET_MAKE_RELEASE = $FC;
|
Set specific key to make/release (Scancode set 3 only) (Data: Scancode for key) |
PS2_KEYBOARD_COMMAND_SET_MAKE_ONLY = $FD;
|
Set specific key to make only (Scancode set 3 only) (Data: Scancode for key) |
PS2_KEYBOARD_COMMAND_RESEND = $FE;
|
Resend last byte (Data: None) |
PS2_KEYBOARD_COMMAND_RESET = $FF;
|
Reset and start self-test (Data: None) |
PS2_KEYBOARD_SET_LEDS_*
PS2_KEYBOARD_SET_LEDS_SCROLLLOCK = (1 shl 0);
|
ScrollLock |
PS2_KEYBOARD_SET_LEDS_NUMLOCK = (1 shl 1);
|
NumberLock |
PS2_KEYBOARD_SET_LEDS_CAPSLOCK = (1 shl 2);
|
CapsLock |
PS2_KEYBOARD_SCANCODE_*
PS2_KEYBOARD_SCANCODE_GET = 0;
|
Get current scan code set |
PS2_KEYBOARD_SCANCODE_SET1 = 1;
|
Set scan code set 1 |
PS2_KEYBOARD_SCANCODE_SET2 = 2;
|
Set scan code set 2 |
PS2_KEYBOARD_SCANCODE_SET3 = 3;
|
Set scan code set 3 |
PS2_KEYBOARD_SET_*_MASK
PS2_KEYBOARD_SET_REPEAT_RATE_MASK = $0F;
|
Repeat rate (00000b = 30 Hz, ..., 11111b = 2 Hz) |
PS2_KEYBOARD_SET_DELAY_MASK = $70;
|
Delay before keys repeat (00b = 250 ms, 01b = 500 ms, 10b = 750 ms, 11b = 1000 ms) |
Bit 7 Must be zero |
PS2_KEYBOARD_SET_REPEAT_RATE_*
PS2_KEYBOARD_SET_REPEAT_RATE_30_0 = $00;
|
30.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_26_7 = $01;
|
26.7cps |
PS2_KEYBOARD_SET_REPEAT_RATE_24_0 = $02;
|
24.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_21_8 = $03;
|
21.8cps |
PS2_KEYBOARD_SET_REPEAT_RATE_20_7 = $04;
|
20.7cps |
PS2_KEYBOARD_SET_REPEAT_RATE_18_5 = $05;
|
18.5cps |
PS2_KEYBOARD_SET_REPEAT_RATE_17_1 = $06;
|
17.1cps |
PS2_KEYBOARD_SET_REPEAT_RATE_16_0 = $07;
|
16.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_15_0 = $08;
|
15.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_13_3 = $09;
|
13.3cps |
PS2_KEYBOARD_SET_REPEAT_RATE_12_0 = $0A;
|
12.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_10_9 = $0B;
|
10.9cps |
PS2_KEYBOARD_SET_REPEAT_RATE_10_0 = $0C;
|
10.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_9_2 = $0D;
|
9.2cps |
PS2_KEYBOARD_SET_REPEAT_RATE_8_6 = $0E;
|
8.6cps |
PS2_KEYBOARD_SET_REPEAT_RATE_8_0 = $0F;
|
8.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_7_5 = $10;
|
7.5cps |
PS2_KEYBOARD_SET_REPEAT_RATE_6_7 = $11;
|
6.7cps |
PS2_KEYBOARD_SET_REPEAT_RATE_6_0 = $12;
|
6.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_5_5 = $13;
|
5.5cps |
PS2_KEYBOARD_SET_REPEAT_RATE_5_0 = $14;
|
5.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_4_6 = $15;
|
4.6cps |
PS2_KEYBOARD_SET_REPEAT_RATE_4_3 = $16;
|
4.3cps |
PS2_KEYBOARD_SET_REPEAT_RATE_4_0 = $17;
|
4.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_3_7 = $18;
|
3.7cps |
PS2_KEYBOARD_SET_REPEAT_RATE_3_3 = $19;
|
3.3cps |
PS2_KEYBOARD_SET_REPEAT_RATE_3_0 = $1A;
|
3.0cps |
PS2_KEYBOARD_SET_REPEAT_RATE_2_7 = $1B;
|
2.7cps |
PS2_KEYBOARD_SET_REPEAT_RATE_2_5 = $1C;
|
2.5cps |
PS2_KEYBOARD_SET_REPEAT_RATE_2_3 = $1D;
|
2.3cps |
PS2_KEYBOARD_SET_REPEAT_RATE_2_1 = $1E;
|
2.1cps |
PS2_KEYBOARD_SET_REPEAT_RATE_2_0 = $1F;
|
2.0cps |
PS2_KEYBOARD_SET_DELAY_*
PS2_KEYBOARD_SET_DELAY_250 = $00;
|
250ms |
PS2_KEYBOARD_SET_DELAY_500 = $10;
|
500ms |
PS2_KEYBOARD_SET_DELAY_750 = $20;
|
750ms |
PS2_KEYBOARD_SET_DELAY_1000 = $30;
|
1000ms |
PS2_MOUSE_COMMAND_*
Note: See: http://wiki.osdev.org/PS/2_Mouse | |
PS2_MOUSE_COMMAND_RESET = $FF;
|
Reset (Data: None) |
PS2_MOUSE_COMMAND_RESEND = $FE;
|
Resend (Data: None) |
PS2_MOUSE_COMMAND_SET_DEFAULTS = $F6;
|
Set Defaults (Data: None) |
PS2_MOUSE_COMMAND_DISABLE_REPORT = $F5;
|
Disable Data Reporting (Data: None) |
PS2_MOUSE_COMMAND_ENABLE_REPORT = $F4;
|
Enable Data Reporting (Data: None) |
PS2_MOUSE_COMMAND_SET_SAMPLE_RATE = $F3;
|
Set Sample Rate (Data: Sample rate, ranges from 10-200) |
PS2_MOUSE_COMMAND_GET_DEVICE_ID = $F2;
|
Get Device ID (Data: None) (See: http://wiki.osdev.org/%228042%22_PS/2_Controller#Detecting_PS.2F2_Device_Types) |
PS2_MOUSE_COMMAND_SET_REMOTE_MODE = $F0;
|
Set Remote Mode (Data: None) |
PS2_MOUSE_COMMAND_SET_WRAP_MODE = $EE;
|
Set Wrap Mode (Data: None) |
PS2_MOUSE_COMMAND_RESET_WRAP_MODE = $EC;
|
Reset Wrap Mode (Data: None) |
PS2_MOUSE_COMMAND_READ_DATA = $EB;
|
Read Data (Data: None) |
PS2_MOUSE_COMMAND_SET_STREAM_MODE = $EA;
|
Set Stream Mode (Data: None) |
PS2_MOUSE_COMMAND_STATUS_REQUEST = $E9;
|
Status Request (Data: None) |
PS2_MOUSE_COMMAND_SET_RESOLUTION = $E8;
|
Set Resolution (Data: See below) |
PS2_MOUSE_COMMAND_SAMPLE_RATE_10 = 10;
|
10 samples/sec |
PS2_MOUSE_COMMAND_SAMPLE_RATE_20 = 20;
|
20 samples/sec |
PS2_MOUSE_COMMAND_SAMPLE_RATE_40 = 40;
|
40 samples/sec |
PS2_MOUSE_COMMAND_SAMPLE_RATE_60 = 60;
|
60 samples/sec |
PS2_MOUSE_COMMAND_SAMPLE_RATE_80 = 80;
|
80 samples/sec |
PS2_MOUSE_COMMAND_SAMPLE_RATE_100 = 100;
|
100 samples/sec |
PS2_MOUSE_COMMAND_SAMPLE_RATE_200 = 200;
|
200 samples/sec |
PS2_MOUSE_COMMAND_RESOLUTION_1 = $00;
|
1 count/mm |
PS2_MOUSE_COMMAND_RESOLUTION_2 = $01;
|
2 count/mm |
PS2_MOUSE_COMMAND_RESOLUTION_4 = $02;
|
4 count/mm |
PS2_MOUSE_COMMAND_RESOLUTION_5 = $03;
|
8 count/mm |
PS2_RESPONSE_*
PS2_RESPONSE_NONE = $00;
|
Key detection error or internal buffer overrun |
PS2_RESPONSE_SELF_TEST_PASS = $AA;
|
Self test passed (sent after "0xFF (reset)" command or keyboard power up) |
PS2_RESPONSE_ECHO = $EE;
|
Response to "0xEE (echo)" command |
PS2_RESPONSE_ACK = $FA;
|
Command acknowledged (ACK) |
PS2_RESPONSE_SELFTEST_FAIL1 = $FC;
|
Self test failed (sent after "0xFF (reset)" command or keyboard power up) |
PS2_RESPONSE_SELFTEST_FAIL2 = $FD;
|
Self test failed (sent after "0xFF (reset)" command or keyboard power up) |
PS2_RESPONSE_RESEND = $FE;
|
Resend (keyboard wants controller to repeat last command it sent) |
PS2_RESPONSE_ERROR = $FF;
|
Key detection error or internal buffer overrun |
PS2_MOUSE_BITS_*
PS2_MOUSE_BITS_YO = (1 shl 7);
|
Y-Axis Overflow |
PS2_MOUSE_BITS_XO = (1 shl 6);
|
X-Axis Overflow |
PS2_MOUSE_BITS_YS = (1 shl 5);
|
Y-Axis Sign Bit (9-Bit Y-Axis Relative Offset) |
PS2_MOUSE_BITS_XS = (1 shl 4);
|
X-Axis Sign Bit (9-Bit X-Axis Relative Offset) |
PS2_MOUSE_BITS_AO = (1 shl 3);
|
Always One |
PS2_MOUSE_BITS_BM = (1 shl 2);
|
Button Middle (Normally Off = 0) |
PS2_MOUSE_BITS_BR = (1 shl 1);
|
Button Right (Normally Off = 0) |
PS2_MOUSE_BITS_BL = (1 shl 0);
|
Button Left (Normally Off = 0) |
PS2_SCANCODE_MAKE*
PS2_SCANCODE_MAKE = 0;
|
Key Down (Press) |
PS2_SCANCODE_BREAK = 1;
|
Key Up (Release) |
PS2_SCANCODE_*_COUNT
PS2_SCANCODE_PC104_COUNT = 104;
|
|
PS2_SCANCODE_ACPI_COUNT = 3;
|
|
PS2_SCANCODE_MULTIMEDIA_COUNT = 18;
|
|
PS2_SCANCODE_COUNT = PS2_SCANCODE_PC104_COUNT + PS2_SCANCODE_ACPI_COUNT + PS2_SCANCODE_MULTIMEDIA_COUNT;
|
Type definitions
PS2 scancode data
PPS2ScancodeData = ^TPS2ScancodeData;
TPS2ScancodeData = array[0..(PS2_SCANCODE_COUNT * 2) - 1] of array[0..9] of Byte;
NAME_
|
Keyboard scancode
PPS2KeyboardScancode = ^TPS2KeyboardScancode;
TPS2KeyboardScancode = record
ScancodeSet:Byte;
|
|
Scancode:array[0..7] of Byte;
|
Mouse packet types
PPS2MousePacket = ^TPS2MousePacket;
TPS2MousePacket = record
MouseBits:Byte;
|
Bits (See PS2_MOUSE_BITS_* above) |
MouseX:Byte;
|
X-Axis Movement Value (Relative) |
MouseY:Byte;
|
Y-Axis Movement Value (Relative) |
Public variables
None defined
Function declarations
PS2 helper functions
function KeyboardLEDsToPS2LEDs(LEDs:LongWord; var PS2LEDs:Byte):LongWord;
LEDs | The Keyboard LED values to map (eg KEYBOARD_LED_NUMLOCK) |
---|---|
PS2LEDs | The returned PS/2 Keyboard LED values (eg PS2_KEYBOARD_SET_LEDS_NUMLOCK) |
Return | ERROR_SUCCESS if completed or another error code on failure |
function KeyboardRateAndDelayToPS2Typematic(Rate,Delay:LongWord; var PS2Typematic:Byte):LongWord;
Rate | The Keyboard Repeat Rate to translate (Milliseconds between repeats) |
---|---|
Delay | The Keyboard Repeat Delay to translate (Number of Repeat Rate intervals before first repeat) |
PS2Typematic | The translated PS/2 Typematic value returned |
Return | ERROR_SUCCESS if completed or another error code on failure |
function PS2KeyboardScancodeMatch(KeyboardScancode:PPS2KeyboardScancode; var Index:LongInt):LongWord;
KeyboardScancode | Pointer to the scancode bytes and scancode set information |
---|---|
Index | The index of the matching scancode on success or the nearest match on not found (Pass -1 to start search from first entry, on subsequent calls pass the previous value to continue) |
Return | ERROR_SUCCESS if matched, ERROR_NOT_FOUND if not matched or another error code on failure |
function PS2KeyboardScancodeToScanCode(KeyboardScancode:PPS2KeyboardScancode; Index:LongInt; var ScanCode:Word):LongWord;
KeyboardScancode | Pointer to the scancode bytes and scancode set information |
---|---|
Index | The index value returned by PS2KeyboardScancodeMatch (-1 to search for match) |
ScanCode | The returned keyboard scan code value (eg SCAN_CODE_A) |
Return | ERROR_SUCCESS if completed or another error code on failure (ERROR_NOT_FOUND if not matched) |
function PS2KeyboardScancodeToModifiers(KeyboardScancode:PPS2KeyboardScancode; Index:LongInt; var Modifiers:LongWord):LongWord;
Index | The index value returned by PS2KeyboardScancodeMatch (-1 to search for match) |
---|---|
Modifiers | The returned keyboard modifiers flags (eg KEYBOARD_LEFT_CTRL) |
Return | ERROR_SUCCESS if completed or another error code on failure (ERROR_NOT_FOUND if not matched) |
function MouseSampleRateToPS2SampleRate(Rate:LongWord; var PS2Rate:Byte):LongWord;
Rate | The Mouse Sample Rate to translate (Samples per second) |
---|---|
PS2Rate | The translated PS/2 Sample Rate value returned |
Return | ERROR_SUCCESS if completed or another error code on failure |
function PS2MousePacketToMouseData(MousePacket:PPS2MousePacket; MouseData:PMouseData; Flags:LongWord):LongWord;
MousePacket | Pointer to the PS/2 Mouse Packet received from the mouse |
---|---|
MouseData | Pointer to the Mouse Data structure to return |
Flags | The Mouse device flags (eg MOUSE_FLAG_SWAP_BUTTONS) |
Return | ERROR_SUCCESS if completed or another error code on failure |
Return to Unit Reference