示例#1
0
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
  }

}
示例#2
0
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
}