Die PS/2 Tastatur-Schnittstelle

Copyright / mit freundlicher Genehmigung von: Adam Chapweske
Deutsche Übersetzung von Bernward Mock
Dieser Artikel ist im Original zu finden auf: http://www.computer-engineering.org/

 

Copyright-Information

All information within this article is provided "as is" and without any express or implied warranties, including, without limitation, the implied warranties of merchantibility and fitness for a particular purpose. This article is protected under copyright law.  This document may be copied only if the source, author, date, and legal information is included.

Einleitung

Dieser Artikel versucht alle Fragen rund um AT und PS/2 Tastaturen zu beleuchten. Er enthält Informationen über die Low-Level-Signale, das Protokoll, die Scan-Codes, den Befehlssatz, die Initialisierung, Kompatibilitätsfragen und weitere Punkte. Da es vom Thema her eng verwandt ist, habe ich auch Informationen über den PC Tastaturcontroller beigefügt. Alle Programmbeispiele zum Tastaturencoder sind in Microchip PIC Assembler. Alle Programmbeispiele zum Tastaturcontroller sind in x86 Assembler.

Ein Rückblick in die Geschichte

Die gebräuchlichsten Tastaturen sind heute:

IBM brachte mit jeder neuen Computergeneration auch eine neue Tastatur heraus. Der Original PC und später der IBM XT benutzten die sogenannte "XT-Tastatur". Diese sind nicht mehr gebräuchlich und unterscheiden sich gravierend von modernen Tastaturen; sie werden hier nicht behandelt. Danach kam das IBM AT System und später der IBM PS/2. Mit ihnen kamen auch die heute gebräuchlichen Tastaturen, um die es in diesem Artikel geht. AT Tastaturen und PS/2 Tastaturen sind sehr ähnlich; die PS/2 Tastatur hat jedoch einen kleineren Stecker und unterstützt eine Reihe von Zusatzfunktionen. Trotzdem blieb sie abwärtskompatibel mit dem AT-System, und nur wenige der zusätzlichen Funktionen wurde jemals genutzt (da auch die Software immer abwärtskompatibel bleiben wollte). Hier ist eine Zusammenstellung der drei wichtigsten IBM-Tastaturmodelle:

IBM PC/XT Keyboard (1981):

IBM AT Keyboard (1984) - Nicht abwärtskompatibel mit XT Systemen (1). IBM PS/2 Keyboard (1987) - Kompatibel mit AT Systemen, nicht kompatibel mit XT systemen (1).

Die PS/2-Tastatur war ursprünglich eine Erweiterung der AT-Tastatur. Sie besaß einige zusätzliche Host-Befehle und einen kleineren Stecker. Das waren die einzigen Unterschiede zwischen diesen beiden Modellen. Die Computerindustrie kümmert sich jedoch lieber um Kompatibilität als um die Einhaltung von Standards; daher wird jede heute gekaufte Tastatur kompatibel zu PS/2- und AT-Systemen sein, wenn sie auch nicht alle Merkmale der Originalmodelle vollständig unterstützen.

Heute meint man mit "AT-Tastatur" und "PS/2-Tastatur" nur die Steckergröße. Welche Einstellungen und Befehle jede einzelne Tastatur unterstützt oder nicht unterstützt, kann man nur vermuten. Die Tastatur, die ich z.B. gerade jetzt benutze, hat einen PS/2-Stecker, unterstützt aber nur sieben Befehle vollständig, zwei teilweise und quittiert mehr oder weniger die restlichen. Zum Vergleich, meine "Testtastatur" hat einen AT-Stecker, aber unterstützt jede Funktion der Original PS/2 Tastatur (und einige zusätzliche). Moderne Tastaturen müssen als "kompatibel", nicht als "Standard" betrachtet werden. Wenn Sie ein Gerät entwickeln, das sich auf exotische Funktionen verläßt, wird es in der einen Konfiguration funktionieren, in der anderen jedoch nicht...

Moderne PS/2 (AT) kompatible Tastaturen


Fußnote 1) XT Tastauren haben ein völlig anderes Protokoll als bei AT und PS/2 Systemen üblich, was sie für neuere Computer unbrauchbar macht. Es gab eine Übergangszeit, in der einige Keyboardcontroller mit beiden Tastaturen arbeiten konnten (umschaltbar durch Dipschalter, Jumper oder automatische Erkennung). Ebenso gab es Tastaturen, die mit beiden Systemen arbeiten konnten (ebenso manuell oder automatisch umschaltbar). Wenn Sie so einen PC oder Tastatur besitzen, lassen Sie sich nicht verwirren; XT-Tastaturen sind NICHT kompatibel mit modernen PCs.

Allgemeine Beschreibung

Tastaturen bestehen aus einer Matrix von Tasten, die durch den eingbauten Mikroprozessor, den sogenannten Keyboard-Encoder überwacht werden. Die verwendeten Prozessoren (1) unterscheiden sich je nach Tastatur, aber alle tun in etwa das gleiche. Sie registrieren, welche Taste(n) gedrückt oder losgelassen wurden und senden die entsprechenden Daten zum Host. Sie sorgen für die Tastenentprellung und speichern gegebenenfalls die Daten in ihrem 16-Byte Buffer. Ihr Computer-Mainboard hat einen Tastatur-Controller (2) der alle Daten von der Tastatur dekodiert und an die Software weitergibt. Der Datenaustausch zwischen Tastatur und Host verwendet ein IBM-Protokoll.


Fußnote 1) Ursprünglich benutzte IBM den Intel 8048 als Tastatur-Encoder. Inzwischen gibt es zahlreiche Tastatur-Encoder von verschiedenen Herstellern.

Fußnote 2) Ursprünglich benutzte IBM den Intel 8042 als Tastatur-Controller. Inzwischen sind diese Controller in die Chipsätze moderner Mainboards integriert.

Elektrisches Interface und Protokoll

AT- und PS/2-Tastaturen benutzen das selbe Protokoll wie PS/2-Mäuse. Weitere Informationen über dieses Protokoll erhalten sie hier.

Scan Codes

Der Prozessor in Ihrer Tastatur verwendet die meiste Zeit damit, die Tasten zu beobachten, zu "scannen". Wenn er feststellt, daß eine Taste gedrückt, losgelassen oder festgehalten wird, sendet er ein Datenpaket, das als "Scan Code" bezeichnet wird, an Ihren Computer. Es gibt zwei verschiedene Scancode-Typen, die "Make Codes" und die "Beak Codes". Ein MakeCode wird gesendet, wenn eine Taste heruntergedrückt oder festgehalten wird; ein BreakCode wird gesendet, wenn eine Taste losgelassen wird. Jede Taste besitzt einen eigenen unverwechselbaren MakeCode und BreakCode, so daß der Host exakt bestimmen kann, was mit jeder einzelnen Taste passiert ist. Die Zuordnungen von BreakCodes und MakeCodes zu jeder einzelnen Taste bilden ein sogenanntes "Scan Code Set"; es gibt 3 Standard-ScanCode-Sets, die als Set 1, 2 und 3 bezeichnet werden. Alle modernen Tastaturen verwenden defaultmäßig das ScanCode-Set 2. (1)

Wie findet man nun den ScanCode für jede Taste? Leider gibt es keine einheitliche Formel dafür. Die MakeCodes und BreakCodes jeder Taste müssen in einer Tabelle nachgeschlagen werden. Ich habe Tabellen für alle 3 Scancode-Sets zusammengestellt:


Fußnote 1) Ursprünglich verwendete die AT-Tastatur nur Set ; die PS/2-Tastatur verwendet standardmäßig Set 2, unterstützt aber alle 3 Sets. Die meisten modernen Tastaturen verhalten sich wie die PS/2-Tastatur, es gibt aber einige, die Set 1 oder Set 3 oder beide nicht unterstützen. Wenn Sie sich einmal mit Low-Level PC-Programmierung beschäftigt haben, werden Sie sicher festgestellt haben, daß der Tastatur-Controller standardmäßig die ScanCodes aus Set 1 liefert. Das liegt daran, daß der Tastatur-Controller alle ankommenden ScanCodes zu Set 1 konvertiert (aus Gründen der Kompatibilität zu Software, die für das XT-System geschrieben wurde). Nach wie vor werden aber ScanCodes aus Set 2 über das Tastaturkabel übertragen.

Make Codes, Break Codes, und Tastenwiederholfunktion Typematic Repeat:

Bei jedem Tastendruck wird der MakeCode dieser Taste zum Computer gesendet. Beachten Sie, daß der MakeCode nur eine Taste auf der Tastatur repräsentiert, und nicht das Zeichen, das auf der Taste aufgedruckt ist. Das heißt, es gibt keinen Zusammenhang zwischen einem ScanCode und einem ASCII-Code. Es ist Aufgabe des Computers, die ScanCodes in Buchstaben oder Befehle umzusetzen.

Obwohl die die meisten MakeCodes aus einem Byte bestehen, gibt es auch einige "erweiterte" Tasten, deren MakeCode zwei oder vier Byte lang sind. Diese MakeCodes erkennt man daran, daß ihr erstes Byte E0h ist.

So wie die Tatatur beim Herunterdrücken einer Taste der MakeCode sendet, wird beim Loslassen der Taste der BreakCode gesendet (1). Zum Glück müssen Sie die BreakCodes jedoch nicht in der Tabelle nachschlagen, da es gewisse Beziehungen zwischen MakeCodes und BreakCodes gibt. Die meisten BreakCodes im Set 2 sind zwei Byte lang, wobei das erste Byte F0h ist, und das zweite Byte der MakeCode der Taste. Die BreakCodes der erweiterten Tasten sind gewöhnlich drei Bytes lang, wobei die ersten beiden Bytes E0h, F0h sind. Das dritte Byte ist das letzte Byte des MakeCodes. Als Beispiel habe ich hier die MakeCodes und BreakCodes einiger Tasten für das Scancode-Set 2 aufgeführt: 

 

Taste
(Set 2)
Make Code
(Set 2)
Break Code
"A"
1C
F0,1C
"5"
2E
F0,2E
"F10"
09
F0,09
Rechte Pfeiltaste
E0, 74
E0, F0, 74
Rechte "Ctrl" Taste
E0, 14
E0, F0, 14

Beispiel: Welche Folge von MakeCodes und BreakCodes müssen an Ihren Computer gesendet werden, damit der Buchstabe "G" in einem Textverarbeitungsprogramm erscheint? Da dies ein Großbuchstabe ist, müssen folgende Vorgänge ablaufen: Drücken der Shift-Taste, drücken der G-Taste, loslassen der G-Taste, loslassen der Shift-Taste. Die Scancodes dieser Vorgänge sind: MakeCode für die Shift-Taste (12h), MakeCode für die G-Taste (34h), BreakCode für die G-Taste (F0h, 34h), BreakCode für die Shift-Taste (F0h, 12h). Deshalb werden folgende Daten an Ihren Computer gesendet: 12h, 34h, F0h, 34h, F0h, 12h.

Wenn Sie eine Taste drücken, wird der MakeCode zum Computer gesendet. Wenn Sie die Taste festhalten, setzt die Wiederholfunktion ein ("Typematic"), d.h. es wird fortlaufend der MakeCode der Taste gesendet, solange bis die Taste losgelassen oder eine andere Taste gedrückt wird. Um das zu prüfen, starten Sie den Texteditor und halten Sie die Taste "A" gedrückt. Es erscheint sofort der Buchstabe "a" auf dem Bildschirm. Nach einer kurzen Verzögerung folgen weitere "a"s bis Sie die Taste loslassen. Es gibt zwei wichtige Parameter: Die Verzögerung (typematic delay) zwischen dem ersten und dem zweiten "a", und die Wiederholrate (typematic rate), die angibt, wie viele Zeichen pro Sekunde gesendet werden. Die Verzögerung kann zwischen 0,25 und 1,00 Sekunden liegen, und die Wiederholrate zwischen 2,0 cps (Zeichen pro Sekunde) und 30,0 cps. Diese beiden Parameter können mit dem Befehl 0xF3 ("Set Typematic Rate/Delay") eingestellt werden.

Wiederholte Daten werden nicht in der Tastatur zwischengespeichert. Wenn mehrere Tasten festgehalten werden, so setzt die Wiederholfunkton nur für die Taste ein, die als letztes heruntergedrückt wurde. Die Wiederholfunktion endet, wenn diese Taste losgelassen wird, selbst wenn noch weitere Tasten gedrückt sein sollten.


Fußnote 1) Tatsächlich hat die "Pause/Untbr"-Taste keinen BreakCode im Scancode-Set 1 und 2. Wird diese Taste gedrückt, wird der MakeCode gesendet; wenn sie losgelassen wird, passiert nichts. Es ist also nicht möglich zu bestimmen, wann diese Taste losgelassen wird.

Reset

Nach einem Einschalt-Reset oder einem Software-Reset (siehe "Reset"-Befehl) führt die Tastatur einen Selbsttest, genannt BAT (Basic Assurance Test) durch und lädt folgende Grundeinstellung:

Verzögerung 500 ms,

Wiederholrate 10,9 cps,

Scancode Set 2

Alle Tasten Typematic/Make/Break.

Zu Beginn des BAT schaltet die Tastatur ihre drei LEDs ein, und am Ende wieder aus. Dann wird BAT-Ende-Code gesendet, entweder 0xAA (BAT erfolgreich) oder 0xFC (Fehler). Der BAT-Ende-Code muß 500 bis 750 ms nach dem Einschalten der Versorgungsspannung gesendet werden.

Viele der Tastaturen, die ich getestet habe, ignorieren die Clock- und Data-Leitung bis nach dem Senden des BAT-Ende-Codes. Damit kann ein Inhibit-Signal (Clock Low) die Tastatur nicht am Senden des BAT-Ende-Codes hindern.

Befehlssatz

Einige Anmerkungen zu den Befehlen, die der Host zur Tastatur senden kann:

Es folgen alle Befehle, die der Host zur Tastatur senden kann:

0xFF (Reset) - Die Tastatur antwortet mit "Acknowledge" (0xFA) und führt dann den Reset aus (siehe Abschnitt Reset)

0xFE (Resend) - Die Tastatur wiederholt das letzte gesendete Byte. Ausnahme: Wenn das letze gesendete Byte "resend" (0xFE) war, wiederholt die Tastatur das letzte Byte, das nicht 0xFE war. Mit diesem Befehl zeigt der Host an, daß ein Empfangsfehler aufgetreten ist.

Die nächsten sechs Befehle können in jedem Modusan die Tastatur gesendet werden. Sie wirken sich jedoch nur im Modus 3 aus, d.h. wenn die Tastatur auf Scancode-Set 3 gestellt ist.

*0xFD (Set Key Type Make) - Unterbindet BreakCodes und Wiederholfunktion für spezifizierte Tasten. Die Tastatur antwortet mit "Acknowledge" (0xFA) und stoppt die Tastenabfrage (sofern aktiv) und liest eine Liste von Tasten vom Host ein. Diese Tasten werden durch ihren MakeCode im Scancode-Set 3 spezifiziert. Die Tastatur antwortet auf jeden MakeCode mit "Acknowledge". Der Host beendet die Übertragung der Liste durch einen im Scancode-Set 3 nicht vorhandenen MakeCode (z.B. einen gültigen Befehl). Die Tastatur setzt dann mit der Tastenabfrage fort (sofern vorher deaktiviert).

*0xFC (Set Key Type Make/Break) - Wie vorheriger Befehl, es wird jedoch nur die Wiederholfunktion unterbunden.

*0xFB (Set Key Type Typematic) - Wie die beiden vorherigen Befehle, es werden jedoch nur die BreakCodes unterbunden.

*0xFA (Set All Keys Typematic/Make/Break) - Die Tastatur antwortet mit "Acknowledge" (0xFA). Stellt die Normaleinstellung für alle Tasten her (MakeCodes, BreakCodes und Wiederholfunktion ein)

*0xF9 (Set All Keys Make) - Die Tastatur antwortet mit "Acknowledge" (0xFA). Ähnlich wie 0xFD, gilt jedoch für alle Tasten.

*0xF8 (Set All Keys Make/Break) - Die Tastatur antwortet mit "Acknowledge" (0xFA). Ähnlich wie 0xFC, gilt jedoch für alle Tasten.

*0xF7 (Set All Keys Typematic) - Die Tastatur antwortet mit "Acknowledge" (0xFA). Ähnlich wie 0xFB, gilt jedoch für alle Tasten.

0xF6 (Set Default) - Lädt Grundeinstellungen: Wiederholfunktion 10.9cps / 500ms; Aktiviert MakeCode, BreakCode und Wiederholfunktion für alle Tasten; stellt Scancode-Set 2 ein.

0xF5 (Disable) - Stoppt die Tastenabfrage, lädt die Grundeinstellung (siehe "Set Default"-Befehl) und wartet auf weitere Befehle.

0xF4 (Enable) - Aktiviert die Tastenabfrage, nachdem sie mit dem vorherigen Befehl deaktiviert wurde.

0xF3 (Set Typematic Rate/Delay) - Der Host sendet nach diesem Befehl ein Parameterbyte, welches die Wiederholrate und -verzögerung entsprechend folgender Tabelle einstellt:

Wiederholrate

Bits 0-4 Rate(cps)   Bits 0-4 Rate(cps)   Bits 0-4 Rate(cps)   Bits 0-4 Rate(cps)
00h 30.0   08h 15.0   10h 7.5   18h 3.7
01h 26.7   09h 13.3   11h 6.7   19h 3.3
02h 24.0   0Ah 12.0   12h 6.0   1Ah 3.0
03h 21.8   0Bh 10.9   13h 5.5   1Bh 2.7
04h 20.7   0Ch 10.0   14h 5.0   1Ch 2.5
05h 18.5   0Dh 9.2   15h 4.6   1Dh 2.3
06h 17.1   0Eh 8.6   16h 4.3   1Eh 2.1
07h 16.0   0Fh 8.0   17h 4.0   1Fh 2.0

Verzögerung

Bits 5-6 Verzögerung (sek)
00b 0.25
01b 0.50
10b 0.75
11b 1.00

 

*0xF2 (Read ID) - Die Tastatur antwortet mit einem Zwei-Byte ID-Code 0xAB, 0x83. (0xAB wird zuerst gesendet, danach 0x83)

*0xF0 (Set Scan Code Set) - Die Tastatur antwortet mit "Acknowledge" (0xFA) und liest dann ein Parameterbyte vom Host. Der Parameter kann 0x01, 0x02, oder 0x03 sein, womit Scancode-Set 1, 2 oder 3 ausgewählt wird. Die Tastatur antwortet auf den Parameter mit "Acknowledge". Wenn der Parameter 0x00 ist, antwortet die Tastatur mit "Acknowledge", gefolgt vom aktuellen Scancode-Set.

0xEE (Echo) - Die Tastatur antwortet mit "Echo" (0xEE).

0xED (Set/Reset LEDs) - Der Host sendet danach ein einen Parameter, mit dem die Num Lock, Caps Lock, und Scroll Lock LEDs eingestellt werden. Das Parameterbyte ist wie folgt definiert:

MSB LSB
immer 0 immer 0 immer 0 immer 0 immer 0 Caps Lock Num Lock Scroll Lock

Anm. d. Ü.: Bereits nach dem Befehlsbyte 0xED sendet die Tastatur ein "Acknowledge". Befehl und Parameter dürfen nicht unmittelbar nacheinander gesendet werden. Nach dem Parameterbyte sendet die Tastatur noch ein "Acknowledge" zurück.

* Ursprünglich nur auf PS/2 Tastaturen verfügbar

Anm. d. Ü.: Im Originaltext von Adam Chapweske folgt an dieser Stelle noch eine Beschreibung zur Programmierung des Keyboardcontrollers Intel 8042. Dies ist aber zum Verständnis der Tastaturansteuerung und zum Aufbau eigener Microcontroller-Schaltungen mit Tastatureingang nicht erforderlich. Diese Beschreibung kann im englischen Originaltext nachgelesen werden (siehe oben). Es folgt noch eine kurze Darstellung der Vorgänge beim Einschalten des Computers:

Initialisierung

Nachfolgend die Kommunikation zwischen meinem Computer und der Tastatur beim Bootvorgang. Ich vermute, daß die ersten 3 Befehle durch den Tastaturcontroller initiiert werden, der nächste Befehl, der die LEDs setzt, vom BIOS gesendet wird, und die restlichen Befehle vom Betriebssystem (Win98SE). Beachten Sie, daß diese Angaben speziell nur für meinen Computer zutreffen; sie sollen nur eine allgemeine Vorstellung von der Tastaturinitialisierung geben.

Tastatur: AA  Selbsttest bestanden         ;Keyboard controller init 
Host:     ED  Setzen der Status-LEDs
Tastatur: FA  Acknowledge 
Host:     00  Alle LEDs aus
Tastatur: FA  Acknowledge 
Host:     F2  Lese ID 
Tastatur: FA  Acknowledge 
Tastatur: AB  Erstes Byte der ID 
Tastatur: 83  Zweites Byte der ID *)
Host:     ED  Setzen der Status-LEDs       ;BIOS init 
Tastatur: FA  Acknowledge 
Host:     02  Num Lock LED an 
Tastatur: FA  Acknowledge 
Host:     F3  Wiederholrate einstellen     ;Windows init 
Tastatur: FA  Acknowledge 
Host:     20  500 ms / 30.0 Zeichen/sec 
Tastatur: FA  Acknowledge 
Host:     F4  Enable 
Tastatur: FA  Acknowledge 
Host:     F3  Wiederholrate einstellen
Tastatur: FA  Acknowledge 
Host:     00  250 ms / 30.0 Zeichen/sec 
Tastatur: FA  Acknowledge

*) Anm. d. Ü.: Im Originaltext von Adam Chapweske fehlt diese Zeile mit dem zweiten Antwortbyte der Tastatur auf den Befehl 0xF2. Nach einem Hinweis von Jost W. werden von der Tastatur tatsächlich 2 Byte gesendet.

 

PS/2 - Startseite

 

Valid HTML 4.01 TransitionalValid CSS!