Tastatur Treiber
-
Hi,
ich möchte einen Tastatur Treiber schreiben.Theorie:
// Tastatur.h #define 0x63 c
// Tastatur.cpp int lese; if(lese == 0x63) { printf("c"); }
Praxis:
Falsch!Man muss doch erst das Register überprüfen, oder?
Kann mir wer helfen?LG
-
Hallo,
du musst erst den Port 0x64 einlesen und prüfen ob Bit 0 gesetzt ist, wenn ja ist ein Zeichen im Tastaturpuffer vorhanden.
Über den Port 0x60 kannst du es dann einlesen und auswerten.
Es werden aber nur die Scancodes übergeben... diese musst du mittels ASCII Tabelle
intern umwandeln. D.h. jedem Scancode einen ASCII Code zuweisen.Bedenke das du auch immer zwei Tastencodes bekommst, einmal fürs drücken
und einmal fürs loslassen der Taste...Prüfe hier immer ob Bit 7 gelöscht ist, nur dann ist die Taste gedrückt, ansonsten
ist sie losgelassen worden.Gruß, Nicky
-
-
supernicky2 schrieb:
Prüfe hier immer ob Bit 7 gelöscht ist, nur dann ist die Taste gedrückt, ansonsten
ist sie losgelassen worden.Gruß, Nicky
Wie überprüft man eigentlich ob ein Bit gelöscht ist? Und wie beschriftet man eins?
-
PrettyOS - util.h
#define IS_BIT_SET(value, pos) ((value)&BIT(pos)) #define CLEAR_BIT(val, bit) __asm__("btr %1, %0" : "+r"(val) : "r"(bit)) #define SET_BIT(val, bit) __asm__("bts %1, %0" : "+r"(val) : "r"(bit))
-
Erhard Henkes schrieb:
PrettyOS - util.h
#define IS_BIT_SET(value, pos) ((value)&BIT(pos)) #define CLEAR_BIT(val, bit) __asm__("btr %1, %0" : "+r"(val) : "r"(bit)) #define SET_BIT(val, bit) __asm__("bts %1, %0" : "+r"(val) : "r"(bit))
Bin grad über das Thread gestoßen und wenn ich das richtig verstanden habe ist:
- IS_BIT_SET eine Funktion um ein zu prüfen ob ein Bit gesetzt ist. Dazu kommt die Nummer des Bits in value und die Adresse nach pos.
- CLEAR_BIT ist da um das Bit bit in val zu löschen.
- SET_BIT setzt ein das bit bit in val.Richtig?
-
die letzten beiden hast Du korrekt erkannt
-
Was ist denn das erste?
-
Prüft, ob das Bit mit der Nummer "pos" im Integer "value" gesetzt ist.
-
LightBoom schrieb:
supernicky2 schrieb:
Prüfe hier immer ob Bit 7 gelöscht ist, nur dann ist die Taste gedrückt, ansonsten
ist sie losgelassen worden.Gruß, Nicky
Wie überprüft man eigentlich ob ein Bit gelöscht ist? Und wie beschriftet man eins?
Hallo,
du schreibst ja mit Assembler.
Mit OR kannst du ein Bit setzen
or eax, 1 ;setzt Bit 0 in EAX
Mit AND kannst du ein Bit löschen
and eax, 0FFFFFFFEh ;löscht Bit 0 in EAX
Nicky
-
Wenn hier schonmal ein ein Thread öffen ist dann frag ich auch mal :
Kennt wer eine deutsche Keymap? Ich hab schon gegoogelt aber es kam nichts rausBD
-
Hallo,
beschreib mal was du unter deutsche Keymap verstehst... wenn ich google finde ich
eine ganze Menge. Aber wenn das nichts ist was du suchst musst du etwas genauer
werden.Nicky
-
Bei uns sieht die deutsche Keymap wie folgt aus:
static const char keyToASCII_default[__KEY_LAST] = { 0, // Invalid key 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'z', 'y', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '^', 'ß', '´', '#', '\b', ' ','\t', 0, 'ü', '+', 0, 0, 0, 0, 0, 0, 0, 0, 0,'\n', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', '*', '-', '+','\n', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'ö', 'ä', ',', '.', '-', '<' }; static const char keyToASCII_shift[__KEY_LAST] = { 0, // Invalid key 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Z', 'Y', '=', '!', '"', '§', '$', '%', '&', '/', '(', ')', '°', '?', '`','\'', 0, 0, 0, 0, 'Ü', '*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Ö', 'Ä', ';', ':', '_', '>' }; static const char keyToASCII_altGr[__KEY_LAST] = { 0, // Invalid key 0, 0, 0, 0, '€', 0, 0, 0, 0, 0, 0, 0, 'µ', 0, 0, 0, '@', 0, 0, 0, 0, 0, 0, 0, 0, 0, '}', 0, '²', '³', 0, 0, 0, '{', '[', ']', 0,'\\', 0, 0, 0, 0, 0, 0, 0, '~', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '|' }; static const char keyToASCII_shiftAltGr[__KEY_LAST] = { 0, // Invalid key 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-
Das ist nur die halbe Keymap (KEY->char). Die andere Hälfte ist das Mapping Scancodes->KEY:
static const KEY_t scancodeToKey_default[] = // cf. http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html#ss1.4 { // 0 1 2 3 4 5 6 7 //--------------------------------------------------------------------------------------------------------- 0, KEY_ESC, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, // 0 KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUAL, KEY_BACK, KEY_TAB, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, // 1 KEY_O, KEY_P, KEY_OSQBRA, KEY_CSQBRA, KEY_ENTER, KEY_LCTRL, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMI, // 2 KEY_APPOS, KEY_ACC, KEY_LSHIFT, KEY_BACKSL, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_DOT, KEY_SLASH, KEY_RSHIFT, KEY_KPMULT, // 3 KEY_LALT, KEY_SPACE, KEY_CAPS, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_NUM, KEY_SCROLL, KEY_KP7, // 4 KEY_KP8, KEY_KP9, KEY_KPMIN, KEY_KP4, KEY_KP5, KEY_KP6, KEY_KPPLUS, KEY_KP1, KEY_KP2, KEY_KP3, KEY_KP0, KEY_KPDOT, 0, 0, KEY_GER_ABRA, KEY_F11, // 5 KEY_F12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7 0, 0, 0, 0, 0, 0, 0, 0, }; static const KEY_t scancodeToKey_E0[] = // cf. http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html#ss1.5 { // 0 1 2 3 4 5 6 7 //--------------------------------------------------------------------------------------------------------- 0, 0, 0, 0, 0, 0, 0, 0, // 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 0, 0, 0, 0, KEY_KPEN, KEY_RCTRL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_KPSLASH, 0, KEY_PRINT, // 3 KEY_ALTGR, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_HOME, // 4 KEY_ARRU, KEY_PGUP, 0, KEY_ARRL, 0, KEY_ARRR, 0, KEY_END, KEY_ARRD, KEY_PGDWN, KEY_INS, KEY_DEL, 0, 0, 0, 0, // 5 0, 0, 0, KEY_LGUI, KEY_RGUI, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7 0, 0, 0, 0, 0, 0, 0, 0, };