Aufgabe 1: Ein-/Ausgabe
Wer diese Tastatur erkennt, ist vermutlich entweder enthusiastischer Verehrer mechanischer Tastenschalter – oder hat bereits Ohrenschäden hinter sich, weil er mit einer eben solchen Person den Raum teilen musste. Dies ist das IBM Model M mit charakteristischen Knickfederschalter, in Produktion ab 1984 für immerhin 15 Jahre. Um Kosten zu sparen wird dabei für andere Tastaturlayouts nur der Aufdruck der 102 Tasten angepasst, die Elektronik ist identisch. Seit damals haben sich die Tastaturen natürlich weiterentwickelt, es gibt sie nun auch deutlich geräuschärmer, aber sie sind am PC weiterhin das primäre Eingabegerät und, wie so oft, beeinflussen uns damals getroffene Designentscheidungen auch heute noch.
Dazu schauen wir uns den konzeptionellen Aufbau des Ziffernblocks rechts genauer an. Die Tasten sind über eine Matrixschaltung mit einem in der Tastatur verbauten Prozessor verbunden. Einen Tastendruck kann dieser nun durch Prüfen aller verbundenen Leitungen erkennen. Welche Beschriftung die Taste hat, spielt für ihn keine Rolle – er ordnet ihm einen eigenen Wert, einen sogenannten Scancode zu. Natürlich hat jede Taste einen genau definierten Scancode, welcher über eine serielle Schnittstelle an dem auf dem Mainboard verbauten PS/2 Controller gesendet wird. In der Literatur wird man hierfür übrigens häufig den Begriff "Tastaturcontroller" antreffen, von dem wir aber absehen wollen, da er zum einen leicht zu Verwechslungen mit dem "Tastaturprozessor" führt, und zum anderen schon lange nicht mehr nur für die Tastatur zuständig ist.
Eine PS/2-kompatible Maus kann ebenfalls mit dem Controller verbunden werden. Wobei auch die PS/2-Schnittstelle selbst heute nicht mehr viel Verwendung findet, sondern weitgehend durch Eingabegeräte mit USB-Anschluss abgelöst wurde. Glücklicherweise bieten die meisten Systeme im BIOS eine Option wie "USB Legacy Support" an, wodurch wir Tastatur und Maus wie PS/2 Geräte verwenden können – und uns das Implementieren der deutlich umfangreicheren USB-Schnittstelle (vorerst) sparen.
Aber wie funktioniert nun eigentlich die Kommunikation auf Betriebssystemebene mit den angeschlossenen PS/2-Geräten und dem Controller? Über zwei I/O Ports haben wir Zugriff auf den PS/2-Controller.
Mittels lesenden Zugriff auf den I/O Port 0x60
kann ich auf den Ausgabepuffer des gewählten PS/2-Gerätes zugreifen, und beispielsweise die gesendeten Codes der Tastatur lesen. Ein schreibender Zugriff landet entsprechend im Eingabepuffer des Geräts, damit kann ich unter anderem die LEDs auf der Tastatur (oben rechts) ansteuern. Bitte Beachten: Die Begriffe Ein- und Ausgabe können hier kontraintuitiv wirken. Es wird dabei meist die Sicht von den PS/2-Geräten in der Literatur verwendet, was daher rührt, dass diese von den Geräteentwicklern und nicht von Betriebssystemprogrammierern verfasst wurden. Ein lesender Zugriff auf I/O Port 0x64
gibt uns den Inhalt des Statusregisters wieder, in welchem z. B. darauf hingewiesen wird, dass der Ausgabepuffer belegt ist. Kommandos an den PS/2-Controller werden durch Schreiben auf diesen Port mitgeteilt, ein typischer Befehl ist zum Beispiel das Aktivieren der Maus.
Können wir nun einfach die gedrückten Tasten aus dem Ausgabepuffer lesen? Wir wissen, dass die Tastatur uns Scancodes schickt. Aber das reicht nicht ganz für Tastenkombinationen: Wie erkennt man ein längeres Drücken der Umschalttaste, wenn man z. B. mehrere Buchstaben großschreiben will? Nun, die am Anfang gezeigte Tastatur Model M hat 102 Tasten, entsprechend reichen uns für alle Tasten bzw. deren Scancodes 7 Bit. Bei einer Übertragung von 8 Bit bei PS/2 haben wir dadurch noch das höchstwertige Bit frei, mit welchem man kodiert, ob die dem Scancade entsprechende Taste gedrückt – Make – oder losgelassen – Break – wurde.
Der PS/2 controller empfängt also diese Make- und Breakcodes, aber wir brauchen für unsere Ausgabe ASCII-Zeichen. Allerdings wird nicht jede Taste zu einem ASCII-Zeichen. Manche werden üblicherweise nicht angezeigt und somit verworfen, wie beispielsweise die Pfeiltasten. Andere wiederum ergeben zwar nicht direkt selbst ein Zeichen, beeinflussen jedoch nachfolgende Tastendrücke, wie eben die Umschalttaste für die Großschreibung. Dafür wird ein in Software geschriebener Decoder eingesetzt, welcher alle gedrückten Tasten verarbeitet, und abhängig von dem im Betriebssystem gewählten Tastaturlayout, die dekodierten druckbare Zeichen zurückliefert oder bei Bedarf den Zustand für nachfolgende Tasten speichert. Diesen Decoder haben wir in StuBS bereits für euch implementiert.