Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Projekt: OS-Development  ::  Keyboard  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Ruffy11heart
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.10.2011
Beiträge: 23
Beitrag Ruffy11heart Mitglied 15:47:24 31.10.2011   Titel:   Keyboard            Zitieren

[FRAGE]:Wie gebe ich im Protected Mode den Buchstaben oder die zahl aus die ich auf der tastatur gedrückt habe?

LG, Dennis
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 12169
Beitrag Erhard Henkes Mitglied 17:20:50 31.10.2011   Titel:              Zitieren

Ich verweise hier auf den aktuellen Ablauf in PrettyOS:
Dieser startet in der Funktion void keyboard_handler(registers_t* r), die durch den Keyboard-Interrupt ausgelöst wird.
C++:
// Get scancode
    uint8_t scancode = getScancode();
    bool make = false;
 
    // Find out key. Issue events.
    KEY_t key = scancodeToKey(scancode, &make);


Hierbei bildet getScancode() den Kontakt zur Hardware ab:
C++:
1
2
3
4
5
6
7
8
9
10
11
uint8_t getScancode()
{
    volatile uint8_t scancode = 0;
    if (inportb(0x64) & 1)
        scancode = inportb(0x60);   // 0x60: get scan code from the keyboard
    // ACK: toggle bit 7 at port 0x61
    uint8_t port_value = inportb(0x61);
    outportb(0x61, port_value |  0x80); // 0->1
    outportb(0x61, port_value &~ 0x80); // 1->0
    return (scancode);
}


KEY_t scancodeToKey(uint8_t scancode, bool* make) setzt den/die scancodes um in eine "Taste". char keyToASCII(KEY_t key)setzt diese "Taste" in Verbindung mit Sondertasten (Shift, Alt, AltGr) um in ein ASCII-Zeichen.

Code: http://85.214.142.202/pretty/doc/keyboard_8c.html



siehe auch:
http://wiki.osdev.org/Keyboard
http://www.lowlevel.eu/wiki/Keyboard_Controller
http://www.brokenthorn.com/Resources/OSDev19.html
http://en.wikipedia.org/wiki/Keyboard_%28computing%29
http://www.c-plusplus.de/forum/288957

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Mr X
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.09.2007
Beiträge: 1231
Beitrag Mr X Mitglied 19:01:52 31.10.2011   Titel:              Zitieren

Zitat:
Wie gebe ich im Protected Mode den Buchstaben oder die zahl aus die ich auf der tastatur gedrückt habe?

Das behandelt zwei grundsätzlich verschiedene Dinge:
a) Tastaturtreiber
Grundlegende Infos dazu gibts einmal in ehenkes post (s.o.) und hier: http://www.lowlevel.eu/wiki/Keyboard_Controller
b) Textmodus-"Treiber"
Infos: http://www.lowlevel.eu/wiki/Textausgabe#Protected_Mode


Der Ablauf ist:
1) Tastatur installieren.
2) Taste drücken -> Tastaturkontroller löst Interrupt aus
3) Interrupt behandeln
3.1) Scancode auslesen
3.2) Scancode in ASCII-Zeichen umwandeln. (Scancodetabelle: http://www.marjorie.de/ps2/scancode-set1.htm)
4) Zeichen ausgeben. Dazu einfach das Zeichen in den Speicher an der Stelle 0xB8000 ff. schreiben. Ein Zeichen nimmt 2 Bytes ein, davon eines Attribute (Farbe), und das andere das Zeichen selbst.


Ich empfehle dir, erst den Textmodus zu programmieren (zunächst vielleicht konstante Strings ausgeben zum Testen), und wenn das funktioniert, einen Tastaturtreiber schreiben.
Ruffy11heart
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.10.2011
Beiträge: 23
Beitrag Ruffy11heart Mitglied 19:45:15 31.10.2011   Titel:              Zitieren

Vielen Dank,habe jetzt geschafft

LG,Dennis
Ruffy11heart
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.10.2011
Beiträge: 23
Beitrag Ruffy11heart Mitglied 19:58:47 31.10.2011   Titel:   Rückfrage            Zitieren

Also habe es jetzt geschafft mit Tastaturtreiber schreiben und habe auch schon text auf dem Bildschirm ausgegeben.Meine Frage ist jetzt wie gebe ich das aus also z.b. k_printf (Scancode, 1, 0xA); oder wie?

LG,Dennis :confused:
Mr X
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.09.2007
Beiträge: 1231
Beitrag Mr X Mitglied 20:46:11 31.10.2011   Titel:              Zitieren

Dann fehlt nur noch die Konvertierung der Scancodes in ASCII-Zeichen.

Wenn Du die A-Taste drückst, sendet die Tastatur den Scancode 0x1E. Wenn Du sie wieder loslässt, kommt 0x9E (also 0x80|0x1E). Im ASCII-Zeichensatz (http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange) hat 'a' den Wert 0x61. D.h. du musst 0x1E nach 0x61 übersetzen.
Für diese Übersetzung legst Du dir ein Array an, sodass Du am Index 0x1E den Wert 0x61 stehen hast. Dann gilt:
Code:
char ascii = keymap[scancode];


Diese direkte Übersetzung von Scancode in Zeichen ist recht einfach und funktioniert für den Anfang ganz gut. PrettyOS übersetzt allerdings in zwei Stufen: scancode -> key -> ascii. Dadurch können dann auch Tasten, die keine Repräsentation als Zeichen haben (Shift, Pfeiltasten, ...), wie jede andere genutzt werden.
Ruffy11heart
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.10.2011
Beiträge: 23
Beitrag Ruffy11heart Mitglied 21:01:52 31.10.2011   Titel:              Zitieren

Okay, Danke und noch mal eine frage.Wie mache ich das dann mit if also zum beispiel if (KeyGot == '0x1E') oder wie?Schonmal danke im v******.

LG, Dennis ;)
Mr X
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.09.2007
Beiträge: 1231
Beitrag Mr X Mitglied 21:46:17 31.10.2011   Titel:              Zitieren

Ruffy11heart schrieb:
Wie mache ich das dann mit if also zum beispiel if (KeyGot == '0x1E') oder wie?

Das würde zwar gehen, aber in einer Riesenmenge Code enden.

Wie gesagt, packs in ein Array. Das Array hat soviele Member wie der höchste scancode. Der Index ist der scancode. Jedem index/scancode ordnest Du ein ASCII-Zeichen zu.

So in diesem Stil:
Code:
char keymap[] = {'1', 'T', 0, 's'};


Code:
char ascii = keymap[scancode];

würde dann für scancode==0x3 ein 's' nach ascii schreiben.
Ruffy11heart
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.10.2011
Beiträge: 23
Beitrag Ruffy11heart Mitglied 21:53:59 31.10.2011   Titel:              Zitieren

Okay könnte mir das mal jemand mit dem Array erklären mit der Tastatur?
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 12169
Beitrag Erhard Henkes Mitglied 22:27:30 31.10.2011   Titel:              Zitieren

Ja, ich könnte das. Aber MrX hat es oben sehr schön erklärt. Du kannst es dir auch abschauen bei PrettyOS: http://85.214.142.202/pretty/doc/keyboard_8h-source.html und http://85.214.142.202/pretty/doc/keyboard_8c-source.html oder in meinem Tutorial.

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
c++.de :: Projekt: OS-Development  ::  Keyboard  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.