static int init_kbd(unsigned ss, unsigned typematic, unsigned xlat) { while(read_kbd() != -1) /* nothing */; /* disable keyboard before programming it */ write_kbd_await_ack(0xF5); /* disable PS/2 mouse, set SYS bit, and Enable Keyboard Interrupt... */ write_kbd(0x64, 0x60); /*jach: enable mouse */ //write_kbd(0x64, 0xA8); /* ...and either disable or enable AT-to-XT keystroke conversion */ write_kbd(0x60, xlat ? 0x65 : 0x25); /* program desired scancode set */ write_kbd_await_ack(0xF0); write_kbd_await_ack(ss); /* we want all keys to return both a make code (when pressed) and a break code (when released -- scancode set 3 only) */ if(ss == 3) { write_kbd_await_ack(0xFA); } /* set typematic delay and rate */ write_kbd_await_ack(0xF3); write_kbd_await_ack(typematic); /* enable keyboard */ write_kbd_await_ack(0xF4); return 0; }
void bioscon_read(register struct tty * tty) { char c = read_kbd(); if (c == '\r') c = '\n'; chq_addch(&tty->inq, c, 0); }
// 1 = succes u_char write_kbd_await_ack(u_char val) { u_char got; write_kbd(0x60, val); got = read_kbd(); if(got != 0xFA) { k_printf("write_kbd_await_ack: expected acknowledge (0xFA), got 0x%x\n", got); return 0; }; return 1; };
static int write_kbd_await_ack(unsigned val) { int got; write_kbd(0x60, val); got = read_kbd(); if(got != 0xFA) { return -1; } return 0; };
// returns current scancode set, or 0 upon failer u_char kbd_curr_scancode_set() { write_kbd_await_ack(0xF0); write_kbd(0x60, 0); return(read_kbd()); // return scancode set };