// GET KEYBOARD ID static void noinline handle_160a(struct bregs *regs) { u8 param[2]; int ret = kbd_command(ATKBD_CMD_GETID, param); if (ret) { regs->bx = 0; return; } regs->bx = (param[1] << 8) | param[0]; }
static void keyboard_init() { /* flush incoming keys */ int ret = i8042_flush(); if (ret) return; // Controller self-test. u8 param[2]; ret = i8042_command(I8042_CMD_CTL_TEST, param); if (ret) return; if (param[0] != 0x55) { dprintf(1, "i8042 self test failed (got %x not 0x55)\n", param[0]); return; } // Controller keyboard test. ret = i8042_command(I8042_CMD_KBD_TEST, param); if (ret) return; if (param[0] != 0x00) { dprintf(1, "i8042 keyboard test failed (got %x not 0x00)\n", param[0]); return; } // Enable keyboard and mouse ports. ret = i8042_command(I8042_CMD_KBD_ENABLE, NULL); if (ret) return; ret = i8042_command(I8042_CMD_AUX_ENABLE, NULL); if (ret) return; /* ------------------- keyboard side ------------------------*/ /* reset keyboard and self test (keyboard side) */ ret = kbd_command(ATKBD_CMD_RESET_BAT, param); if (ret) return; if (param[0] != 0xaa) { dprintf(1, "keyboard self test failed (got %x not 0xaa)\n", param[0]); return; } /* Disable keyboard */ ret = kbd_command(ATKBD_CMD_RESET_DIS, NULL); if (ret) return; // Set scancode command (mode 2) param[0] = 0x02; ret = kbd_command(ATKBD_CMD_SSCANSET, param); if (ret) return; // Keyboard Mode: scan code convert, disable mouse, enable IRQ 1 SET_EBDA(ps2ctr, I8042_CTR_AUXDIS | I8042_CTR_XLATE | I8042_CTR_KBDINT); /* Enable keyboard */ ret = kbd_command(ATKBD_CMD_ENABLE, NULL); if (ret) return; dprintf(1, "keyboard initialized\n"); }
void command_loop(void) { int i, nfds; BUFFER buf0, buf1; fd_set readfds; struct timeval to; for (i = 0; ; i++) { BUFFER *cur, *prev; if (i == 0) { cur = prev = &buf0; } else if (i % 2 == 0) { cur = &buf0; prev = &buf1; } else { cur = &buf1; prev = &buf0; } read_result(cur); redraw: display(cur, prev, reverse_mode); input: to = opt_interval; FD_ZERO(&readfds); FD_SET(fileno(stdin), &readfds); nfds = select(1, &readfds, NULL, NULL, (pause_status)? NULL : &to); if (nfds < 0) switch (errno) { case EINTR: /* * ncurses has changed the window size with * SIGWINCH. call doupdate() to use the * updated window size. */ doupdate(); goto redraw; default: perror("select"); } else if (nfds > 0) { int ch = getch(); kbd_result_t result = kbd_command(ch); switch (result) { case RSLT_UPDATE: /* update buffer */ break; case RSLT_REDRAW: /* scroll with current buffer */ goto redraw; case RSLT_NOTOUCH: /* silently loop again */ goto input; case RSLT_ERROR: /* error */ fprintf(stderr, "\007"); goto input; } } } }