Autor Thema: Probleme mit Keyboardtreiber  (Gelesen 5171 mal)

pgahlen

  • Gast
Gespeichert
« am: 06. July 2010, 10:56 »
Hallo,
Ich verzweifle gerade an meinem Keyboard Treiber, er funktioniert eigentlich mittlerweile einwandfrei, nur wenn ich eine Taste drücke gibt er sie 2x aus, mein Treiber sieht fast so aus wie der von tyndur.

Was mir allerdings auffällt ist, das wenn ich die Taste länger drücke er sie nur einmal ausgibt, allerdings wiederholend und wenn ich sie loslasse erscheint der zweite Buchstabe!

Danke schon mal an die Antworten!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 06. July 2010, 11:05 »
Die Tastatur sendet einen Make-Code, wenn du die Taste runterdrückst, und einen Break-Code, wenn du sie wieder loslässt. Beim Loslassen ist das Bit 0x80 gesetzt. Das müsstest du also überprüfen und in diesem Fall die Taste nicht nochmal ausgeben. Interessant ist die Benachrichtigung beim Loslassen für dich erstmal nur bei Modifier-Tasten wie Shift, bei denen nicht das Drücken an sich, sondern der Zustand wichtig ist.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

pgahlen

  • Gast
Gespeichert
« Antwort #2 am: 06. July 2010, 11:40 »
Ok vielleicht mache ich was falsch aber iergendwie klappt es nicht so ganz, deswegen nochmal ne Anfänger Frage wie Farbe ich das Bit ab, wohl kaum mit if (0x80 bla bla bla), weil damit Frage ich ja nur die hexadezimalschreibweise ab?

Danke aber schon mal

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 06. July 2010, 11:43 »
Hi,

if ((value & 0x80) == 0x80)
{

}
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. July 2010, 13:09 »
if (value & 0x80) { ... } reicht auch. Wenn's nicht 0 ist, ist es immer 0x80.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

pgahlen

  • Gast
Gespeichert
« Antwort #5 am: 06. July 2010, 13:15 »
Ok danke klappt alles

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 06. July 2010, 13:31 »
Stimmt ja.. C/C++ nimmts in der Hinsicht da ja nicht so genau mit boolschen Ausdrücken..
Bzw. C ist da nicht so streng wie Pascal
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 06. July 2010, 19:39 »
Hallo,


Stimmt ja.. C/C++ nimmts in der Hinsicht da ja nicht so genau mit boolschen Ausdrücken..
C++ schon, der gcc mault für gewöhnlich rum wenn nicht eindeutig true oder false bei rauskommt.
ich würde das lieber so formulieren:if ( (value & 0x80) != 0 ) { "Bit 7 ist gesetzt"; }

Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

pgahlen

  • Gast
Gespeichert
« Antwort #8 am: 07. July 2010, 17:20 »
Ok soweit klappt alles, ich versuche allerdings gerade eine Funtkion ähnlich scanf zu schreiben, aber iergendwie komme ich nicht so ganz dahinter, wie ich der Funktion sagen soll dass sie auf den Interrupt der Tastatur oder auf send_key_event warten soll (btw send_key_event habe ich noch nicht programmiert).

Danke aber erstmal für eure Bemühungen!!!!!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 08. July 2010, 09:46 »
char c;
while ((c = get_key()) != 0) {
    asm volatile("hlt");
}
Und get_key liest aus einer Variable, in die der IRQ-Handler reinschreibt (als volatile deklarieren!). Für den Anfang könnte ein einzelner char reichen, aber wahrscheinlich willst du einen größeren Puffer anlegen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

pgahlen

  • Gast
Gespeichert
« Antwort #10 am: 19. July 2010, 23:31 »
soweit läuft alles.

Nur noch ein Problem, ich bin gerade dabei eine Shell zu schreiben, die auch schon ziemlich gut läuft.
Nun komme ich zu dem Teil mit der Tastatureingabe.
Also alles läuft über einen Syscall, wobei ich auch rausgefunden habe, das es nicht an dem Syscall liegt.
Dieser Syscall ruft dann getchar auf, und gibt das Zeichen zurück.
Nur leider klappt das alles nicht. wenn ich mir die Ergebnisse nun per printf("%u", ret); die Ergebnisse aufzählen lasse kamen überall 1en. Nund hab ich das noch hingekriegt, indem ich geschrieben hab, das alles wiederholt werden soll, also kamen keine 1en mehr, dafür aber 0en, also hab ich das gleiche auch mit den Nullen gemacht. Wenn ich nun aber das wieder laufen lasse, kommen nur noch 192en und wenn ich auf eine Taste drücke sieht man ganz kurz das Zeichen, und nach 0,0000001 Sekunden ist es weg weil so viele 192 kamen. Also meine Frage ist wie krieg ich die 192 weg

mfg,
pgahlen

Programm Noob

  • Gast
Gespeichert
« Antwort #11 am: 19. July 2010, 23:43 »
Kleine anmerkung von mir. Die sources vom Keybordtreiber könnt ihr im SVN Repo von NandOS ansehen. Link is im Wiki. De Shell ist leider noch nicht drin aber wir vermuten es liegt am treiber. Der Treiber liegt unter: trunk/kernel/keyboard.c

Programm Noob


LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #12 am: 20. July 2010, 09:57 »
@pgahlen im syscall nach dem auslesen deinen keyboard buffer auf 0 setzen:
int keyboard_buffer = 0;
// ... irgendwie im treiber setzen
syscall:
    cpu->eax = keyboar_buffer;
    keyboard_buffer = 0;
zwar pseudocode, wird ja aber helfen, oder?

LittleFox

EDIT: nochmal gelesen und festgestellt das ich in die falsche richtung gedacht habe. sry
« Letzte Änderung: 20. July 2010, 20:50 von littlefox »

Programm Noob

  • Gast
Gespeichert
« Antwort #13 am: 21. July 2010, 01:08 »
Das hat leider nicht geholfen. Wir haben jetzt die Shell in den Kernel verlegt(Nur übergangsweiße) und damit können wir schon einiges machen.

Programm Noob

 

Einloggen