/* If there is a raw key pending, return it; otherwise return -1. */ static int grub_keyboard_getkey (void) { grub_uint8_t key; if (! KEYBOARD_ISREADY (grub_inb (KEYBOARD_REG_STATUS))) return -1; key = grub_inb (KEYBOARD_REG_DATA); /* FIXME */ grub_keyboard_isr (key); if (! KEYBOARD_ISMAKE (key)) return -1; return (KEYBOARD_SCANCODE (key)); }
static int fetch_key (int *is_break) { int was_ext = 0; grub_uint8_t at_key; int ret = 0; if (! KEYBOARD_ISREADY (grub_inb (KEYBOARD_REG_STATUS))) return -1; at_key = grub_inb (KEYBOARD_REG_DATA); if (at_key == 0xe0) { e0_received = 1; return -1; } if ((current_set == 2 || current_set == 3) && at_key == 0xf0) { f0_received = 1; return -1; } /* Setting LEDs may generate ACKs. */ if (at_key == GRUB_AT_ACK) return -1; was_ext = e0_received; e0_received = 0; switch (current_set) { case 1: *is_break = !!(at_key & 0x80); if (!was_ext) ret = set1_mapping[at_key & 0x7f]; else { unsigned i; for (i = 0; i < ARRAY_SIZE (set1_e0_mapping); i++) if (set1_e0_mapping[i].from == (at_key & 0x7f)) { ret = set1_e0_mapping[i].to; break; } } break; case 2: *is_break = f0_received; f0_received = 0; if (!was_ext) ret = set2_mapping[at_key]; else { unsigned i; for (i = 0; i < ARRAY_SIZE (set2_e0_mapping); i++) if (set2_e0_mapping[i].from == at_key) { ret = set2_e0_mapping[i].to; break; } } break; default: return -1; } if (!ret) { if (was_ext) grub_printf ("Unknown key 0xe0+0x%02x from set %d\n", at_key, current_set); else grub_printf ("Unknown key 0x%02x from set %d\n", at_key, current_set); return -1; } return ret; }