/* 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 query_mode (void) { grub_uint8_t ret; int e; e = write_mode (0); if (!e) return 0; keyboard_controller_wait_until_ready (); do ret = grub_inb (KEYBOARD_REG_DATA); while (ret == GRUB_AT_ACK); /* QEMU translates the set even in no-translate mode. */ if (ret == 0x43 || ret == 1) return 1; if (ret == 0x41 || ret == 2) return 2; if (ret == 0x3f || ret == 3) return 3; return 0; }
static grub_uint8_t grub_keyboard_controller_read (void) { at_command (KEYBOARD_COMMAND_READ); keyboard_controller_wait_until_ready (); return grub_inb (KEYBOARD_REG_DATA); }
static grub_uint8_t grub_keyboard_controller_read (void) { keyboard_controller_wait_until_ready (); grub_outb (KEYBOARD_COMMAND_READ, KEYBOARD_REG_STATUS); return grub_inb (KEYBOARD_REG_DATA); }
static grub_uint8_t wait_ack (void) { grub_uint64_t endtime; grub_uint8_t ack; endtime = grub_get_time_ms () + 20; do ack = grub_inb (KEYBOARD_REG_DATA); while (ack != GRUB_AT_ACK && ack != GRUB_AT_NACK && grub_get_time_ms () < endtime); return ack; }
static grub_err_t grub_cmd_write (grub_command_t cmd, int argc, char **argv) { grub_target_addr_t addr; grub_uint32_t value; grub_uint32_t mask = 0xffffffff; if (argc != 2 && argc != 3) return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid number of arguments"); addr = grub_strtoul (argv[0], 0, 0); value = grub_strtoul (argv[1], 0, 0); if (argc == 3) mask = grub_strtoul (argv[2], 0, 0); value &= mask; switch (cmd->name[sizeof ("out") - 1]) { case 'l': if (mask != 0xffffffff) grub_outl ((grub_inl (addr) & ~mask) | value, addr); else grub_outl (value, addr); break; case 'w': if ((mask & 0xffff) != 0xffff) grub_outw ((grub_inw (addr) & ~mask) | value, addr); else grub_outw (value, addr); break; case 'b': if ((mask & 0xff) != 0xff) grub_outb ((grub_inb (addr) & ~mask) | value, addr); else grub_outb (value, addr); break; } return 0; }
static grub_err_t grub_cmd_read (grub_extcmd_t cmd, int argc, char **argv) { grub_target_addr_t addr; grub_uint32_t value = 0; char buf[sizeof ("XXXXXXXX")]; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid number of arguments"); addr = grub_strtoul (argv[0], 0, 0); switch (cmd->cmd->name[sizeof ("in") - 1]) { case 'l': value = grub_inl (addr); break; case 'w': value = grub_inw (addr); break; case 'b': value = grub_inb (addr); break; } if (cmd->state[0].set) { grub_snprintf (buf, sizeof (buf), "%x", value); grub_env_set (cmd->state[0].arg, buf); } else grub_printf ("0x%x\n", value); return 0; }
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; }
static void keyboard_controller_wait_until_ready (void) { while (! KEYBOARD_COMMAND_ISREADY (grub_inb (KEYBOARD_REG_STATUS))); }
unsigned char readPort1 (unsigned short int port) { return grub_inb(port); }