PS/2-Maus — Änderungen 2232 → 2233

Zeile 34: Zeile 34:
 
|}
 
|}
  
−
<span id="60hmcds"></span>
+
<span id="60hcmds"></span>
 
{| colspan=3 | Dies ist die Liste der Befehle, die an den Keyboard-Input-Buffer (60h) gesendet werden können.
 
{| colspan=3 | Dies ist die Liste der Befehle, die an den Keyboard-Input-Buffer (60h) gesendet werden können.
 
Werden 2 Bytes verlangt, wird das zweite auch an den Port 60h gesendet.
 
Werden 2 Bytes verlangt, wird das zweite auch an den Port 60h gesendet.
 
|-
 
|-
 
| '''Befehl''' || '''Größe''' || '''Beschreibung'''
 
| '''Befehl''' || '''Größe''' || '''Beschreibung'''
 +
|-
 +
| ''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
 +
Das Format des zweiten Byte:
 +
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)
 +
02h - scancode set 2 (ATs, PS/2, default)
 +
03h -  scancode set 3
 +
|-
 +
| ''F2h'' || 1 Byte || Keyboard ID auslesen -> AT Keyboards liefern als Wert FAh (ACK) zurück
 +
                                  -> MF2 Keyboards liefern ABh + 41h oder aber auch ABh 83h an den Port 60h
 +
|-
 +
| ''F3h'' || 2 Bytes || Setze die typematic rate/delay. Der Typematic-Delay gibt an, ab wann der Scancode der gedrückten Taste wiederholt an 60h gesendet wird,
 +
die Typematic-Rate dagegen gibt an, wie oft dann der Scancode pro Sekunde gesendet wird.
 +
Das Format des zweiten Byte:
 +
Bit 7    : 0 (reserved)
 +
Bit 6-5 : geben die Typematic Delay an
 +
                00 = 250ms                01 = 500ms
 +
                10 = 750ms                11 = 1000ms
 +
Bit 4-0 : diese beiden geben die Typematic-Rate an, die sich wie folgt zusammen stellt:
 +
1/( (8+A) * 2^B * 0,00417 ) pro Sekunde                A->Bits 2-0    B->Bits 4-3
 +
    die Formel ein wenig umgestellt:
 +
240/( (8+A) * 2^B ) pro Sekunde                              -> denn ~0,00417 = 1/240
 +
 +
Bei 00000b würde das dann so aussehen:
 +
  1/ ( (8+0) * 2^0 * 0,00417 )    ->    1/(8*0.00417)    ->    ~30 Widerholungen pro Sekunde
 +
Bei 11111b würde es dagegen so aussehen:
 +
  1/ ( (8+7) * 2^3 * 0,00417 )    ->    1/(120*0,00417) ->    ~2 Wiederholungen pro Sekunde
 +
|-
 +
| ''F4h'' || 1 Byte || Aktivieren des Keyboards
 +
|-
 +
| ''F5h'' || 1 Byte || Deaktivieren des Keyboards. Wird auch genutzt, wenn etwas aus dem Maus-Output-Buffer gelesen werden soll
 +
|-
 +
| ''F6h'' || 1 Byte || set default parameters
 +
|-
 +
| ''F7h'' || 1 Byte || set all keys to typematic (scancode set 3)
 +
|-
 +
| ''F8h'' || 1 Byte || set all keys to make/release
 +
|-
 +
| ''F9h'' || 1 Byte || set all keys to make only
 +
|-
 +
| ''FAh'' || 1 Byte || set all keys to typematic/make/release
 +
|-
 +
| ''FBh'' || 1 Byte || set all keys to typematic
 +
|-
 +
| ''FCh'' || 2 Bytes || set specific key to make/release
 +
|-
 +
| ''FDh'' || 2 Bytes || set specific key to make only
 +
|-
 +
| ''FEh'' || 1 Byte || resend last scancode
 +
|-
 +
| ''FFh'' || 1 Byte || perform internal power-on reset function
 +
|-
 +
| colspan=3 | Note: Jeder Befehl wird durch das senden von FAh (ACK) an den Port 60h bestätigt, und achtung, denn bei Befehlen, die aus 2 Bytes bestehen, wird jedes<br>
 +
Byte einzeln bestätigt, für andere SpecialCodes siehe hier
 
|}
 
|}
  
 
<<span id="60hmouse"></span>
 
<<span id="60hmouse"></span>
−
{| colspan=3 | Dies ist die Liste der Befehle, die an den Keyboard-Input-Buffer (60h) gesendet werden können.
+
{| colspan=3 | 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<br>
−
Werden 2 Bytes verlangt, wird das zweite auch an den Port 60h gesendet.
+
"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<br>
 +
zuvor verwendet würde der Befehl an die Tastatur und nicht die Maus gehen.<br>
 +
ACHTUNG: Bei 2 Byte großen Befehlen muss auch vor dem senden des 2. Bytes dies mit "D4h" initiiert werden.
 
|-
 
|-
 
| '''Befehl''' || '''Größe''' || '''Beschreibung'''
 
| '''Befehl''' || '''Größe''' || '''Beschreibung'''
 +
|-
 +
| ''E6h'' || 1 Byte || Setze Maus-Scaling auf 1:1
 +
|-
 +
| ''E7h'' || 1 Byte || Setze Maus-Scaling auf 2:1
 +
|-
 +
| ''E8h'' || 2 Bytes || Setze Maus-Auflösung. Das zweite Byte sieht dabei wie folgt aus:
 +
: 00h=1/mm
 +
: 01h=2/mm
 +
: 02h=4/mm
 +
: 03h=8/mm
 +
|-
 +
| ''E9h'' || 1 Byte || Hole Status-Information -> liest 2 Bytes aus, die wie folgt aufgebaut sind
 +
: Byte 0 - Bitmaske (Beschreibung gilt, wenn Bit=1 ist, ansonsten gilt das logische ander):
 +
:: 7 = Reserved (0)
 +
:: 6 = Remote rather than Stream mode
 +
:: 5 = Maus ist aktiviert
 +
:: 4 = Scaling auf 2:1 gesetzt
 +
:: 3 = Reserved (0)
 +
:: 2 = Linke Maustaste ist gedrückt
 +
:: 1 = Reserved (0)
 +
:: 0 = Rechte Maustaste ist gedrückt
 +
: Byte 1 = Auflösung (siehe Befehl E8h)
 +
|-
 +
| ''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. 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 normlen. Der Wrap-Modus ist zur Fehleranalyse gedacht und echoet jeden Befehl, statt
 +
ihn mit FAh zu bestätigen.
 +
|-
 +
| ''EEh'' || 1 Byte || Betrete Wrap-Mouds
 +
|-
 +
| ''F0h'' || 1 Byte || Versetze Maus in den Remote-Modus statt ihn den Stream-Modus. In diesem Modus sendet die Maus die Daten nur beim Befehl EBh
 +
|-
 +
| ''F2h'' || 1 Byte || Lese MausID. Returns 00h (siehe auch bei den [[#spcs|SpecialCodes]])
 +
|-
 +
| ''F3h'' || 2 Bytes || Setze die Maus-Sample-Rate, also wie oft die Maus Daten abfragen soll. Das zweite Byte kann dann so aussehen:
 +
: 0Ah=10/s      50h= 80/s
 +
: 14h=20/s      64h=100/s
 +
: 28h=40/s      C8h=200/s
 +
: 3Ch=60/s
 +
|-
 +
| ''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 || Deaktivier die Maus im Stream-Modus und setze die vorgegebenen Parameter
 +
|-
 +
| ''F6h'' || 1 Byte || Stelle alles auf die Vorgaben zurück -> StramMode, 4/mm-Maus-Resolution, Scaling 1:1, 100/s-Sample-Rate
 +
|-
 +
| ''FEh'' || 1 Byte || Sende nocheinmal das letzte Maus-Data-Paket (für Beschreibung des Pakets siehe [[#Das_Maus-Daten-Packet|hier]])
 +
|-
 +
| ''FFh'' || 1 Byte || Reset Maus
 +
|-
 +
| colspan=3 | Notiz: Um es zur Sicherheit wiederholen, vor jeden diser 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. Obowhl das mit den Ausnahmen anscheinend nicht stimmt(entnommen ralf Browns interrupt
 +
list), denn bei mir hat F2h erst FAh und dann EXTRA noch 00h gesendet!
 
|}
 
|}
  
Zeile 51: Zeile 164:
 
{| colspan=3 | SpecialCode Liste - SpecialCodes werden an den Port 60h nach Befehlen geschickt
 
{| colspan=3 | SpecialCode Liste - SpecialCodes werden an den Port 60h nach Befehlen geschickt
 
|-
 
|-
−
| '''Befehl''' || '''Größe''' || '''Beschreibung'''
+
| '''Code''' || '''Beschreibung'''
 +
|-
 +
| ''00h'' || (Maus) ID
 +
|-
 +
| ''9Ch'' || Dieser Code wurde MIR geschickt, als ich die maus in den Streaminig-Mode geschickt habe, bevor ich den IRQ12-INT-Vektor
 +
auf meinen IntHandler gesetzt hatte. ich schlussfolgere daraus mal, dass dieser Code gesendet wird, wenn am IRQ12-Interrupt ein
 +
ungültiger Vektor angegeben ist, den die Maus anpingen könnte(im streaming Modus sendet die Maus ja bei jeder veränderung die
 +
Veränderung an den IRQ12, wenn dies im Command Byte aktiviert ist)
 +
|-
 +
| ''AAh'' || BAT completion code (sent after errorfree Basic Assurance Test)
 +
|-
 +
| ''ABh'' || das ist 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)
 +
|-
 +
| ''F0h'' || Keyboard Break Code
 +
|-
 +
| ''FAh'' || Acknowledge (ACK) - wird nach jedem Befehl an den Port 60 außer dem Resend und Echo bei der Tastatur und ECh, F2h, FFh
 +
bei der Maus gesendet
 +
|-
 +
| ''FCh'' || bei MF2-Keyboards wird dies bei einen BAT-Fehler, also einem Fehler in der zweiten Hälfte des Power on self test, geliefert
 +
|-
 +
| ''FDh'' || das selbe wie FCh nur bei AT-Keyboards (AT ist der derzeitige Standard)
 +
|-
 +
| ''FEh'' || dieser Befehl sagt, dass letzte Befehl nocheinmal gesendet werden soll
 +
|-
 +
| colspan=2 | Notiz: Bei den SpecialCodes FCh und FDh hört das Keayboard erstneinmal mit dem selftest auf und wartet auf den nächsten Befehl
 
|}
 
|}
  
Zeile 57: Zeile 197:
 
{| colspan=3 | Bitfelder des Statusbytes, das beim Lesen des 64h's gelisfert wird
 
{| colspan=3 | Bitfelder des Statusbytes, das beim Lesen des 64h's gelisfert wird
 
|-
 
|-
−
| '''Befehl''' || '''Größe''' || '''Beschreibung'''
+
| colspan=8 | Bitfelder des Statusbytes, das beim Lesen des 64h's gelisfert wird
 +
|-
 +
| '''7''' || '''6''' || '''5''' || '''4''' || '''3''' || '''2''' || '''1''' || '''0'''
 +
|-
 +
| 1 = Parity-Error bei der letzten Übertragung vom Keyboard
 +
|-
 +
| || 1 = Ein Time-Out-Error ist aufgetreten, das heißt, dass die Maus oder die Tastatur nicht reagiert hat. Sollte dieser Fehler auftreten sollte mann den Resend-Befehl nutzen.
 +
|-
 +
| || || 1 = Die Maus hat Daten für uns im Maus-Output-Buffer bereit leigen und sollten nun abgeholt werden<br>
 +
0 = es liegen keine Daten für uns bereit
 +
|-
 +
| || || || 1 = Keyboard gesperrt<br>
 +
0 = Keyboard verfügbar
 +
|-
 +
| || || || || 1 = Das letzte geschrieben Byte war ein Befehl und ging somit an den Port 64h<br>
 +
0 = Das letzte geschriebene Byte waren Daten und gingnen an den Port 60h
 +
|-
 +
| || || || || || 1 = Selftest OK<br>
 +
0 = power up or reset
 +
|-
 +
| || || || || || || 1 = Der Input-Buffer hat noch Daten, also es liegt noch der zuletzt gesendete Befehl in 60h/64h und wartet auf seine Verarbeitung<br>
 +
0 = Der Input-Buffer ist leer und alle Befehle sind verarbeitet, nun können wir einen Befehl senden
 +
|-
 +
| || || || || || || || 1 = Im OutputBuffer befinden sich Daten für den User. Im Sourcecode wird dies genutzt um auf das Ergebnis einer Operation zu warten<br>
 +
0 = Es liegen keine Daten bereit und es sollte somit auch noch nichts aus dem Port 60h ausgelesen werden
 
|}
 
|}