One can not only talk to the keyboard controller (by writing to port 0x64), but also to the keyboard (by writing to port 0x60).
In order to avoid interference between scancode sequences or mouse packets and the reponses given to commands, the keyboard or mouse should always be disabled before giving a command that requires a response, and probably enabled afterwards. Some keyboards or mice do the disable automatically in this situation, but still require an explicit enable afterwards.
Each command (other than 0xfe) is ACKed by 0xfa. Each unknown command is NACKed by 0xfe. Some mice expect a corrected byte as reply to the 0xfe, and will double-NACK with 0xfc when also that is wrong.
Here a list with the common commands.
0xed | Write LEDs |
0xee | Diagnostic echo |
0xf0 | Set/Get scancode set |
0xf2 | Read keyboard ID |
0xf3 | Set repeat rate and delay |
0xf4 | Keyboard enable |
0xf5 | Set defaults and disable keyboard |
0xf6 | Set defaults |
0xf7 | Set all keys to repeat |
0xf8 | Set all keys to give make/break codes |
0xf9 | Set all keys to give make codes only |
0xfa | Set all keys to repeat and give make/break codes |
0xfb | Set a single key to repeat |
0xfc | Set a single key to give make/break codes |
0xfd | Set a single key to give make codes only |
0xfe | Resend |
0xff | Keyboard reset |
If the command is preceded by writing 0xd4 to port 0x64, then it goes to the mouse instead of the keyboard. Common commands:
0xe6 | Set mouse scaling to 1:1 |
0xe7 | Set mouse scaling to 2:1 |
0xe8 | Set mouse resolution |
0xe9 | Get mouse information |
0xf2 | Read mouse ID |
0xf3 | Set mouse sample rate |
0xf4 | Mouse enable |
0xf5 | Mouse disable |
0xf6 | Set defaults |
0xff | Mouse reset |
Command e8: Nonstandard. Reported to give a 2-byte ID on an OmniKey keyboard.
Command ea: Nonstandard. The sequences ea 70 and ea 71 are used by some IBM keyboards to disable and enable extra keys.
Command eb: Nonstandard. Sequences involving eb are often used for manipulating extra LEDs.
Command ec: Nonstandard. On the IBM Rapid Access keyboard this command yields a 2-byte ID.
This command is followed by a byte indicating the desired LEDs setting. Bits 7-3: unused, 0. Bit 2: 1: CapsLock LED on. Bit 1: 1: NumLock LED on. Bit 0: 1: ScrollLock LED on. When OK, both bytes are ACKed. If the second byte is recognized as a command, that command is ACKed and done instead. Otherwise a NACK is returned (and a keyboard enable may be needed).
This command returns a single byte, again ee.
Command f0: Set/Get scancode set
Many, but not all, keyboards can be switched to three different scancode sets. This command, followed by a byte 01, 02, or 03 selects the corresponding scancode set. This command, followed by a zero byte, reads the current scancode set. The reply (translated) is 43, 41 or 3f, from untranslated 1, 2 or 3. Note that scancode set 1 should not be translated, while sets 2 and 3 should be translated.Set 2 was introduced by the AT. Set 3 by the PS/2.
This command reads a 2-byte keyboard ID. XT keyboards do not answer at all (of course), AT keyboards reply with an ACK (fa) only, MF2 and other keyboards reply with a 2-byte ID. Wait at least 10ms after issuing this command.For the mouse reply, see below.
Command f3: Set repeat rate and delay
A following byte gives the desired delay before a pressed key starts repeating, and the repeat rate.
Bit 7: unused, 0.
Bits 6-5: 0, 1, 2, 3: 250, 500, 750, 1000 ms delay. Default after reset is 500 ms.
Bits 4-0: inter-character delay. The number of characters per second is given by
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
0 | 30.0 | 26.7 | 24.0 | 21.8 | 20.0 | 18.5 | 17.1 | 16.0 |
8 | 15.0 | 13.3 | 12.0 | 10.9 | 10.0 | 9.2 | 8.6 | 8.0 |
16 | 7.5 | 6.7 | 6.0 | 5.5 | 5.0 | 4.6 | 4.3 | 4.0 |
24 | 3.7 | 3.3 | 3.0 | 2.7 | 2.5 | 2.3 | 2.1 | 2.0 |
(that is, the inter-character delay is (2 ^ B) * (D + 8) / 240 sec, where B gives Bits 4-3 and D gives Bits 2-0).
Default after reset is 10.9 characters per second.
Logitech extended commands Logitech uses escape sequences involving f3 for extended commands. A Logitech extended command looks like f3 7f f3 00 f3 xx (for varying 7-bit values of xx). For example:
xx = 01: SendStatus: send the E1 XX codes for SubDeviceType, BatteryStatus, (Channel if relevant) KbdStatus (=wireless status).
xx = 02: OpenLocking
xx = 03: CloseLocking
xx = 06 f3 aa: Read byte at address aa (in 0x01-0x1e).
xx = 07 F3 aa f3 dd: Write dd at address aa (in 0x01-0x1e).
xx = 10 or 11: Clear all device-related data in EEPROM and RAM. Now device is disconnected.
If a transmit error occurs, the keyboard is automatically disabled. This command re-enables the keyboard and clears its internal 16-byte buffer.
Command f5: Set defaults and disable keyboard
Reset keyboard, clear output buffer, switch off LEDs, reset repeat rate and delay to defaults. Disable the keyboard scan.
Reset keyboard, clear output buffer, switch off LEDs, reset repeat rate and delay to defaults.
Command f7: Set all keys to repeat
Keyboards that support scancode Set 3 keep for each key two bits: does it repeat? does it generate a break code? This command sets the "repeat" bit for all keys. It does not influence keyboard operation when the scancode set is not Set 3.
Command f8: Set all keys to give make/break codes
This command sets the "generate break code" bit for all keys. It does not influence keyboard operation when the scancode set is not Set 3.
Command f9: Set all keys to give make codes only
This command clears the "generate break code" bit for all keys. It does not influence keyboard operation when the scancode set is not Set 3.
Command fa: Set all keys to repeat and give make/break codes
This command sets the "repeat" and "generate break code" bits for all keys. It does not influence keyboard operation when the scancode set is not Set 3.
Command fb: Set some keys to repeat
This command sets the "repeat" bits for the indicated keys. It is followed by the untranslated Set 3 scancodes of the keys for which this bit must be set. The sequence is ended by a command code (ed, ee, f0, f2-ff). Afterwards, a "keyboard enable" f4 is required.
Command fc: Set some keys to give make/break codes
This command sets the "generate break code" bits for the indicated keys. It is followed by the untranslated Set 3 scancodes of the keys for which this bit must be set. The sequence is ended by a command code (ed, ee, f0, f2-ff). Afterwards, a "keyboard enable" f4 is required.
Command fd: Set some keys to give make codes only
This command clears the "generate break code" bits for the indicated keys. It is followed by the untranslated Set 3 scancodes of the keys for which this bit must be set. The sequence is ended by a recognized command code (such as ed, ee, f0, f2-ff). Afterwards, a "keyboard enable" f4 is required.
Meant for use by the keyboard controller after a transmission error. Not for use by the CPU.
Reset and self-test. The self-test (BAT) will return aa when OK, and fc otherwise. As part of the self-test, all LEDs are flashed.