static void keyboard_controller_led (grub_uint8_t leds) { keyboard_controller_wait_until_ready (); grub_outb (0xed, KEYBOARD_REG_DATA); keyboard_controller_wait_until_ready (); grub_outb (leds & 0x7, KEYBOARD_REG_DATA); }
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 void grub_keyboard_controller_write (grub_uint8_t c) { at_command (KEYBOARD_COMMAND_WRITE); keyboard_controller_wait_until_ready (); grub_outb (c, 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 int write_mode (int mode) { unsigned i; for (i = 0; i < GRUB_AT_TRIES; i++) { grub_uint8_t ack; keyboard_controller_wait_until_ready (); grub_outb (0xf0, KEYBOARD_REG_DATA); keyboard_controller_wait_until_ready (); grub_outb (mode, KEYBOARD_REG_DATA); keyboard_controller_wait_until_ready (); ack = wait_ack (); if (ack == GRUB_AT_NACK) continue; if (ack == GRUB_AT_ACK) break; return 0; } return (i != GRUB_AT_TRIES); }
static int at_command (grub_uint8_t data) { unsigned i; for (i = 0; i < GRUB_AT_TRIES; i++) { grub_uint8_t ack; keyboard_controller_wait_until_ready (); grub_outb (data, KEYBOARD_REG_STATUS); ack = wait_ack (); if (ack == GRUB_AT_NACK) continue; if (ack == GRUB_AT_ACK) break; return 0; } return (i != GRUB_AT_TRIES); }