| Zeile 1: | Zeile 1: | ||
| − | + | Die "Maus" zählt zu den '''Human Interface Devices''', dient also als Schnittstelle zwischen dem Computer und dem Menschen. | |
| − | + | == Funktionsweise == | |
| + | Die Maus teilt sich mit dem Keyboard die gleiche Schnittstelle, die PS/2-Schnittstelle. Damit unterschieden werden kann, welcher Befehl für welches Gerät ist, ist bei der Übertragung entweder das fünfte Bit im 54h-Status-Byte gesetzt (dann ist der Befehl für die Maus) oder nicht (dann ist der Befehl für die Tastatur). | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
== Spezifikationen == | == Spezifikationen == | ||
| − | |||
=== Der PS/2-Port und der KBC === | === Der PS/2-Port und der KBC === | ||
| Zeile 19: | Zeile 12: | ||
! Port || Zugriff || Beschreibung | ! Port || Zugriff || Beschreibung | ||
|- | |- | ||
| − | |'''60h''' || ''Lesezugriff'' || Der Port 60h ist zweiseitig, er kann als Keyboard-Controller(64h)-Daten-Port oder als Keyboard-In-/Output-Buffer dienen. An diesen Port werden die Scancodes der gedrückten Tasten gesendet, die dann der Keyboard-Treiber per "in al,60h" auslesen kann. Deaktiviert man bevor man aus diesem Port etwas ausliest das Keybord per Befehl ADh, so erhält man die Daten aus dem Maus-Output-Buffer | + | |'''60h''' || ''Lesezugriff'' || Der Port 60h ist zweiseitig, er kann als Keyboard-Controller(64h)-Daten-Port oder als Keyboard-In-/Output-Buffer dienen. An diesen Port werden die Scancodes der gedrückten Tasten gesendet, die dann der Keyboard-Treiber per "in al,60h" auslesen kann. Deaktiviert man bevor man aus diesem Port etwas ausliest das Keybord per Befehl ADh, so erhält man die Daten aus dem Maus-Output-Buffer. |
| − | Zum | + | Zum Auslesen sei gesagt, dass dies nur geschehen sollte, wenn entweder das erste Bit im Keyboard-Controller-Output-Status-Byte, welches anzeigt, dass das Keyboard an 60h Daten sendet, oder das fünfte Bit in diesem Status-Byte des 64h gesetzt ist, welches anzeigt, dass im Maus-Output-Buffer Daten liegen. |
|- | |- | ||
| − | | || ''Schreibzugriff'' || Wenn an diesen Port geschrieben | + | | || ''Schreibzugriff'' || Wenn an diesen Port geschrieben wird, fungiert dieser entweder als Keyboard-Controller-Daten-Port, oder als Input-Buffer des Keyboards. Zweiteres geschieht, wenn man einfach einen der Befehle, die weiter unten für diesen Port aufgelistet sind, an diesen Port sendet. Dies sind überwiegend Befehle zu adjustierung des Keyboards, wie z.b. das Einstellen der Typematic-Rate. |
| − | Als Ersteres, also als Daten-Port des | + | Als Ersteres, also als Daten-Port des KBC, wird dieser Port nur genutzt, wenn es Befehle des 64h verlangen. So muss an z.b. den Befehl "60h" für das Senden eines neuen Commado-Bytes zwar an den Port 64h senden, doch das Commando-Byte, was dann nach korrekter Annahme des Befehls gesendet werden muss, muss an den Port 60h gesendet werden. |
| − | Für die möglichen Befehle, die an das Keyboard gesendet werden können, siehe [[#60hcmds|hier]]. Für die möglichen Mausbefehle, die an diesen Port geschickt werden können, jedoch den Befehl "D4h" auf Port 64h voraussetzen, siehe [[#60hmouse|hier]]. Für die | + | Für die möglichen Befehle, die an das Keyboard gesendet werden können, siehe [[#60hcmds|hier]]. Für die möglichen Mausbefehle, die an diesen Port geschickt werden können, jedoch den Befehl "D4h" auf Port 64h voraussetzen, siehe [[#60hmouse|hier]]. Für die KBC-Befehle, die ein zweites Daten-Byte an diesen Port geschickt verlangen, sie auch [[#64hcmds|hier]]. |
|- | |- | ||
| − | | '''64h''' || ''Lesezugriff'' || Das Lesen für diesen Port ist sehr wichtig, wenn man den Keyboard-Controller programmieren will, da man beim Lesen das Status-Byte des | + | | '''64h''' || ''Lesezugriff'' || Das Lesen für diesen Port ist sehr wichtig, wenn man den Keyboard-Controller programmieren will, da man beim Lesen das Status-Byte des KBC bekommt, welches z.b. anzeigt, ob gerade Daten zum abholen verfügbar sind, oder ob der letzte Befehl bereits vollständig verarbeitet wurde. |
Für die Bitfields des Statusbytes siehe [[#64hread|hier]] | Für die Bitfields des Statusbytes siehe [[#64hread|hier]] | ||
|- | |- | ||
| − | | || ''Schreibzugriff'' || Beim Schreibzugriff an diesen Port fungiert dieser als Keyboard-Controller-Input- | + | | || ''Schreibzugriff'' || Beim Schreibzugriff an diesen Port fungiert dieser als Keyboard-Controller-Input-Buffer, sodass eine Reihe von Byte-großen Befehlen gesendet werden können, die zumeist das System des Keyboards beeinflussen, so muss man auch an diese Port den Befehl "D4h" senden, um den nächsten Befehl, der zum Keyboard-Port(60h) geht, an die Maus senden zu lassen. |
Eine Reihe von Befehlen ist [[#64hcmds|hier]] aufgelistet. | Eine Reihe von Befehlen ist [[#64hcmds|hier]] aufgelistet. | ||
|} | |} | ||
| Zeile 43: | Zeile 36: | ||
{| {{prettytable}} | {| {{prettytable}} | ||
|- | |- | ||
| − | |+ Dies ist die Liste der Befehle, die an den Keyboard-Input-Buffer (60h) gesendet werden können. | + | |+ Dies ist die Liste der Befehle, die an den Keyboard-Input-Buffer (60h) gesendet werden können. |
| + | Werden zwei Bytes verlangt, wird das Zweite auch an den Port 60h gesendet. | ||
|- | |- | ||
! Befehl || Größe || Beschreibung | ! Befehl || Größe || Beschreibung | ||
| Zeile 49: | Zeile 43: | ||
| ''EEh'' || 1 Byte || Dieser Befehl sendet zur Diagnostik EEh an den Port 60h. | | ''EEh'' || 1 Byte || Dieser Befehl sendet zur Diagnostik EEh an den Port 60h. | ||
|- | |- | ||
| − | | ''F0h'' || 2 Bytes || Mit diesem Befehl kann abhängig vom zweiten Byte das Scancode Set entweder gesetzt oder abgerufen werden | + | | ''F0h'' || 2 Bytes || Mit diesem Befehl kann, abhängig vom zweiten Byte das Scancode Set, entweder gesetzt oder abgerufen werden |
| − | Das Format des zweiten | + | Das Format des zweiten Bytes: |
: 00h - holt den aktuellen Scancode Set ab, sodass dieser an den Port 60h gesendet wird | : 00h - holt den aktuellen Scancode Set ab, sodass dieser an den Port 60h gesendet wird | ||
: 01h - scancode set 1 (PCs and PS/2 mod 30, except Type 2 ctrlr) | : 01h - scancode set 1 (PCs and PS/2 mod 30, except Type 2 ctrlr) | ||
| Zeile 101: | Zeile 95: | ||
| ''FFh'' || 1 Byte || perform internal power-on reset function | | ''FFh'' || 1 Byte || perform internal power-on reset function | ||
|- | |- | ||
| − | |+ | + | |+ Hinweis: Jeder Befehl wird durch das Senden von FAh (ACK) an den Port 60h bestätigt. Besteht ein Befehl aus zwei Bytes, so wird jedes eizelne Byte bestätigt. |
| − | Byte | ||
|} | |} | ||
| Zeile 111: | Zeile 104: | ||
{| {{prettytable}} | {| {{prettytable}} | ||
|- | |- | ||
| − | |+ Dies ist die Liste der Befehle, die zur Adjustierung der Maus dienen. Bevor einer dieser Befehle an den Port 60h gesendet werden kann, muss zuerst per | + | |+ Dies ist die Liste der Befehle, die zur Adjustierung der Maus dienen. Bevor einer dieser Befehle an den Port 60h gesendet werden kann, muss zuerst per "D4h" an den Port 64h, dem Controller gesagt werden, dass das nächste Byte, also eins aus dieser Liste, auch an die Maus gesendet wird. Wir "D4h" nicht zuvor verwendet, würde der Befehl an die Tastatur und nicht die Maus gehen. '''Achtung''': Bei zwei Byte großen Befehlen muss auch vor dem Senden des zweiten Bytes dies mit "D4h" initiiert werden. |
|- | |- | ||
! Befehl || Größe || Beschreibung | ! Befehl || Größe || Beschreibung | ||
| Zeile 139: | Zeile 132: | ||
| ''EAh'' || 1 Byte || Versetze Maus in den Stream-Modus. In diesem aktiviert die Maus bei jeder Änderung den IRQ12, sodass dieser die Daten auslesen kann | | ''EAh'' || 1 Byte || Versetze Maus in den Stream-Modus. In diesem aktiviert die Maus bei jeder Änderung den IRQ12, sodass dieser die Daten auslesen kann | ||
|- | |- | ||
| − | | ''EBh'' || 1 Byte || Hole Maus-Data-Paket. | + | | ''EBh'' || 1 Byte || Hole Maus-Data-Paket. Sollte nur genutzt werden, wenn der Remote-Modus gesetzt ist. Für eine Beschreibung des Pakets, siehe [[#Das_Maus-Daten-Packet|hier]] |
|- | |- | ||
| − | | ''ECh'' || 1 Byte || Versetze Maus aus den Wrap-Modus wieder in den | + | | ''ECh'' || 1 Byte || Versetze Maus aus den Wrap-Modus wieder in den normalen Modus. Der Wrap-Modus ist zur Fehleranalyse gedacht und echoet jeden Befehl, statt ihn mit FAh zu bestätigen. |
| − | ihn mit FAh zu bestätigen. | ||
|- | |- | ||
| ''EEh'' || 1 Byte || Betrete Wrap-Mouds | | ''EEh'' || 1 Byte || Betrete Wrap-Mouds | ||
| Zeile 156: | Zeile 148: | ||
: 3Ch=60/s | : 3Ch=60/s | ||
|- | |- | ||
| − | | ''F4h'' || 1 Byte || Aktiviere die Maus und setze den Modus auf Stream. | + | | ''F4h'' || 1 Byte || Aktiviere die Maus und setze den Modus auf Stream. In diesem Modus wird bei jeder Veränderung der IRQ12 aufgerufen |
|- | |- | ||
| − | | ''F5h'' || 1 Byte || | + | | ''F5h'' || 1 Byte || Deaktivierz die Maus im Stream-Modus und setze die vorgegebenen Parameter |
|- | |- | ||
| − | | ''F6h'' || 1 Byte || Stelle alles auf die Vorgaben zurück -> | + | | ''F6h'' || 1 Byte || Stelle alles auf die Vorgaben zurück -> StreamMode, 4/mm-Maus-Resolution, Scaling 1:1, 100/s-Sample-Rate |
|- | |- | ||
| − | | ''FEh'' || 1 Byte || Sende | + | | ''FEh'' || 1 Byte || Sende das letzte Maus-Data-Paket erneut (für Beschreibung des Pakets siehe [[#Das_Maus-Daten-Packet|hier]]) |
|- | |- | ||
| ''FFh'' || 1 Byte || Reset Maus | | ''FFh'' || 1 Byte || Reset Maus | ||
|- | |- | ||
| − | |+ Notiz: | + | |+ Notiz: Vor jedem dieser Befehle muss "D4h" an den Port 64h geschickt werden. Alle Befehle werden entweder per FAh(ACK) |
| − | oder FEh(Resend) aktzeptiert. Ausnahmen hierbei sind ECh, F2h, FFh | + | oder FEh(Resend) aktzeptiert. Ausnahmen hierbei sind ECh, F2h, FFh, wobei F2h ein Sonderfall unter den Ausnahmen ist: Es schickt erst FAh und dann 00h. |
| − | |||
|} | |} | ||
| − | ==== | + | ==== Spezial-Codes als Rückgabe von Befehlen (60h) ==== |
<span id="spcs"></span> | <span id="spcs"></span> | ||
{| {{prettytable}} | {| {{prettytable}} | ||
|- | |- | ||
| − | |+ | + | |+ Spezial-Code Liste - Spezial-Codes werden an den Port 60h nach Befehlen geschickt |
|- | |- | ||
! '''Code''' || '''Beschreibung''' | ! '''Code''' || '''Beschreibung''' | ||
| Zeile 183: | Zeile 174: | ||
| ''00h'' || (Maus) ID | | ''00h'' || (Maus) ID | ||
|- | |- | ||
| − | | ''9Ch'' || Dieser Code | + | | ''9Ch'' || Dieser Code wird empfangen, wenn die Maus in den Streaming-Modus geschickt wurde, bevor ein Handler für den IRQ 12 initialisiert wurde. |
| − | |||
| − | |||
| − | |||
|- | |- | ||
| ''AAh'' || BAT completion code (sent after errorfree Basic Assurance Test) | | ''AAh'' || BAT completion code (sent after errorfree Basic Assurance Test) | ||
|- | |- | ||
| − | | ''ABh'' || | + | | ''ABh'' || Das erste der zwei Bytes, die bei MF2-Keyboards als ID geliefert werden (siehe Befehl F2h) |
|- | |- | ||
| ''EEh'' || Wird als Echo bei der Selbstdiagnostik zurückgegeben (siehe Befehl EEh) | | ''EEh'' || Wird als Echo bei der Selbstdiagnostik zurückgegeben (siehe Befehl EEh) | ||
| Zeile 205: | Zeile 193: | ||
| ''FEh'' || dieser Befehl sagt, dass letzte Befehl nocheinmal gesendet werden soll | | ''FEh'' || dieser Befehl sagt, dass letzte Befehl nocheinmal gesendet werden soll | ||
|- | |- | ||
| − | |+ Notiz: Bei den | + | |+ Notiz: Bei den Spezial-Codes FCh und FDh hört das KBC mit dem Selftest auf und wartet auf nächste Befehle |
|} | |} | ||
| Zeile 221: | Zeile 209: | ||
| width="12.5%" style="background:lightgrey" | | | width="12.5%" style="background:lightgrey" | | ||
| width="12.5%" style="background:lightgrey" | | | width="12.5%" style="background:lightgrey" | | ||
| − | | width="12.5%" | Es liegen keine Daten für | + | | width="12.5%" | Es liegen keine Daten für bereit |
| width="12.5%" | Keyboard verfügbar | | width="12.5%" | Keyboard verfügbar | ||
| width="12.5%" | Das letzte geschriebene Byte waren Daten und gingnen an den Port 60h | | width="12.5%" | Das letzte geschriebene Byte waren Daten und gingnen an den Port 60h | ||
| width="12.5%" | power up or reset | | width="12.5%" | power up or reset | ||
| − | | width="12.5%" | Der Input-Buffer ist leer und alle Befehle sind verarbeitet, nun | + | | width="12.5%" | Der Input-Buffer ist leer und alle Befehle sind verarbeitet, nun kann ein Befehl gesendet werden |
| width="12.5%" | Es liegen keine Daten bereit und es sollte somit auch noch nichts aus dem Port 60h ausgelesen werden | | width="12.5%" | Es liegen keine Daten bereit und es sollte somit auch noch nichts aus dem Port 60h ausgelesen werden | ||
|- valign='top' | |- valign='top' | ||
| Zeile 236: | Zeile 224: | ||
| Selftest OK | | Selftest OK | ||
| Der Input-Buffer hat noch Daten, also es liegt noch der zuletzt gesendete Befehl in 60h/64h und wartet auf seine Verarbeitung | | Der Input-Buffer hat noch Daten, also es liegt noch der zuletzt gesendete Befehl in 60h/64h und wartet auf seine Verarbeitung | ||
| − | | Im OutputBuffer befinden sich Daten für den User. | + | | Im OutputBuffer befinden sich Daten für den User. |
|} | |} | ||
| Zeile 244: | Zeile 232: | ||
{| {{prettytable}} | {| {{prettytable}} | ||
|- | |- | ||
| − | |+ Dies ist die Liste der Befehle, die an den Keyboard-Controller (64h) gesendet werden können. | + | |+ Dies ist die Liste der Befehle, die an den Keyboard-Controller (64h) gesendet werden können. |
| − | Werden | + | Werden zwei Bytes verlangt, wird das Zweite an den Port 60h gesendet. |
|- | |- | ||
! Befehl || Größe || Beschreibung | ! Befehl || Größe || Beschreibung | ||