unsigned char get_char(void){ unsigned char tmpchar; tmpchar=get_scancode(); tmpchar=translate_scancode(tmpchar); return tmpchar; }
int irq(int irq, void* data) { uint8_t scancode; uint8_t keycode = 0; int break_code = 0; // Status-Variablen fuer das Behandeln von e0- und e1-Scancodes static int e0_code = 0; // Wird auf 1 gesetzt, sobald e1 gelesen wurde, und auf 2, sobald das erste // Datenbyte gelesen wurde static int e1_code = 0; static uint16_t e1_prev = 0; scancode = inb(0x60); // Um einen Breakcode handelt es sich, wenn das oberste Bit gesetzt ist und // es kein e0 oder e1 fuer einen Extended-scancode ist if ((scancode & 0x80) && (e1_code || (scancode != 0xE1)) && (e0_code || (scancode != 0xE0))) { break_code = 1; scancode &= ~0x80; } if (e0_code) { // Fake shift abfangen und ignorieren if ((scancode == 0x2A) || (scancode == 0x36)) { e0_code = 0; kprintf("E0 ret\n"); return 0; } keycode = translate_scancode(1, scancode); e0_code = 0; } else if (e1_code == 2) { // Fertiger e1-Scancode // Zweiten Scancode in hoeherwertiges Byte packen e1_prev |= ((uint16_t) scancode << 8); keycode = translate_scancode(2, e1_prev); e1_code = 0; } else if (e1_code == 1) { // Erstes Byte fuer e1-Scancode e1_prev = scancode; e1_code++; } else if (scancode == 0xE0) { // Anfang eines e0-Codes e0_code = 1; } else if (scancode == 0xE1) { // Anfang eines e1-Codes e1_code = 1; } else { // Normaler Scancode keycode = translate_scancode(0, scancode); } if(keycode != 0) { while(rpc_check_future(irqFuture)); //Check future before issuing write, cause we reuse same dd page dd->data[0] = keycode; dd->data[1] = break_code; dd->data[2] = 0; dd->length = 2; irqFuture = fWrite("/dev/kbdRaw", dd); kprintf(" >%x:%x< ", keycode, break_code); return 1; } return 0; }
void handler_21h(void) { translate_scancode(); outb(0x20, 0x20); }