Hallo
Ich möchte gerne Tastatureingaben mit dem IRQ1 abfangen. Dazu habe ich die PICs initialisiert und für jeden IRQ eine Funktion in der IDT eingetragen. Die Funktionen sind über den
int Befehl auch alle erreichbar (d.h. meine IDT scheint schonmal korrekt zu sein).
Den PIC habe ich folgendermaßen initialisiert:
// Master-PIC initialisieren
outb(0x20, 0x11); // Initialisierungsbefehl fuer den PIC
outb(0x21, 0x20); // Interruptnummer fuer IRQ 0
outb(0x21, 0x04); // An IRQ 2 haengt der Slave
outb(0x21, 0x01); // ICW 4
// Slave-PIC initialisieren
outb(0xa0, 0x11); // Initialisierungsbefehl fuer den PIC
outb(0xa1, 0x28); // Interruptnummer fuer IRQ 8
outb(0xa1, 0x02); // An IRQ 2 haengt der Slave
outb(0xa1, 0x01); // ICW 4
// Interrupts verknüpfen
IDT::SetGate(0x20, _irq0, 0x08, 0x8E);
IDT::SetGate(0x21, _irq1, 0x08, 0x8E);
IDT::SetGate(0x22, _irq2, 0x08, 0x8E);
IDT::SetGate(0x23, _irq3, 0x08, 0x8E);
IDT::SetGate(0x24, _irq4, 0x08, 0x8E);
IDT::SetGate(0x25, _irq5, 0x08, 0x8E);
IDT::SetGate(0x26, _irq6, 0x08, 0x8E);
IDT::SetGate(0x27, _irq7, 0x08, 0x8E);
IDT::SetGate(0x28, _irq8, 0x08, 0x8E);
IDT::SetGate(0x29, _irq9, 0x08, 0x8E);
IDT::SetGate(0x2A, _irq10, 0x08, 0x8E);
IDT::SetGate(0x2B, _irq11, 0x08, 0x8E);
IDT::SetGate(0x2C, _irq12, 0x08, 0x8E);
IDT::SetGate(0x2D, _irq13, 0x08, 0x8E);
IDT::SetGate(0x2E, _irq14, 0x08, 0x8E);
IDT::SetGate(0x2F, _irq15, 0x08, 0x8E);
// Alle IRQs aktivieren (demaskieren)
outb(0x20, 0x0);
outb(0xa0, 0x0);
Anschließend lade ich die IDT und initialisiere dann die Tastatur:
// Tastaturpuffer leeren
while (inb(0x64) & 0x1)
inb(0x60);
// Warten bis die Tastatur bereit ist, und der Befehlspuffer leer ist
while ((inb(0x64) & 0x2)) {}
outb(0x60, 0xF4);
In meiner
_irq1 Prozedur erzeuge ich eine Bildschirmausgabe, sodass ich ja sehen sollte, wenn eine Taste gedrückt wird. Außerdem lade ich mit
inb(0x60) den Scancode und setze danach EOI für den IRQ1.
Wenn ich meinen Kernel mit bochs ausführe, dann erscheint zu beginn direkt einmal, dass eine Taste gedrückt wurde, obwohl ich noch gar nichts gedrückt habe. Wenn ich dann weitere Tasten auf der Tastatur drücke passiert nichts. Irgendwann steht dann auch in der bochs Konsole:
00103620000i[KBD ] internal keyboard buffer full, ignoring scancode.(1e)
00105448000i[KBD ] internal keyboard buffer full, ignoring scancode.(1f)
00106000000i[KBD ] internal keyboard buffer full, ignoring scancode.(20)
00106516000i[KBD ] internal keyboard buffer full, ignoring scancode.(9e)
Es ist mir bald schon peinlich, dass das, woran ich hier scheitere, auf der Tutorialseite mit einem Stern als "einfach" eingestuft wird. Ich hoffe dennoch auf Hilfe und Verständnis für Anfängerfehler.
lg
Developer30