#include #include #include #ifdef __TESTING__ #include #include #endif #include #include bool is_shift_down = false; queue kb_cmd_queue; // current plan is to create a a multi d array // // // 16 entries each for each scan code... so // 0x01..0x0F (15)/ this is the top row, so esc - 1..0, etc // 0x10..0x1F (16) ... // 0x20..0x2F ... // these arrays will keep a 0/1 flag to see if these keys are pressed // as a stort of state machine // this will also let us tell multiple keys pressed // // another more simple version, which i could start with // // is do a Single character as currently pressed // and a bitflag we can mask for leftshift, leftctrl, right shift, right ctrl, alt, etc being pressed down // // // struct keyboard_state keyb_state; void init_kb(void) { #ifdef __TESTING__ puts("Initializing keyboard driver!"); #endif init_queue(&kb_cmd_queue); keyb_state.leds = 0; queue_kb_command(KEYB_CMD_ENABLE_SCANNING); queue_kb_command(KEYB_CMD_SET_DEFAULT_PARAMS); //queue_kb_command(KEYB_CMD_SET_TYPEMATIC); //queue_kb_command(0x1F); send_kb_commands(); #ifdef __TESTING__ puts("Initialized keyboard driver!"); #endif } void queue_kb_command(uint8_t command) {enqueue(&kb_cmd_queue, command);} void send_kb_commands(void) { int i; uint8_t resp, cmd; while (!queue_is_empty(&kb_cmd_queue)) { cmd = queue_peek(&kb_cmd_queue); for (i = 0; i < KEYB_CMD_RETRIES; i++) { outb(KEYB_PORT, cmd); io_wait(); resp = inb(KEYB_PORT); io_wait(); switch(resp) { case KEYB_RESP_ACK: break; case KEYB_RESP_RESEND: continue; default: break; } } dequeue(&kb_cmd_queue); } } kb_key_press_t decode_scancode(uint8_t scancode) {return (kb_key_press_t) scancode;}