Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: ichmagbohnen am 02. July 2009, 21:05

Titel: Bekomme Tastenkombinationen (teilweise) nicht hin
Beitrag von: ichmagbohnen am 02. July 2009, 21:05
Ich stehe gerade vor einem Problem, welches mich schon ein Weilchen beschäftigt.

Grosschreiben usw geht, aber keine Zeichen mit ALT/ALT GR, meine Tastaturtreiber sieht in etwa so aus:
#define STRG 0x1D // keycode
#define ALT 0x38 // keycode
#define LSHIFT 0x2A // keycode
#define RSHIFT 0x36 // keycode

struct key_combinations { // wird mit jedem aufruf des irq handlers
unsigned char lshift_pressed; // aktualisiert, 1 = gedrückt
unsigned char rshift_pressed;
unsigned char alt_pressed;
unsigned char strg_pressed;
unsigned char keyboard_reboot;
} kc;

void keyboard() {
unsigned char scancode = inb(0x60);

if(scancode & 0x80) { // taste wurde losgelassen
scancode -= 0x80; // released-bit wegmachen
switch(scancode) {
case STRG:
kc.strg_pressed = 0; // 0, taste also nicht gedrückt
break;
case ALT:
...
...
}
} else { // taste wurde gedrueckt
switch(scancode) {
case STRG:
kc.strg_pressed = 1; // 1, taste wurde gedrueckt
break;
case ALT:
...
...
}

if(kc.lshift_pressed || kc.rshift_pressed) {
scancode = scancode + 128;
}
if(kc.alt_pressed) {
scancode = scancode + 256;
}

printf("%c", keyboard_layout[scancode]);
}
Hier nur ein Ausschnitt. Das array keyboard_layout ist vom Typ unsigned char und enthält an der jeweiligen Stelle wie die Scancodes sind, das entsprechende Zeichen.
Klein und Gross geht, aber ALT nicht.
Eine Debug-Ausgabe in der ich mir die Variablen des Structs kc ansehe, zeigt immer die Richtigen Tasten an....
Das Array sieht so aus:
0   // kleinbuchstaben anfang
...
127   // ende
128  // grossbuchstaben, sonderzeichen, usw anfang
...
255   //ende
256   // inhalt fuer strg
...
383  // ende

Ein Tastatur-Reset mit Alt funktioniert z.B.....
if(kc.strg_pressed && kc.alt_pressed && kc.keyboard_reboot && (scancode == DELKEY)) {
reset();
}

Ich hoffe ihr könnt mir einen Tip geben wo es bei mir hängt und sollte ich was vergessen haben bitte melden :)
Titel: Re: Bekomme Tastenkombinationen (teilweise) nicht hin
Beitrag von: DerHartmut am 03. July 2009, 03:36
Ich würde jetzt einfach mal behaupten, dass du in deiner Keymap nicht die entsprechenden Zeichen (@, €, µ etc.) eingetragen hast (und diese sich auf im Textmodus auch AFAIK nicht ausgeben lassen, Stichwort ASCII).
Titel: Re: Bekomme Tastenkombinationen (teilweise) nicht hin
Beitrag von: matheguru am 03. July 2009, 07:47
Ja Hartmut, der gedanke ist mir auch schon gekommen! Ich dachte mir auch bereits, dass im ASCII zeichensatz diese sonderzeichen überhaupt nicht definiert sind, somit können sie natürlich auch nicht ausgegeben werden! Wenn man sich auch mal z.B. den font Arial anschaut sieht man auch das es deutlich mehr zeichen gibt, als in ASCII.
Titel: Re: Bekomme Tastenkombinationen (teilweise) nicht hin
Beitrag von: FreakyPenguin am 03. July 2009, 08:26
Den Treiber habe ich mir noch nicht angesehen, aber folgendes der Vollständigkeit halber:
Ich würde jetzt einfach mal behaupten, dass du in deiner Keymap nicht die entsprechenden Zeichen (@, €, µ etc.) eingetragen hast (und diese sich auf im Textmodus auch AFAIK nicht ausgeben lassen, Stichwort ASCII).
Das passende Stichwort ist hier eigentlich nicht ascii, sondern Codepage 437 (http://lowlevel.brainsware.org/wiki/index.php/Codepage_437), aber ASCII ist dort deckungsgleich drin, folglich müsste sich ein @ schon abbliden lassen.
Titel: Re: Bekomme Tastenkombinationen (teilweise) nicht hin
Beitrag von: XanClic am 03. July 2009, 12:31
Zu Hartmut und matheguru: Ein @ und ein µ kann man sehr wohl im Textmodus ausgeben. Ein @ ist im ASCII-Zeichensatz drin, ein µ im erweiterten (Codepage 437, siehe FreakyPenguin). Für das €-Zeichen benutze ich persönlich übrigens das Zeichen an der Stelle 0xEE.
Titel: Re: Bekomme Tastenkombinationen (teilweise) nicht hin
Beitrag von: ichmagbohnen am 05. July 2009, 11:17
Diese Zeichen hatte ich zuerst auch im Verdacht, Ärger zu machen, aber nachdem ich sie rausgenommen hab, war das immer noch so.
Ich habe da jetzt auch schon ein Weilchen rumbastelt, aber nichts tut wie es soll.
Ich glaube, ich schreibe den Treiber neu....