static void grub_keyboard_controller_write (grub_uint8_t c) { keyboard_controller_wait_until_ready (); grub_outb (KEYBOARD_COMMAND_WRITE, KEYBOARD_REG_STATUS); grub_outb (c, KEYBOARD_REG_DATA); }
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 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_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 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); }
/* Stop the floppy drive from spinning, so that other software is jumped to with a known state. */ void grub_stop_floppy (void) { grub_outb (0, GRUB_FLOPPY_REG_DIGITAL_OUTPUT); }
void writePort1 (unsigned short int port, unsigned char value) { grub_outb(value, port); }