static void kbd_put(u_char c, int ms, int port) { while (kbd_inb(KBD_STATUS_REG) & KBD_STAT_IBF) { if (--ms < 0) return; #ifdef __BOOT__ boot_udelay(1000); #else rtems_bsp_delay(1000); #endif } kbd_outb(port, c); }
/*-------------------------------------------------------------------------+ | Function: _IBMPC_scankey | Description: This function can be called during a poll for input, or by | an ISR. Basically any time you want to process a keypress. | Global Variables: key_map, shift_map. | Arguments: outChar - character read in case of a valid reading, | otherwise unchanged. | Returns: true in case a valid character has been read, | false otherwise. +--------------------------------------------------------------------------*/ bool _IBMPC_scankey(char *outChar) { unsigned char inChar; static int alt_pressed = 0; static int ctrl_pressed = 0; static int shift_pressed = 0; static int caps_pressed = 0; static int extended = 0; *outChar = 0; /* default value if we return false */ /* Read keyboard controller, toggle enable */ inChar=kbd_inb(KBD_CTL); kbd_outb(KBD_CTL, inChar & ~0x80); kbd_outb(KBD_CTL, inChar | 0x80); kbd_outb(KBD_CTL, inChar & ~0x80); /* See if it has data */ inChar=kbd_inb(KBD_STATUS); if ((inChar & 0x01) == 0) return false; /* Read the data. Handle nonsense with shift, control, etc. */ inChar=kbd_inb(KBD_DATA); if (extended) extended--; switch (inChar) { case 0xe0: extended = 2; return false; break; case 0x38: alt_pressed = 1; return false; break; case 0xb8: alt_pressed = 0; return false; break; case 0x1d: ctrl_pressed = 1; return false; break; case 0x9d: ctrl_pressed = 0; return false; break; case 0x2a: if (extended) return false; case 0x36: shift_pressed = 1; return false; break; case 0xaa: if (extended) return false; case 0xb6: shift_pressed = 0; return false; break; case 0x3a: caps_pressed = 1; return false; break; case 0xba: caps_pressed = 0; return false; break; case 0x53: if (ctrl_pressed && alt_pressed) bsp_reset(); /* ctrl+alt+del -> reboot */ break; /* * Ignore unrecognized keys--usually arrow and such */ default: if ((inChar & 0x80) || (inChar > 0x39)) /* High-bit on means key is being released, not pressed */ return false; break; } /* switch */ /* Strip high bit, look up in our map */ inChar &= 0x7f; if (ctrl_pressed) { *outChar = key_map[inChar]; *outChar &= 037; } else { *outChar = shift_pressed ? shift_map[inChar] : key_map[inChar]; if (caps_pressed) { if (*outChar >= 'A' && *outChar <= 'Z') *outChar += 'a' - 'A'; else if (*outChar >= 'a' && *outChar <= 'z') *outChar -= 'a' - 'A'; } } return true; } /* _IBMPC_scankey */