| Das PS/2 Maus / Tastatur-Protokoll
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/
Einleitung:
Dieser Artikel beschreibt den Anschluß der PS/2
Maus, der PS/2 Tastatur und der AT-Tastatur. Es werden die physikalischen
und elektrischen Eigenschaften beschrieben, sowie das Low-Level-Kommunikationsprotokoll.
Weitergehende Informationen wie Befehlssätze, Datenformate
und spezielle Informationen über Tastaturen und Mäuse
finden Sie hier:
The PS/2 (AT) Keyboard
Interface
The PS/2
Mouse Interface
Die physikalische Schnittstelle
Den PS/2-Port gibt es mit zwei verschiedenen Steckverbindern: Als
5-poliger DIN-Stecker oder als 6-poliger Mini-DIN-Stecker. Beide
sind, abgesehen von der Pinbelegung, elektrisch völlig gleichwertig.
Beide Steckertypen können durch einen handelsüblichen
oder selbst gebauten Adapter aufeinander umgesetzt werden, einfach
indem die entsprechenden Pins miteinander verbunden werden. Die
Steckverbindung ist genormt durcht das Deutsche Institut für
Norm. Weitere Informationen dazu gibt es unter www.din.de
PC-Tastaturen haben entweder den 6-poligen Mini-DIN-Stecker oder
den 5-poligen DIN-Stecker. Wenn Ihre Tastatur einen 6-poligen Stecker
und Ihr Computer eine 5-polige Buchse hat (oder umgekehrt), können
sie mit dem erwähnten Adapter miteinander verbunden werden.
Tastaturen mit 6-poligem Mini-DIN-Stecker werden üblicherweise
als "PS/2"-Tastatur bezeichnet, Tastaturen mit dem 5-poligen
DIN-Stecker dagegen als "AT"-Tastatur ("XT"-Tastaturen
besaßen übrigens auch den 5-poligen DIN-Stecker. Diese
werden allerdings schon seit Jahren nicht mehr hergestellt). Alle
neueren Tastaturen für PC's sind entweder PS/2-, AT- oder USB-Tastaturen.
USB-Tastaturen werden in diesem Artikel nicht beschrieben,
da sie ein völlig anderes Protokoll verwenden.
Mäuse gibt es in den verschiedensten Formen, Ausführungen,
und Schnittstellen. Die bekannteste Ausführung dürfte
vermutlich die PS/2-Maus sein, die jedoch mittlerweile von der USB-Maus
verdrängt wird. Noch vor einigen Jahren war die serielle Maus
Standard. In diesem Artikel werden nur Mäuse mit PS/2-Anschluß
beschrieben.
Das Anschlußkabel der Tastaturen und Mäuse ist vier
bis sechspolig abgeschirmt Typ 26 AWG (ca. 0,13 mm2)
und gewöhnlich 2 Meter lang. Wenn Sie ein längeres Kabel
brauchen, können Sie eine entsprechende Verlängerung im
Computer- oder Elektronikfachhandel kaufen. Mehrere Verlängerungen
sollten nicht hintereinandergeschaltet werden. Wenn Sie 10 m Kabel
brauchen, kaufen Sie eine 10 m Verlängerung. Schließen
Sie nicht fünf 2 m Verlängerungen hintereinander. Die
Kommunikation zwischen Tastatur/Maus und Computer könnte sonst
unzuverlässig werden.
Nebenbei bemerkt, es gibt einen weiteren Steckertyp, auf den sie
bei einer Tastatur stoßen könnten. Während bei
den meisten Tastaturen das Kabel fest verbunden ist, gibt es
einige
mit abnehmbaren Kabeln. Diese Kabel haben an der einen Seite den
gewohnten DIN-Stecker (zum PC), und an der anderen Seite einen
sogenannten
SDL (Shielded Data Link) Steckverbinder. SDL wurde von der Firma
AMP eingeführt. Der Stecker besitzt eine gewisse Ähnlichkeit
mit einem Western-Telefonstecker, da er Federzungen statt Stiften
besitzt, und mit einer Federzunge einrastet. Mehr Informationen
dazu gibt es auf der Webseite von AMP, www.connect.amp.com/. Verwechseln Sie den SDL-Stecker nicht mit
dem USB-Stecker. Sie sehen auf der Zeichnung unten ähnlich
aus; tatsächlich sind sie aber sehr verschieden. Der
SDL-Stecker hat Federn und bewegliche Teile, der USB-Stecker
hat keine beweglichen
Teile.
Die folgenden Abbildungen zeigen die Pinbelegungen für jeden
Stecker:
|
Male
(Stecker)
|
Female
(Kupplung)
|
5-pin DIN (AT/XT):
1 - Clock
2 - Data
3 - Nicht belegt
4 - Ground
5 - Vcc (+5V) |
|
Male
(Stecker)
|
Female
(Kupplung)
|
6-pin Mini-DIN (PS/2):
1 - Data
2 - Nicht belegt
3 - Ground
4 - Vcc (+5V)
5 - Clock
6 - Nicht belegt |
|
|
6-pin SDL:
A - Nicht belegt
B - Data
C - Ground
D - Clock
E - Vcc (+5V)
F - Nicht belegt |
Die elektrische Schnittstelle
Hinweis: In diesem Text werde ich den Begriff "Host"
für den Computer, oder woran auch immer die Tastatur/Maus angeschlossen
sein mag, verwenden. Die Tastatur oder Maus werde ich allgemein
als "Eingabegerät" bezeichnen.
Über Vcc/Ground wird die Tastatur/Maus mit Strom versorgt.
Die Tastatur/Maus sollte nicht mehr als 275 mA verbrauchen. Besondere
Vorsicht ist gegenüber Spannungsspitzen angebracht. Diese entstehen,
wenn die Tastatur/Maus ein- oder ausgestöpselt wird, während
der Computer eingeschaltet ist. Ältere Mainboards hatten SMD-Sicherungen
als Schutz für die Maus- und Tastaturanschlüsse. Wenn
diese durchbrannten, war das Board in der Regel unbrauchbar und
durch einen durchschnittlichen Techniker nicht zu reparieren. Die
meisten neueren Mainboards haben selbstheilende (Polyswitch-) Sicherungen,
um diesem Problem abzuhelfen. Es ist jedoch nicht Standard, und
es sind noch viele alte Mainboards im Einsatz. Deshalb rate ich
davon ab, die Tastatur/Maus unter Spannung zu stecken.
Zusammenfassung Technische Daten der Stromversorgung
Vcc = +4.5V bis +5.5V.
Maximale Stromaufnahme = 275 mA.
Die Data- und Clock-Leitungen sind vom Typ Open Collector mit Pullup-Widerständen.
Eine Open-Collector-Schnittstelle hat zwei mögliche Zustände:
Low oder hochohmig. Im Zustand Low schaltet ein Transistor gegen
Ground durch. Im hochohmigen Zustand wird die Leitung weder High
noch Low getrieben. Zusätzlich ist ein Pullup-Widerstand zwischen
der Leitung und Vcc geschaltet. Dieser sorgt dafür, daß
die Leitung High-Potential hat, wenn sie von keinem der Busteilnehmer
auf Low gezogen wird. Der Wert dieses Widerstandes ist unkritisch
und sollte zwischen 1 und 10 Kiloohm liegen. Höhere Werte reduzieren
den Stromverbrauch, kleinere Werte reduzieren die Anstiegszeiten.
Ein universelles Open-Collector-Interface ist auf der folgenden
Abbildung gezeigt:
Abbildung 1:Allgemeines Open-Collector-Interface.
Data und Clock werden an Pin A bzw. B des Microcontrollers
eingelesen.
Beide Leitungen haben im Ruhezustand +5V und können auf Ground
gezogen werden, indem logisch "1" an C oder D angelegt
wird. Folglich hat Data den invertierten Zustand von D, und Clock
den invertierten Zustand von C.
Hinweis: In meinen Beispielen habe ich ein paar Tricks benutzt,
um ein Open-Collector-Interface mit PIC-Microcontrollern zu implementieren.
Ich benutze den selben Port als Eingang und Ausgang und verwende
die internen Pull-Up-Widerstände des PICs anstelle von externen
Widerständen. Eine Leitung wird auf Low gezogen, indem man
den entsprechenden Port als Ausgang setzt und logisch "0"
ausgibt. Den hochohmigen Zustand erreicht man, indem der Port als
Eingang geschaltet wird. Mit den eingebauten Schutzdioden und dem
hohen Stromtreibervermögen der PICs, denke ich, kann man das
durchaus so machen.
Kommunikation: Allgemeine Beschreibung
PS/2 Mäuse und Tastaturen benutzen ein bidirektionales, synchrones
serielles Protokoll. Im Ruhezustand sind beide Busleitungen High.
Nur in diesem Zustand darf die Tastatur/Maus mit der Datenübertragung
beginnen. Der Host hat die absolute Kontrolle über den Bus
und darf die Kommunikation jederzeit unterbrechen, indem er die
Clockleitung auf Low zieht.
Das Clocksignal wird immer vom Eingabegerät erzeugt. Wenn
der Host Daten senden möchte, muß er zunächst die
Kommunikation unterbrechen, indem er die Clockleitung auf Low zieht.
Anschließend zieht er die Datenleitung ebenfalls auf Low und
setzt die Clockleitung wieder auf High, indem er in den Clock-Port
hochohmig werden läßt. Dieser Zustand ist der "Request-to-Send"-Zustand
und weist das Eingabegerät an, jetzt mit der Ausgabe der Clockimpulse
zu beginnen.
Zusammenfassung: Bus-Zustände
Data = high, Clock = high: Ruhezustand (Idle)
Data = high, Clock = low: Kommunikation gestoppt (Inhibit)
Data = low, Clock = high: Sendeanforderung (Request-to-Send)
durch den Host
Alle Daten werden byteweise gesendet. Jedes Byte besteht aus einem
Frame zu 11 oder 12 Bits:
- 1 Startbit. Dieses ist immer 0
- 8 Datenbits mit LSB voran
- 1 Parity-Bit (ungerade Parität)
- 1 Stopbit. Diese ist immer 1
- 1 Acknowledge-Bit (nur bei Datenübertragung vom Host zum
Eingabegerät)
Das Paritybit ist 1, wenn das Datenbyte eine gerade Anzahl von
Einsen enthält, und 0 bei einer ungeraden Anzahl. Die Anzahl
der Einsen im Datenbyte plus das Paritybyte ist immer ungerade (ungerade
Parität). Dieses Verfahren dient zur Fehlererkennung. Die Tastatur/Maus
muß das Paritybit prüfen und im Fehlerfall wie auf ein
ungültiges Kommando reagieren.
Daten, die vom Eingabegerät zum Host gesendet werden, werden
mit der fallenden Flanke des Clock-Signals gelesen; Daten
vom Host zum Eingabegerät mit der steigenden Flanke.
Die Clockfrequenz muß im Bereich von 10-16,7 kHz liegen. Das
heißt, das Clock-Signal muß für 30-50 µs
High und für 30-50 µs Low sein. Wenn Sie eine Tastatur,
Maus oder einen Host Emulator entwickeln, sollten Sie die Datenleitung
in der Mitte jedes Clockimpulses ändern bzw. abtasten, d.h
15-25 µs nach der entsprechenden Clock-Flanke. Noch einmal:
Das Clock-Signal wird immer von der Tastatur/Maus erzeugt, aber
der Host hat die Kontrolle über die Kommunikation.
Das Timing ist absolut entscheidend. Alle Zeitangaben müssen
genau eingehalten werden.
Kommunikation: Vom Eingabegerät zum Host
Daten- und Clockleitung sind Open-Collector-Leitungen. Ein Widerstand
ist von jeder Leitung nach +5V verbunden, somit ist der Ruhezustand
High. Wenn die Tastatur/Maus Daten senden will, prüft sie zunächst,
ob die Clockleitung High ist. Falls nicht, blockiert der Host gerade
die Übertragung, und alle zu sendenden Zeichen müssen
zwischengespeichert werden, bis der Host die Clockleitung wieder
freigibt. Die Clockleitung muß für mindstens 50 µs
durchgehend High sein, bevor das Eingabegerät mit der Übertragung
beginnen kann.
Wie bereits im letzten Abschnitt erwähnt, benutzen Tastatur
und Maus ein serielles Protokoll mit 11 Bit langen Frames:
- 1 Startbit. Dieses ist immer 0.
- 8 Datenbits mit dem LSB voran
- 1 Paritätsbit (ungerade Parität)
- 1 Stopbit. Dieses ist immer 1
Das Eingabegerät gibt ein Datenbit auf den Bus, wenn Clock
High ist; der Host liest es ein, wenn Clock Low ist (siehe Abbildung
2 und 3)
Abbildung 2: Übertragung vom
Eingabegerät zum Host. Die Datenleitung ändert ihren Zustand
wenn die Clockleitung High ist. Daten sind gültig, wenn Clock
Low ist.
Abbildung 3: Scancode für
die Taste "Q" (15h), von der Tastatur zum Computer gesendet.
Kanal A ist der Clock, Kanal B sind die Daten.
Die Clockfrequenz beträgt 10 - 16,7 kHz. Zwischen der steigenden
Flanke von Clock und einem Wechsel von Data müssen mindestens
5 µs liegen. Zwischen einem Wechsel von Data und der fallenden
Flanke von Clock müssen mindestens 5 µs und maximal 25
µs liegen.
Der Host kann die Übertragung jederzeit unterbrechen, indem
er die Clockleitung für mindestens 100 µs auf Low zieht.
Wenn eine Übertragung vor dem 11. Clockimpuls unterbrochen
wird, muß das Eingabegerät den Rest der Übertragung
verwerfen und die Neuübertragung des aktuellen "Chunks"
vorbereiten, wenn der Host die Clockleitung wieder freigibt. Ein
"Chunk" ist z.B. ein Make-Code, ein Break-Code, ein Device-ID,
ein Mouse-Move-Paket usw. Wird z.B. eine Tastatur bei der Übertragung
des zweiten Byte eines Zwei-Byte Break-Codes unterbrochen, so muß
der komplette Break-Code noch einmal gesendet werden, und nicht
nur das zweite Byte.
Wenn der Host die Clockleitung vor dem ersten Clock-Impuls (fallende
Flanke) oder nach der fallenden Flanke des letzten Clock-Impulses
auf Low zieht, ist keine Wiederholung erforderlich. Fallen aber
neue Daten an, die gesendet werden müssen, so müssen diese
solange gespeichert werden, bis der Host die Clockleitung freigibt.
Tastaturen haben zu diesem Zweck einen 16 Byte Buffer. Fallen mehr
als 16 Byte durch Tastaturanschläge an, werden diese ignoriert,
bis im Buffer wieder freier Platz ist. Mäuse speichern nur
das jeweils letze Datenpaket.
Kommunikation: Vom Host zum Eingabegerät
In dieser Richtung sehen die Datenpakete etwas anders
aus. Zunächst einmal werden die Clockimpulse immer vom Eingabegerät
erzeugt. Will der Host Daten zum Eingabegerät senden, muß
er zuerst Daten- und Clockleitung wie folgt in den Request-To-Send-Zustand
bringen:
- Unterbrechen der Kommunikation, indem die Clockleitung für
mindestens 100 µs auf Low gezogen wird
- Ausgeben des "Request-to-send"-Signals, indem Data auf Low gezogen
wird, und anschließend Clock wieder freigegeben wird.
Das Eingabegerät sollte den Bus in Abständen von maximal
10 ms auf diesen Zustand prüfen. Wenn das Eingabegerät
diesen Zustand erkennt, beginnt es Clockimpulse für 8 Datenbits,
Paritätsbit und ein Stopbit auszugeben. Der Host ändert
die Datenleitung entsprechend wenn Clock Low ist. Die Daten
werden
vom Eingabegerät übernommen, wenn Clock High ist. Dies
ist der umgekehrte Vorgang der Kommunikation vom Eingabegerät
zum Host.
Nachdem das Stopbit empfangen wurde, bestätigt das Eingabegerät,
indem Data Low gesetzt wird (Acknowledge) und ein letzter Clockimpuls
ausgegeben wird. Sollte der Host die Datenleitung nach dem 11. Clockimpuls
nicht freigeben, gibt das Eingabegerät solange Clockimpulse
aus, bis die Datenleitung freigegeben wird (das Eingabegerät
erzeugt dabei einen Fehler).
Der Host kann die Übertragung jederzeit vor dem 11. Clockimpuls
abbrechen, indem er Clock für mindestens 100 µs Low hält.
Zur Verdeutlichung hier noch einmal die Schritte, die der Host
bei der Datenübertragung zum PS/2-Eingabegerät einhalten
muß:
- Die Clock-Leitung für mindestens 100 µs auf Low bringen
- Die Datenleitung auf Low bringen
- Die Clockleitung wieder High werden lassen
- Warten, bis das Eingabegerät die Clockleitung auf Low bringt
- Die Datenleitung entsprechend dem ersten Datenbit auf 0 oder
1 setzen
- Warten, bis das Eingabegerät die Clockleitung auf Highbringt
- Warten, bis das Eingabegerät die Clockleitung auf Low bringt
- Wiederholen der Schritte 5 bis 7 für die anderen 7 Datenbits
und das Paritybit
- Die Datenleitung freigeben
- Warten, bis das Eingabegerät die Datenleitung auf Low bringt
- Warten, bis das Eingabegerät die Clockleitung auf Low bringt
- Warten, bis das Eingabegerät Clockleitung und Datenleitung
wieder freigibt
Abbildung 4 zeigt diesen Vorgang und Abbildung 5 zeigt noch einmal
getrennt, welche Signale vom Host und welche vom Eingabegerät
(Device) erzeugt werden. Beachten Sie, daß sich beim Acknowledge-Bit
die Datenleitung - anders als üblich - ändert, während
Clock High ist.
Abbildung 4:
Übertragung vom Host zum Eingabegerät
Abbildung 5: Übertragung vom
Host zum Eingabegerät, getrennt für beide Geräte
Bezugnehmend auf Abbildung 5 muß der Host 2 Zeitabschnitte
beachten.
(a) ist die Zeit innerhalb der das Eingabegerät beginnt, Clockimpulse
auszugeben, nachdem der Host erstmals die Clockleitung auf Low gesetzt
hat. Sie darf nicht länger als 15 ms sein.
(b) ist die Zeit für die Übertragung des gesamten Datenpakets,
die nicht größer als 2 ms sein darf. Wird eine dieser
Vorgaben nicht eingehalten, sollte der Host einen Error generieren.
Unmittelbar nach dem Acknowledge-Bit darf der Host die Clockleitung
auf Low bringen um die Kommunikation zu unterbrechen, während
er die Daten verarbeitet. Wenn das vom Host gesendete Kommando eine
Quittierung verlangt, muß diese innerhalb von 20 ms gesendet
werden, nachdem die Clockleitung freigegeben wurde. Fehlt diese
Quittierung, generiert der Host einen Fehler.
|