Ich habe mal ein paar Fragen zu dieser Funktion aus dem Wiki:
void irq_handler(uint8_t irq) {
uint8_t scancode;
uint8_t keycode = 0;
int break_code = 1;
// Status-Variablen fuer das Behandeln von e0- und e1-Scancodes
static int e0_code = 1;
// 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 = 0;
scancode &= ~0x80;
return;
}
if (e0_code) {
// Fake shift abfangen und ignorieren
if ((scancode == 0x2A) || (scancode == 0x36)) {
e0_code = 1;
return;
}
keycode = translate_scancode(1, scancode);
e0_code = 1;
} 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 = 0;
} else if (scancode == 0xE1) {
// Anfang eines e1-Codes
e1_code = 1;
} else {
// Normaler Scancode
keycode = translate_scancode(0, scancode);
}
// Zum Testen sollte folgendes verwendet werden:
kprintf("%c", keycode);
//Nach erfolgreichen Tests, könnte eine send_key_event Funtkion wie bei Týndur verwendet werden
}
1. Warum muss e0_code am Anfang auf 1 stehen? Bei mir werden dann nur Nullen als Keycode ausgegeben.
2. Warum wird bei der Breakcodesache die Funktion verlassen. Man will doch auch wissen wovon es der Breakcode ist.
3. Warum steht nach dem if(e0_code) e0_code = 1. Das ändert doch garnichts
4. Muss das if(scancode==0xE0) nicht nach oben? Ansonsten wird doch einfach die Funktion verlassen und beim nächsten Einstieg werden die Werte wieder auf den Standard gesetzt.