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 raus 😞

    BD



  • 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,
    };