Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: DarkThing am 21. March 2005, 16:49
-
Mein bisheriger Keyboard-Treiber funktioniert so:
Wenn die getch()-funktion aufgerufen wird, warte ich mit einer while schleife so lange bis ne taste gedrückt wurde, also inport(0x60) != 0x0 ist. Danach mach ich aus dem Keycode wie gewohnt ein Zeichen.
Macht es Sinn das System so zu ändern dass es über den IRQ 1 läuft und nen Buffer verwendet?
-
Wenn du z.B. eine Funktion bereitstellen willst, die alle aktuell gedrückten Tasten zurückgibt, ist die Verwendung des IRQ nützlich.
-
Stimmt...
Ich werd mal mit dem Keboard-Treiber von GazOS (http://sourceforge.net/projects/gazos) experimentieren.
-
Ich kriege eine Fehlermeldung beim Versuch, GazOS herunterzuladen.
-
auf der projekt seite gibts nen richtigen download: http://sourceforge.net/projects/gazos/
-
ich benutze die methode mit den irqs, alles andere ist unnötiges polling!
-
Du kannst auch einen Mischmasch verwenden, bei der Funktion getche() willst du ja nen Polling erreichen. Also du könntest beim Aufruf dieser Funktion deinen Standart Treiber deaktivieren in dem du Irq 1 maskierst, aber ansonsten würd ich halt ganz normal über die interrupts gehen.
-
ich hab dafür einen buffer, den ich pollen kann ;)
-
Hiho,
ich finde du solltest auf jeden Fall mit Interrupts arbeiten, weil wenn du mal Multitasking hast, würde dein Code laufen, obwohl er ja eigentlich "nur" warten sollte. d.h. er blockiert alle anderen Tasks. Wenn du mit Interrupts arbeitest, kannst du einfach schreiben, das der Prozess der getch aufruft, erst wieder ins Scheduling beinbezogen werden soll, wenn IRQ1 ausgelöst wird.
MfG GhostCoder
-
An Multitasking hab ich bisher gar nicht gedacht, ich hab halt keine echte Vorstellung wie ich das einbaue :oops:
Nochmal danke an alle. Ich werd dann mal nen IRQ-Keyboardtreiber schreiben.
-
Hiho,
ich finde du solltest auf jeden Fall mit Interrupts arbeiten, weil wenn du mal Multitasking hast, würde dein Code laufen, obwohl er ja eigentlich "nur" warten sollte. d.h. er blockiert alle anderen Tasks. Wenn du mit Interrupts arbeitest, kannst du einfach schreiben, das der Prozess der getch aufruft, erst wieder ins Scheduling beinbezogen werden soll, wenn IRQ1 ausgelöst wird.
MfG GhostCoder
oder dann gleich mit nem messagesystem, dass man keinen buffer mehr nimmt, sondern allen tasks (oder nur dem, dessen fenster in der GUI aktiv ist, dann kann man keinen keylogger bauen) einfach ne MSG per messagesystem sendet, und der darauf wartet, dann blockiert er nicht alles...
-
Ja, Wichtige Hotkeys gehen an nen System-Task, alles andere an die aktive Anwendung. Erinnert mich ein wenig an Windows. Da kriegt die Callback-Funktion auch die Message, dass ne Taste gedrückt wurde und den Tastencode kann man dann aus nem Parameter lesen.
-
genau.