Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: KtmnjjpfjsFvzG am 01. February 2013, 20:57

Titel: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG 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 "-"?
Titel: Re: Keyboard Controller Capslock
Beitrag von: Jidder 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 (http://www.lowlevel.eu/wiki/BDA#Tastatur-Status-Flags) den Zustand der Tasten auslesen, aber wer weiß, ob der Bootloader da nicht zwischenfunkt.
Titel: Re: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG 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 :)
Titel: Re: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG am 01. February 2013, 23:56
"Überträgt" QEMU den Status der LEDs überhaupt auf die echte Tastatur?
Titel: Re: Keyboard Controller Capslock
Beitrag von: Martin Erhardt am 01. February 2013, 23:59
klar was denkst du ? :-D
Titel: Re: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG 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...
Titel: Re: Keyboard Controller Capslock
Beitrag von: Jidder am 02. February 2013, 00:17
Scheint wohl doch nicht mit Qemu zu klappen :P
Titel: Re: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG am 02. February 2013, 00:26
OK dann ignorier ich das erstmal ^^
Titel: Re: Keyboard Controller Capslock
Beitrag von: Martin Erhardt 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 !  :-(
Titel: Re: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG 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...
Titel: Re: Keyboard Controller Capslock
Beitrag von: Martin Erhardt am 02. February 2013, 01:18
Interessant ist, dass  tmp= (cury*80+curx)-1; geht.
Titel: Re: Keyboard Controller Capslock
Beitrag von: Jidder 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.
Titel: Re: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG am 02. February 2013, 01:24
je nachdem, wie das "curx" gesetzt wird...
Titel: Re: Keyboard Controller Capslock
Beitrag von: Martin Erhardt 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
Titel: Re: Keyboard Controller Capslock
Beitrag von: MNemo 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.
Titel: Re: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG 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?
Titel: Re: Keyboard Controller Capslock
Beitrag von: iksnagreb 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 (http://www.lowlevel.eu/wiki/KBC) hier kannst du mehr darüber nachlesen (im Abschnitt IRQ-Handler).
Ich hoffe das hilft dir weiter.
Titel: Re: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG 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...
Titel: Re: Keyboard Controller Capslock
Beitrag von: iksnagreb 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.
Titel: Re: Keyboard Controller Capslock
Beitrag von: KtmnjjpfjsFvzG 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 :(