void KeyboardManager::serviceIRQ(void) { uint8 scancode = kmi->data; #if QEMU_SENDS_SCANCODE_SET2 if(scancode == 0xf0) next_is_up_ = 1; #endif // left shift release (0xAA) and right shift release (0xB6) must not be ignored when scancode set 1 is sent by qemu: if (scancode > 0x80 && scancode != 0xAA && scancode != 0xB6) return; #if QEMU_SENDS_SCANCODE_SET2 scancode = SET1_SCANCODES[scancode]; if(next_is_up_) { next_is_up_ = 0; modifyKeyboardStatus(scancode | 0x80); return; } #endif if (extended_scancode == 0xE0) { if (scancode == 0x2A || scancode == 0x36 || scancode >= E0_BASE) { extended_scancode = 0; } scancode = E0_KEYS[scancode]; } else if (extended_scancode == 0xE1 && scancode == 0x1D) { extended_scancode = 0x100; } else if (extended_scancode == 0x100 && scancode == 0x45) scancode = E1_PAUSE; extended_scancode = 0; if (scancode == 0xFF || scancode == 0xFA || scancode == 0xFE || scancode == 0x00) // non parsable codes, ACK and keyb. buffer errors { debug(A_KB_MANAGER, "Non-parsable scancode %X \n", scancode); } if (scancode == 0xE0 || scancode == 0xE1) { extended_scancode = scancode; } modifyKeyboardStatus(scancode); setLEDs(); // setting the leds if (main_console) { keyboard_buffer_.put(scancode); // put it inside the buffer } }
void KeyboardManager::serviceIRQ(void) { uint8 scancode = kmi->data; if(scancode == 0xf0) next_is_up_ = 1; if (scancode > 0x80) return; scancode = SET1_SCANCODES[scancode]; if(next_is_up_) { next_is_up_ = 0; modifyKeyboardStatus(scancode | 0x80); return; } if (extended_scancode == 0xE0) { if (scancode == 0x2A || scancode == 0x36 || scancode >= E0_BASE) { extended_scancode = 0; } scancode = E0_KEYS[scancode]; } else if (extended_scancode == 0xE1 && scancode == 0x1D) { extended_scancode = 0x100; } else if (extended_scancode == 0x100 && scancode == 0x45) scancode = E1_PAUSE; extended_scancode = 0; if (scancode == 0xFF || scancode == 0xFA || scancode == 0xFE || scancode == 0x00) // non parsable codes, ACK and keyb. buffer errors { debug(A_KB_MANAGER, "Non-parsable scancode %X \n", scancode); } if (scancode == 0xE0 || scancode == 0xE1) { extended_scancode = scancode; } modifyKeyboardStatus(scancode); setLEDs(); // setting the leds if (main_console) { keyboard_buffer_.put(scancode); // put it inside the buffer } }
void KeyboardManager::serviceIRQ(void) { send_cmd(0xAD); // disable the keyboard kb_wait(); uint8 scancode = inportb(0x60); if (extended_scancode == 0xE0) { if (scancode == 0x2A || scancode == 0x36 || scancode >= E0_BASE) { extended_scancode = 0; send_cmd(0xAE); // enable the keyboard return; } scancode = E0_KEYS[scancode]; } else if (extended_scancode == 0xE1 && scancode == 0x1D) { extended_scancode = 0x100; send_cmd(0xAE); // enable the keyboard return; } else if (extended_scancode == 0x100 && scancode == 0x45) scancode = E1_PAUSE; extended_scancode = 0; if (scancode == 0xFF || scancode == 0xFA || scancode == 0xFE || scancode == 0x00) // non parsable codes, ACK and keyb. buffer errors { debug(A_KB_MANAGER, "Non-parsable scancode %X \n", scancode); send_cmd(0xAE); // enable the keyboard return; } if (scancode == 0xE0 || scancode == 0xE1) { extended_scancode = scancode; send_cmd(0xAE); // enable the keyboard return; } modifyKeyboardStatus(scancode); setLEDs(); // setting the leds if ((scancode & 0200)) // if a key was released just ignore it { send_cmd(0xAE); // enable the keyboard return; } if (main_console) { keyboard_buffer_.put(scancode); // put it inside the buffer main_console->addJob(); } send_cmd(0xAE); // enable the keyboard }