mirror of
https://review.haiku-os.org/haiku
synced 2024-11-23 07:18:40 +01:00
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:
parent
c6aa02dc69
commit
1132ecca07
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
|
|
||||||
const static uint32 kATKeycodeMap[] = {
|
const static uint32 kATKeycodeMap[] = {
|
||||||
0x1, // Esc
|
0x1, // Esc 1
|
||||||
0x12, // 1
|
0x12, // 1
|
||||||
0x13, // 2
|
0x13, // 2
|
||||||
0x14, // 3
|
0x14, // 3
|
||||||
@ -20,7 +20,7 @@ const static uint32 kATKeycodeMap[] = {
|
|||||||
0x17, // 6
|
0x17, // 6
|
||||||
0x18, // 7
|
0x18, // 7
|
||||||
0x19, // 8
|
0x19, // 8
|
||||||
0x1a, // 9
|
0x1a, // 9 10
|
||||||
0x1b, // 0
|
0x1b, // 0
|
||||||
0x1c, // -
|
0x1c, // -
|
||||||
0x1d, // =
|
0x1d, // =
|
||||||
@ -30,7 +30,7 @@ const static uint32 kATKeycodeMap[] = {
|
|||||||
0x28, // W
|
0x28, // W
|
||||||
0x29, // E
|
0x29, // E
|
||||||
0x2a, // R
|
0x2a, // R
|
||||||
0x2b, // T
|
0x2b, // T 20
|
||||||
0x2c, // Y
|
0x2c, // Y
|
||||||
0x2d, // U
|
0x2d, // U
|
||||||
0x2e, // I
|
0x2e, // I
|
||||||
@ -40,7 +40,7 @@ const static uint32 kATKeycodeMap[] = {
|
|||||||
0x32, // ]
|
0x32, // ]
|
||||||
0x47, // ENTER
|
0x47, // ENTER
|
||||||
0x5c, // Left Control
|
0x5c, // Left Control
|
||||||
0x3c, // A
|
0x3c, // A 30
|
||||||
0x3d, // S
|
0x3d, // S
|
||||||
0x3e, // D
|
0x3e, // D
|
||||||
0x3f, // F
|
0x3f, // F
|
||||||
@ -50,7 +50,7 @@ const static uint32 kATKeycodeMap[] = {
|
|||||||
0x43, // K
|
0x43, // K
|
||||||
0x44, // L
|
0x44, // L
|
||||||
0x45, // ;
|
0x45, // ;
|
||||||
0x46, // '
|
0x46, // ' 40
|
||||||
0x11, // `
|
0x11, // `
|
||||||
0x4b, // Left Shift
|
0x4b, // Left Shift
|
||||||
0x33, // \ (backslash -- note: don't remove non-white-space after BS char)
|
0x33, // \ (backslash -- note: don't remove non-white-space after BS char)
|
||||||
@ -60,7 +60,7 @@ const static uint32 kATKeycodeMap[] = {
|
|||||||
0x4f, // V
|
0x4f, // V
|
||||||
0x50, // B
|
0x50, // B
|
||||||
0x51, // N
|
0x51, // N
|
||||||
0x52, // M
|
0x52, // M 50
|
||||||
0x53, // ,
|
0x53, // ,
|
||||||
0x54, // .
|
0x54, // .
|
||||||
0x55, // /
|
0x55, // /
|
||||||
@ -70,7 +70,7 @@ const static uint32 kATKeycodeMap[] = {
|
|||||||
0x5e, // Space
|
0x5e, // Space
|
||||||
0x3b, // Caps
|
0x3b, // Caps
|
||||||
0x02, // F1
|
0x02, // F1
|
||||||
0x03, // F2
|
0x03, // F2 60
|
||||||
0x04, // F3
|
0x04, // F3
|
||||||
0x05, // F4
|
0x05, // F4
|
||||||
0x06, // F5
|
0x06, // F5
|
||||||
@ -80,7 +80,7 @@ const static uint32 kATKeycodeMap[] = {
|
|||||||
0x0a, // F9
|
0x0a, // F9
|
||||||
0x0b, // F10
|
0x0b, // F10
|
||||||
0x22, // Num
|
0x22, // Num
|
||||||
0x0f, // Scroll
|
0x0f, // Scroll 70
|
||||||
0x37, // KP 7
|
0x37, // KP 7
|
||||||
0x38, // KP 8
|
0x38, // KP 8
|
||||||
0x39, // KP 9
|
0x39, // KP 9
|
||||||
@ -90,11 +90,11 @@ const static uint32 kATKeycodeMap[] = {
|
|||||||
0x4a, // KP 6
|
0x4a, // KP 6
|
||||||
0x3a, // KP +
|
0x3a, // KP +
|
||||||
0x58, // KP 1
|
0x58, // KP 1
|
||||||
0x59, // KP 2
|
0x59, // KP 2 80
|
||||||
0x5a, // KP 3
|
0x5a, // KP 3
|
||||||
0x64, // KP 0
|
0x64, // KP 0
|
||||||
0x65, // KP .
|
0x65, // KP .
|
||||||
0x00, // UNMAPPED
|
0x7e, // SystReq
|
||||||
0x00, // UNMAPPED
|
0x00, // UNMAPPED
|
||||||
0x69, // <
|
0x69, // <
|
||||||
0x0c, // F11
|
0x0c, // F11
|
||||||
@ -208,7 +208,7 @@ const static uint32 kATKeycodeMap[] = {
|
|||||||
0x00, // UNMAPPED
|
0x00, // UNMAPPED
|
||||||
0x00, // UNMAPPED
|
0x00, // UNMAPPED
|
||||||
0x00, // UNMAPPED
|
0x00, // UNMAPPED
|
||||||
0x7f, // Break
|
0x10, // Pause
|
||||||
0x20, // Home
|
0x20, // Home
|
||||||
0x57, // Up Arrow 200
|
0x57, // Up Arrow 200
|
||||||
0x21, // Page Up
|
0x21, // Page Up
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Authors (in chronological order):
|
* Authors (in chronological order):
|
||||||
* Stefano Ceccherini (burton666@libero.it)
|
* Stefano Ceccherini (burton666@libero.it)
|
||||||
* Axel Dörfler, axeld@pinc-software.de
|
* Axel Dörfler, axeld@pinc-software.de
|
||||||
* Marcus Overhagen <marcus@overhagen.de>
|
* Marcus Overhagen <marcus@overhagen.de>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -37,12 +37,14 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
EXTENDED_KEY = 0xe0,
|
EXTENDED_KEY_0 = 0xe0,
|
||||||
|
EXTENDED_KEY_1 = 0xe1,
|
||||||
|
|
||||||
LEFT_ALT_KEY = 0x38,
|
LEFT_ALT_KEY = 0x38,
|
||||||
RIGHT_ALT_KEY = 0xb8,
|
RIGHT_ALT_KEY = 0xb8,
|
||||||
SYS_REQ_KEY = 0x54,
|
SYS_REQ_KEY = 0x54,
|
||||||
PRNT_SCRN_KEY = 0x80 | 0x37,
|
PRNT_SCRN_KEY = 0x80 | 0x37,
|
||||||
|
PAUSE_KEY = 0x80 | 0x46,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -58,7 +60,9 @@ static bool sHasKeyboardReader = false;
|
|||||||
static bool sHasDebugReader = false;
|
static bool sHasDebugReader = false;
|
||||||
static sem_id sKeyboardSem;
|
static sem_id sKeyboardSem;
|
||||||
static struct packet_buffer *sKeyBuffer;
|
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 int32 sKeyboardRepeatRate;
|
||||||
static bigtime_t sKeyboardRepeatDelay;
|
static bigtime_t sKeyboardRepeatDelay;
|
||||||
@ -126,6 +130,8 @@ keyboard_handle_int(ps2_dev *dev)
|
|||||||
EMERGENCY_RIGHT_ALT = 0x02,
|
EMERGENCY_RIGHT_ALT = 0x02,
|
||||||
EMERGENCY_SYS_REQ = 0x04,
|
EMERGENCY_SYS_REQ = 0x04,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const uint8 pauseSequence[] = { 0x1D, 0x45 };
|
||||||
static int emergencyKeyStatus = 0;
|
static int emergencyKeyStatus = 0;
|
||||||
raw_key_info keyInfo;
|
raw_key_info keyInfo;
|
||||||
uint8 scancode = dev->history[0].data;
|
uint8 scancode = dev->history[0].data;
|
||||||
@ -133,15 +139,17 @@ keyboard_handle_int(ps2_dev *dev)
|
|||||||
if (atomic_get(&sKeyboardOpenCount) == 0)
|
if (atomic_get(&sKeyboardOpenCount) == 0)
|
||||||
return B_HANDLED_INTERRUPT;
|
return B_HANDLED_INTERRUPT;
|
||||||
|
|
||||||
// TODO: Handle braindead "pause" key special case
|
if (scancode == EXTENDED_KEY_0) {
|
||||||
|
sIsExtended0 = true;
|
||||||
if (scancode == EXTENDED_KEY) {
|
//TRACE("Extended key 0\n");
|
||||||
sIsExtended = true;
|
|
||||||
// TRACE("Extended key\n");
|
|
||||||
return B_HANDLED_INTERRUPT;
|
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) {
|
if ((scancode & 0x80) != 0) {
|
||||||
keyInfo.is_keydown = false;
|
keyInfo.is_keydown = false;
|
||||||
@ -149,9 +157,23 @@ keyboard_handle_int(ps2_dev *dev)
|
|||||||
} else
|
} else
|
||||||
keyInfo.is_keydown = true;
|
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;
|
scancode |= 0x80;
|
||||||
sIsExtended = false;
|
sIsExtended0 = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle emergency keys
|
// Handle emergency keys
|
||||||
|
Loading…
Reference in New Issue
Block a user