Esempio n. 1
0
unsigned char get_char(void){
	unsigned char tmpchar;
	tmpchar=get_scancode();
	tmpchar=translate_scancode(tmpchar);
	return tmpchar;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
void handler_21h(void)
{
    translate_scancode();
    outb(0x20, 0x20);
}