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 (Anm. d. Ü.:
AMP wurde mittlerweile von Tyco Electronics geschluckt), 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 |
Female | 5-pin DIN (AT/XT): 1 - Clock 2 - Data 3 - Nicht belegt 4 - Ground 5 - Vcc (+5V) |
Male |
Female | 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.