Autor Thema: scancode AltGr  (Gelesen 4068 mal)

energetic

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« am: 13. September 2009, 21:54 »
Hi ich bin grad dabei ein Tastaturtreiber zu proggen.
Soll heißen ich sitze schon etwas länger davor, aber es klappt mittlerweile alles bis auf die Zeichen, die mit der Taste AltGr geschrieben werden.
Nun ich will also prüfen,ob die altGr-Taste gedrückt ist, aber welchen Scancode hat die??? :?
Durch ausgeben des Scancodes der gedrückten Taste komme ich auf folgenden: (dezimal) 2242562.
Das scheint aber nicht der richtige zu sein, was ja irgendwie nicht verwunderlich ist... Die Zahl Passt ja nicht mal in ein char.
Wie habt ihr das denn mit der altGr Taste gelöst? Kann man die überhaupt verwenden, oder geht es nur mit der normalen Alt-Taste?

Und noch ein Problem ist folgendes: Ich arbeite mit Ubuntu-Linux. Auf diesem habe ich zwei Windowmanager installiert(KDE und GNOME). Und seit neustem, wenn ich mich unter KDE einlogge funktioniert meine Tastatur nicht mehr. Ich hab das Gefühl, das kam durch den Treiber zustande. Unter GNOME geht's noch... Woran könnte das liegen?

mfg energetic

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 13. September 2009, 22:32 »
Ich weiß nicht auswendig, was AltGr liefert, aber es dürften mehrere Codes sein, nicht nur einer. Vielleicht fehlen dir einfach nur Leerzeichen zwischen den Ausgaben? ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 14. September 2009, 14:12 »
Ich weiß nicht auswendig, was AltGr liefert, aber es dürften mehrere Codes sein, nicht nur einer. Vielleicht fehlen dir einfach nur Leerzeichen zwischen den Ausgaben? ;)
Statt den Leerzeichen sind da scheinbar 2en.

SET1: ALTgr -> E0, 38 -> 224, 56
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

energetic

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 18. September 2009, 16:36 »
Danke erstmal für die Antworten. Aber kaum hat man es implementiert, gibt es schon neue Probleme. Zwei Stück genau genommen:
1.:
Die AltGr Taste funktioniert unter qemu - aber wenn ich es richtig Teste, geht sie nicht. Hab keine Ahnung woran des liegt. Im Tastaturtreiber sieht es wie folgt aus:
       //scancode-Array vorher deklariert und mit Werten belegt
       BYTE sca = inb(0x60);
if(sca != 0 && sca < 0x56 && (sca == 0x2A || sca == 0x36))
{
shift = 1;
}
/*!!!*/ else if(sca != 0 && sca == 0xE0)
/*!!!*/ {
/*!!!*/ BYTE next = inb(0x60);
/*!!!*/ if(next != 0 && next == 0x38)
/*!!!*/ {
/*!!!*/ altGr = 1;
/*!!!*/ }
/*!!!*/ else if(next != 0 && next == 0xB8)
/*!!!*/ {
/*!!!*/ altGr = 0;
/*!!!*/ }
/*!!!*/ }
else if(sca != 0 && sca < 0x56 && shift == 0 && altGr != 1)
{
//putnum(scancode[sca][0][0], 16);
//putstr(" | ");
putchar(scancode[sca][0][0]);
//putchar(' ');
}
else if(sca != 0 && sca < 0x56 && shift == 1 && altGr != 1)
{
//putnum(scancode[sca][1][0], 16);
//putstr(" | ");
putchar(scancode[sca][1][0]);
//putchar(' ');
}
else if(sca != 0 && (sca == (0x2A + 0x80) || sca == (0x36 + 0x80)))
{
shift = 0;
}
else if(sca != 0 && sca == (0xE0 + 0x80))
{
altGr = 0;
}
else if(sca != 0 && shift != 1 && altGr == 1)
{
//putnum(scancode[sca][0][1], 16);
//putstr(" | ");
putchar(scancode[sca][0][1]);
//putchar(' ');

Und zweitens:
Ich habe in der Screen-Ausgabe-Funktion, auch '\b' implementiert, soll heißen die Backspace Taste sollte auch funktionieren. Tut sie auch aber leider nicht richtig... Drückt man Backspace so wird das letzte Zeichen gelöscht, und der Cursor eine position zurück gesetzt, d.h. so wie es sein sollte. Ist der Cursor aber am Anfang der zeile, und man drückt dann BS  so springt der Cursor nicht eine Zeile höher, sondern bleibt einfach stehen. Das bringt mich echt noch um den Verstand :x Hier der Code:
void putchar(char c)
{
                BYTE backColour = 0;
BYTE foreColour = 15;

BYTE  attributeByte = (backColour << 4) | (foreColour & 0x0F);
WORD attribute = attributeByte << 8;
WORD *location;

//Backspace
/*!!!*/ if (c == '\b')
/*!!!*/ {
/*!!!*/ //Cursor_x und cursor_y sind global
/*!!!*/                        if(cursor_x != 0)
/*!!!*/ {
/*!!!*/ location = (video + (cursor_y*80 + cursor_x)) - 1;
/*!!!*/ *location = 0x0 | attribute;
/*!!!*/ cursor_x--;
/*!!!*/ }
/*!!!*/ else if(cursor_x == 0)
/*!!!*/ {
/*!!!*/ cursor_y--;
/*!!!*/ cursor_x = 80;
/*!!!*/ }
/*!!!*/ }
//Tabs
else if (c == '\t')
{
cursor_x = (cursor_x+4) & ~(4-1);
}
//Wagenrücklauf
else if (c == '\r')
{
cursor_x = 0;
}
//Zeilenumbruch
else if (c == '\n')
{
while(cursor_x < 80)
{
location = video + (cursor_y*80 + cursor_x);
*location = 0x0 | attribute;
cursor_x++;
}
cursor_x = 0;
cursor_y++;
}
//doppelte Anführungszeichen
else if(c == '\"')
{
location = video + (cursor_y*80 + cursor_x);
*location = 0x22 | attribute;
cursor_x++;
}
//einfache Anführungszeichen
else if(c == '\'')
{
location = video + (cursor_y*80 + cursor_x);
*location = 0x27 | attribute;
cursor_x++;
}
//Backslash
else if(c == '\\')
{
location = video + (cursor_y*80 + cursor_x);
*location = 0x5C | attribute;
cursor_x++;
}
//Zeichen Ausgeben
else if(c >= ' ')
{
location = video + (cursor_y*80 + cursor_x);
*location = c | attribute;
cursor_x++;
}

//Am Zeilenende,Zeilenumbruch
if (cursor_x >= 80)
{
cursor_x = 0;
cursor_y ++;
}

//Scrollen, wenn nötig
scroll();
//cursor setzen
move_cursor();
}
Hoffe jemand weiß Rat... :-)

mfg energetic
« Letzte Änderung: 18. September 2009, 16:39 von energetic »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 18. September 2009, 16:43 »
Hi,

zur ersten Frage:
Die Emulation des Keyboard Controllers entspricht in qemu wohl nicht ganz der Realität. In qemu ist es möglich innerhalb eines IRQs sowohl das Präfix (0xE0) als auch den eigentlich Scancode (0x38) auszulesen.

Auf realen PCs hingegen bekommst du für das Präfix und den Scancode der Taste zwei IRQs. (In qemu auch, wenn du es richtig machst.) Das bedeutet, wenn du in einem IRQ 0xE0 erhältst, merkst du dir das in einer globalen/statischen Variable, und verlässt den Interrupthändler. Danach erhältst du einen weiteren Interupt, der dir den Scancode 0x38 liefert. Bei der Behandlung schaust du dann, ob vorher das Präfix gekommen ist, und setzt die Variable dafür zurück.

(Oder du blockierst im Interrupthandler und wartest, bis IBF-Flag gesetzt ist.)

Zur zweiten Frage: Der letzte Buchstabe einer Zeile ist bei cursor_x = 79 nicht bei cursor_x = 80.
« Letzte Änderung: 18. September 2009, 16:45 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen