Esempio n. 1
0
void KeyboardHandler(Registers* registers)
{
    char c;
    BYTE key = IoReadPortByte(KB_DATA_REGISTER);

    if(key & KEY_RELEASED_MASK)
    {
        key = key - 128;
        c = keyCodes[key];
        if(c == LSHIFT)
            controlKeyState &= ~CONTROL_KEY_SHIFT;
        /*AddKeyToBuffer(c);*/
    }
    else
    {
        c = keyCodes[key];

        if(c == LSHIFT)
        {
            controlKeyState |= CONTROL_KEY_SHIFT; // fixme - might want to add this to buffer and handle shift at a higher level...
            return;
        }

        if(controlKeyState & CONTROL_KEY_SHIFT)
            c = shiftKeyCodes[key];

        AddKeyToBuffer(c);
    }

    /*AddKeyToBuffer(c);*/
}
Esempio n. 2
0
static hvm_status i8042ReadKeyboardData(Bit8u* pc, hvm_bool* pisMouse)
{
  Bit8u port_status;

  port_status = IoReadPortByte(KEYB_REGISTER_STATUS);

  if (port_status & KEYB_STATUS_OBUFFER_FULL) {
    /* Data is available */
    *pc = IoReadPortByte(KEYB_REGISTER_DATA);

    /* Check if data is valid (i.e., no timeout, no parity error) */
    if ((port_status & KEYB_STATUS_PARITY_ERROR) == 0) {
      /* Check if this is a mouse event or not */
      *pisMouse = (port_status & KEYB_STATUS_TRANSMIT_TIMEOUT) != 0;
      return HVM_STATUS_SUCCESS;
    }
  }

  return HVM_STATUS_UNSUCCESSFUL;
}
Esempio n. 3
0
static hvm_bool i8042WriteKeyboardData(Bit16u addr, Bit8u data)
{
  Bit32u counter;

  counter = POLL_STATUS_ITERATIONS;
  while ((KEYB_STATUS_IBUFFER_FULL & IoReadPortByte(KEYB_REGISTER_STATUS)) &&
	 (counter--)) {
    CmSleep(1);
  }

  if (counter) {
    IoWritePortByte(addr, data);
    return TRUE;
  }

  return FALSE;
}
Esempio n. 4
0
/* Inspired from ReactOS's i8042 keyboard driver */
hvm_status KeyboardReadKeystroke(Bit8u* pc, hvm_bool unget, hvm_bool* pisMouse)
{
  Bit32u counter;
  Bit8u port_status, scancode;
  hvm_status r;

  counter = POLL_STATUS_ITERATIONS;
  while (counter) {
    port_status = IoReadPortByte(KEYB_REGISTER_STATUS);

    r = i8042ReadKeyboardData(&scancode, pisMouse);

    if (r == HVM_STATUS_SUCCESS) {
      break;
    }

    CmSleep(1);

    counter--;
  }

  if (counter == 0) {
    return HVM_STATUS_UNSUCCESSFUL;
  }

  if (unget) {
    /* Echo back the scancode */
    i8042WriteKeyboardData(KEYB_REGISTER_COMMAND, KEYB_COMMAND_DISABLE_KEYBOARD);
    i8042WriteKeyboardData(KEYB_REGISTER_COMMAND, KEYB_COMMAND_WRITE_OUTPUT);
    i8042WriteKeyboardData(KEYB_REGISTER_DATA, scancode);
    i8042WriteKeyboardData(KEYB_REGISTER_COMMAND, KEYB_COMMAND_ENABLE_KEYBOARD);
  }

  *pc = scancode;

  return HVM_STATUS_SUCCESS;
}