Autor Thema: Keyboard Controller Capslock  (Gelesen 5795 mal)

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« am: 01. February 2013, 20:57 »
Hi,

wie kann ich überprüfen, ob Capslock an ist?

Und wie geht das gleiche für Numlock und "Rollen" ?

mfg

Achso: Noch eine Frage: Wie unterscheide ich Tasten, die die gleichen Keycodes haben, also z.B. Num 8 und die Pfeiltaste nach oben, oder "Entf" und "Num Komma"? Oder ganz komisch: "num /" und "-"?
« Letzte Änderung: 01. February 2013, 20:59 von KtmnjjpfjsFvzG »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. February 2013, 22:37 »
Ich weiß nicht, ob man das direkt von der Tastatur auslesen kann. Du kannst die LEDs auf der Tastatur auf jeden Fall steuern, indem du das entsprechende Kommando sendest: http://www.lowlevel.eu/wiki/KBC#Tastatur-Befehle. Beim starten kannst du das dann einmal initialisieren und je ein Flag für die 3 Tasten speichern. Es sollten entsprechende Keycodes für die Tasten gesendet werden. Du kannst vermutlich auch aus dem BIOS den Zustand der Tasten auslesen, aber wer weiß, ob der Bootloader da nicht zwischenfunkt.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. February 2013, 22:57 »
Achso, sorum gehts natürlich auch, das ist wohl sogar noch besser, ich werd mich nachher mal dransetzen, dankeschön :)

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. February 2013, 23:56 »
"Überträgt" QEMU den Status der LEDs überhaupt auf die echte Tastatur?

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 01. February 2013, 23:59 »
klar was denkst du ? :-D

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 02. February 2013, 00:02 »
Jetzt echt? Dann klappt es irgendwie nicht mit der Funktion:

static void keyboard_command(uint8_t command)
{
    // Warten bis die Tastatur bereit ist, und der Befehlspuffer leer ist
    while ((inb(0x64) & 0x2)) {}
    outb(0x60, command);
}

void keyboardUpdateLEDs(void){
keyboard_command(0xed);
outb(0x60, 0b00000100);
}
Die sollte eigentlich Capslock auf an und den rest auf aus stellen...
« Letzte Änderung: 02. February 2013, 00:04 von KtmnjjpfjsFvzG »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 02. February 2013, 00:17 »
Scheint wohl doch nicht mit Qemu zu klappen :P
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 02. February 2013, 00:26 »
OK dann ignorier ich das erstmal ^^

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 02. February 2013, 00:31 »
Ich hab auch so meine Probleme mit der Qemu Grafikkarte.
Hier ist mein Cursorcode:
void drawcurs(){
  uint32_t tmp;
  tmp= cury*80+curx+1;
  outb(0x3d4,14);
  outb(0x3d5,tmp >> 8);
  outb(0x3d4,15);
  outb(0x3d5,tmp);
}
void rmvcurs()
{
  outb(0x3d4,14);
  outb(0x3d5,0x07);
  outb(0x3d4,15);
  outb(0x3d5,0xd0);
}
kein Cursor weit und breit zu sehen !  :-(

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 02. February 2013, 00:37 »
bei mir klappt es so:void setCursorPos(uint8_t x, uint8_t y){
  uint16_t tmp = y * screenSizeX + x;
  outb(0x3D4, 14);
  outb(0x3D5, tmp >> 8);
  outb(0x3D4, 15);
  outb(0x3D5, tmp);
}
also quasi das gleiche, nur, dass tmp ein uint16_t ist und kein uint32_t, aber ich weiß nicht, ob das etwas ändert...

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 02. February 2013, 01:18 »
Interessant ist, dass  tmp= (cury*80+curx)-1; geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 02. February 2013, 01:22 »
@Martin Erhard: Das + 1 bei der Berechnung von tmp ist nicht korrekt. Da musst du gar nichts addieren oder subtrahieren.
Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 02. February 2013, 01:24 »
je nachdem, wie das "curx" gesetzt wird...

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 02. February 2013, 10:08 »
wenn ich nichts subtrahiere passiert nichts es schaut so aus als ob ich nur dann den Cursor sehe, wenn er unter ein gesetztes Zeichen gesetzt worden ist, ich will aber den Cursor immer ein bisschen vor dem letzten Zeichen haben

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 02. February 2013, 12:44 »
Der Cursor passt sich an die Farbattribute des jeweiligen Feldes an, an dem er steht. Da du den Bildschirm vermutlich mit Nullen leerst hast du schwarz auf schwarz, und siehst den Cursor nicht.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 02. February 2013, 12:48 »
Weiterhin habe ich mit folgenden Tasten Probleme:

NUM + (Scancode 46) bzw. C (Scancode 46)
NUM - (Scancode 48) bzw. B (Scancode 48)
NUM / (Scancode 53) bzw. - (Scancode 53)
NUM * (Scancode 55) bzw. DRUCK (Scancode 55)
NUM 0 (Scancode 82) bzw. EINFG (Scancode 82)
NUM , (Scancode 83) bzw. ENTF (Scancode 83)

Die Pfeiltasten (Scancodes 72, 75, 77, 80) bzw. NUM 8, 4, 6, 2 (Scancodes 72, 75, 77, 80)
POS1, BILD AUF, ENDE, BILD AB (Scancodes 71, 73, 79, 81) bzw. NUM 9, 7, 3, 1 (Scancodes 71, 73, 79, 81)

Also quasi fast das GANZE NUMPAD nutzt schon vergebene Scancodes.

Und, etwas weniger problematisch, aber eigentlich sollten die doch durchaus unterschieden werden können:

STRG LINKS (Scancode 29) bzw. STRG RECHTS (Scancode 29)

Und einen verstehe ich nicht wirklich:

PAUSE sendet erst Scancode 69 und dann Scancode 225 - wieso?

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 02. February 2013, 13:37 »
Das Problem sind die Extented Scancodes, diese bestehen aus mehreren Bytes, die einzeln gesendet werden (so wie bei dir bei PAUSE).
www.lowlevel.eu/wiki/KBC hier kannst du mehr darüber nachlesen (im Abschnitt IRQ-Handler).
Ich hoffe das hilft dir weiter.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 02. February 2013, 13:46 »
Ja, hab ich gelesen, ich hab versucht, mir das zu erarbeiten, aber wenn man zum debuggen folgenden code nutzt:
void keyboard_interrupt(void){
    uint8_t scancode = inb(0x60);
echo("-> %d %x",scancode,scancode);
}
also wirklich jeden interrupt einmal ausgibt, dann sieht das z.B. bei NUM 4 so aus:
-> 75 4b
-> 203 cb
Und bei Pfeil links kommt das gleiche:
-> 75 4b
-> 203 cb
Also beide interrupts, keydown und keyup nenne ich sie mal, machen das gleiche...

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 02. February 2013, 14:23 »
Wird bei irgendwelchen Tasten auch 0xE0 oder 0xE1? Bei einem Extented Scancode wird zuerst über einen IRQ 0xE0 oder 0xE1 gesendet, in einem weiteren kommt der eigentliche Scancode.

z.B.
NUM / (Scancode 53) bzw. - (Scancode 53)

NUM / ist ein Extented Scancode, es wird zuerst 0xE0 gesendet, - ist kein Extented Scancode, es wird sofort der Scancode gesendet.

Du musst jetzt in deinem IRQ-Handler in einer Variable speichern, ob zuvor 0xE0 gesendet wurde.

Ich hoffe ich hab es richtig und verständlich erklärt. Viel Spaß beim Programmieren.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 02. February 2013, 14:44 »
Das ist ja das Problem, bei NUM / wird 0x35 und 0xb5 gesendet, von 0xe0 keine Spur!

Das einzige, was kommt, ist 0xe1 bei PAUSE... aber 0xe0 krieg ich bei KEINER Taste :(

 

Einloggen