PS/2 Keyboard: fix handling of Pause key.

- There is one single "Puase" key also acting as "Break"
- For historical reasons it sends a complex sequence (control + num lock) instead of having its own key code

Change-Id: If9fd84caf9a06cd8409b9c3642fe313a7c01fad1
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3449
Reviewed-by: Alex von Gluck IV <kallisti5@unixzen.com>
Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>
This commit is contained in:
user 2020-09-16 22:53:41 +02:00 committed by Alex von Gluck IV
parent c6aa02dc69
commit 1132ecca07
2 changed files with 44 additions and 22 deletions

View File

@ -11,7 +11,7 @@
const static uint32 kATKeycodeMap[] = {
0x1, // Esc
0x1, // Esc 1
0x12, // 1
0x13, // 2
0x14, // 3
@ -20,7 +20,7 @@ const static uint32 kATKeycodeMap[] = {
0x17, // 6
0x18, // 7
0x19, // 8
0x1a, // 9
0x1a, // 9 10
0x1b, // 0
0x1c, // -
0x1d, // =
@ -30,7 +30,7 @@ const static uint32 kATKeycodeMap[] = {
0x28, // W
0x29, // E
0x2a, // R
0x2b, // T
0x2b, // T 20
0x2c, // Y
0x2d, // U
0x2e, // I
@ -40,7 +40,7 @@ const static uint32 kATKeycodeMap[] = {
0x32, // ]
0x47, // ENTER
0x5c, // Left Control
0x3c, // A
0x3c, // A 30
0x3d, // S
0x3e, // D
0x3f, // F
@ -50,7 +50,7 @@ const static uint32 kATKeycodeMap[] = {
0x43, // K
0x44, // L
0x45, // ;
0x46, // '
0x46, // ' 40
0x11, // `
0x4b, // Left Shift
0x33, // \ (backslash -- note: don't remove non-white-space after BS char)
@ -60,7 +60,7 @@ const static uint32 kATKeycodeMap[] = {
0x4f, // V
0x50, // B
0x51, // N
0x52, // M
0x52, // M 50
0x53, // ,
0x54, // .
0x55, // /
@ -70,7 +70,7 @@ const static uint32 kATKeycodeMap[] = {
0x5e, // Space
0x3b, // Caps
0x02, // F1
0x03, // F2
0x03, // F2 60
0x04, // F3
0x05, // F4
0x06, // F5
@ -80,7 +80,7 @@ const static uint32 kATKeycodeMap[] = {
0x0a, // F9
0x0b, // F10
0x22, // Num
0x0f, // Scroll
0x0f, // Scroll 70
0x37, // KP 7
0x38, // KP 8
0x39, // KP 9
@ -90,11 +90,11 @@ const static uint32 kATKeycodeMap[] = {
0x4a, // KP 6
0x3a, // KP +
0x58, // KP 1
0x59, // KP 2
0x59, // KP 2 80
0x5a, // KP 3
0x64, // KP 0
0x65, // KP .
0x00, // UNMAPPED
0x7e, // SystReq
0x00, // UNMAPPED
0x69, // <
0x0c, // F11
@ -208,7 +208,7 @@ const static uint32 kATKeycodeMap[] = {
0x00, // UNMAPPED
0x00, // UNMAPPED
0x00, // UNMAPPED
0x7f, // Break
0x10, // Pause
0x20, // Home
0x57, // Up Arrow 200
0x21, // Page Up

View File

@ -5,7 +5,7 @@
* Authors (in chronological order):
* Stefano Ceccherini (burton666@libero.it)
* Axel Dörfler, axeld@pinc-software.de
* Marcus Overhagen <marcus@overhagen.de>
* Marcus Overhagen <marcus@overhagen.de>
*/
@ -37,12 +37,14 @@ enum {
};
enum {
EXTENDED_KEY = 0xe0,
EXTENDED_KEY_0 = 0xe0,
EXTENDED_KEY_1 = 0xe1,
LEFT_ALT_KEY = 0x38,
RIGHT_ALT_KEY = 0xb8,
SYS_REQ_KEY = 0x54,
PRNT_SCRN_KEY = 0x80 | 0x37,
PAUSE_KEY = 0x80 | 0x46,
};
@ -58,7 +60,9 @@ static bool sHasKeyboardReader = false;
static bool sHasDebugReader = false;
static sem_id sKeyboardSem;
static struct packet_buffer *sKeyBuffer;
static bool sIsExtended = false;
static bool sIsExtended0 = false;
static bool sIsExtended1 = false;
static uint8 sPauseSequenceRead = 0;
static int32 sKeyboardRepeatRate;
static bigtime_t sKeyboardRepeatDelay;
@ -126,6 +130,8 @@ keyboard_handle_int(ps2_dev *dev)
EMERGENCY_RIGHT_ALT = 0x02,
EMERGENCY_SYS_REQ = 0x04,
};
static const uint8 pauseSequence[] = { 0x1D, 0x45 };
static int emergencyKeyStatus = 0;
raw_key_info keyInfo;
uint8 scancode = dev->history[0].data;
@ -133,15 +139,17 @@ keyboard_handle_int(ps2_dev *dev)
if (atomic_get(&sKeyboardOpenCount) == 0)
return B_HANDLED_INTERRUPT;
// TODO: Handle braindead "pause" key special case
if (scancode == EXTENDED_KEY) {
sIsExtended = true;
// TRACE("Extended key\n");
if (scancode == EXTENDED_KEY_0) {
sIsExtended0 = true;
//TRACE("Extended key 0\n");
return B_HANDLED_INTERRUPT;
}
// TRACE("scancode: %x\n", scancode);
if (scancode == EXTENDED_KEY_1) {
sIsExtended1 = true;
//TRACE("Extended key 1\n");
return B_HANDLED_INTERRUPT;
}
if ((scancode & 0x80) != 0) {
keyInfo.is_keydown = false;
@ -149,9 +157,23 @@ keyboard_handle_int(ps2_dev *dev)
} else
keyInfo.is_keydown = true;
if (sIsExtended) {
// TRACE("scancode: %x\n", scancode);
// Handle braindead "pause" key special case
if (sIsExtended1 && scancode == pauseSequence[sPauseSequenceRead]) {
sPauseSequenceRead++;
if (sPauseSequenceRead == 2) {
sIsExtended1 = false;
sPauseSequenceRead = 0;
scancode = PAUSE_KEY;
} else {
return B_HANDLED_INTERRUPT;
}
}
if (sIsExtended0) {
scancode |= 0x80;
sIsExtended = false;
sIsExtended0 = false;
}
// Handle emergency keys