Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - ichmagbohnen

Seiten: [1]
1
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....
2
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 :)
3
Aaaah wunderbar  :-) :-)

Jetzt funktionierts, vielen Dank euch allen!
4
Naja, aber das klärt ja der Compiler im Moment für mich :D Ich dachte da eher an eine fixe Stelle, aber seis drum, global ist im Grund gar nicht mal so schlecht bei näherer Betrachtung.

Nun klemme ich hier dran:
Ich habe eine globals.h gemacht, in der steht:
#ifndef EXTERN
#define EXTERN extern
#endif

EXTERN int keybuf;
Nun binde ich die einmal in die keyboard.c ein und einmal in meine getc.c und zwar so:
#define EXTERN
#include <globals.h>

unsigned char getc() {
unsigned char temp;
while (keybuf == 0);
temp = keybuf;
keybuf = 0;
return temp;
}
Auf 0 gesetzt zu Anfangs in meiner init_keyboard() (die wird vor dem ersten getc() aufgerufen und soll später die LEDs nochmal nett beim booten blinken lassen.).
In meiner keyboard.c sieht der Spass so aus:
#include <globals.h>

isr ..... {
unsigned char keycode = inb(0x60);
if (keycode & 0x80) { // this checks for bit 7 to be 1
                // if it's the user has released a key
} else {
keybuf = keyboard_layout[keycode];
}
}
Nun rufe ich in einer dritten Datei mein getc auf, nur leider tut sich da nichts...
unsigned char input;
for(;;) {
input = getc();
printf("%c", input);
}

hmm, was mach ich daran falsch?

//edit: Nach ein paar debug-printf()s sehe ich, dass er an der while(....); in der getc() klemmt.
5
Ist das auch ohne globale Variablen möglich? Ich finde die nicht schön und die verleiten mich immer wieder dazu Murks zu programmieren... Als ich mit C angefangen habe und noch keine Ahnung von Pointern hatte bzw diese nie richtig übergeben konnte, waren da immer zig Globale im Code.... und daher wollte ich eigentlich ganz drauf verzichten.
Die einzige Möglichkeit, die ich im Moment sehe, um das ohne globale Variablen zu machen ist eine Speicherstelle im RAM zu missbrauchen, aber das ist doch sicher auch nicht Sinn der Sache....
6
Also von Multitasking bin ich noch weit entfernt :D
Ich wäre schon froh, wenn ich endlich mal Programme zum laufen bekommen würde, die nicht direkt in der einen Kernel Binary eingebaut sind :D Aber bis dahin braucht es auch noch ein weilchen. Im Moment versuch ich mich einnigermassen durchzuschlagen um eine Shell hinzubekommen.
Aber nur so lernt man  8-)

Zitat
Ich mach das so, dass die ISR die gedrückte Taste feststellt, und das Zeichen in einer Variable speichert. Den Tastaturpuffer leere ich also direkt durch das auslesen.
Umpf schon wieder was, was ich nicht richtig verstanden hatte :D
Ich dachte, dass wenn ich in meiner getc() (die kommende ;)) ein Zeichen aus dem Tastaturpuffer lese und nicht überprüfe, ob das Zeichen neu ist, dass dann immer das gleiche kommt....

Also würde das ungefähr so funktionieren, oder?
void isr() {
    ......
    unsigned char zeichen = scancode_zu_ascii_schon_umgesetzt;
}
....
unsigned char getc() {
    hole_die_variable_aus_der_anderen_funktion;
}
Doch wie mache ich das? Das geht doch so gar nicht? Mit Pointern? Doch woher weiss ich in der getc() dann wohin der Pointer zeigen muss? Da hat er doch die ganzen anderen variablen aus den anderen Funktionen nicht?!


7
Vorneweg, ich bin kein Code-Schnorrer, ich möchte nur wissen, wie ich das am geschicktesten machen kann  :-D

Meine Tastatur funktioniert soweit, bei jedem Tastendruck wird meine Interrupt Service Routine aufgerufen. Nun stehe ich vor der Frage, wie ich das am besten mache, ein getc() und später dann scanf() zu basteln. Das scanf wird kaum noch ein Problem sein, wenn ich schonmal die einzelnen Tasten bekomme.
Ich möchte eine getc-Funktion, die solange wartet bis ein neues Zeichen anliegt und das dann zurückgibt. Ausserdem noch eine, die nicht wartet und wenn ein neues Zeichen anliegt, das zurückgibt, ansonsten 0 oder einen negativen Wert oder oder oder (was genau, ist im Moment ja noch egal).
Doch ich kann ja weder von der ISR aus sagen dass er dann und dann was bereitstellen soll, da ja niemand weiss, wann getippt wird, noch kann ich genau in dem Moment tippen, wie mein getc() was holen will.

Gibt es denn ein Registerbit/Register in dem steht ob nun ein neues Zeichen im Puffer liegt oder ob es noch das alte ist (vergleichen von alt und neu bringt ja nichts, wenn ein Zeichen zwei oder mehrmals nacheinander kommt). Wenn nein, kann ich ja in der ISR einen Pointer auf eine bestimmte RAM-Adresse setzen und dort so ein Bit einrichten. So mache ich es mit meinem X/Y Koordinaten und der Textfarbe.
Ist das sinnvoll so? Wohl eher nicht....

Erzählt mir mal bitte, wie ihr das macht damit ich auch ein wenig abgucken kann ;) :evil:
Seiten: [1]

Einloggen