Keyboard Controller — Änderungen 1768 → 1769

Zeile 17: Zeile 17:
  
  
 +
 +
Statusregister (lesen von Port 0x64)
 
<pre>
 
<pre>
−
Statusregister (lesen von Port 0x64)
+
Bit 76543210
 +
    │││││││└─ Status des Ausgabepuffers (KBC -> CPU) :  0=leer;  1=voll (es kann von Port 0x60 gelesen werden)
 +
    ││││││└── Status des Eingabepuffers (KBC <- CPU) :  0=leer (Schreiben auf 0x60 oder 0x64 möglich);  1=voll
 +
    │││││└─── Systemstatus? :  0=Reset/Selbsttest wird gerade ausgeführt;  1=Selbsttest OK
 +
    ││││└──── zuletzt benutztes Port : 0=0x60;  1=0x61 oder 0x64?
 +
    │││└───── Tastatursperre : 0=Tastatur gesperrt; 1=Tastatur nicht gesperrt
 +
    ││└────── PSAUX?
 +
    │└─────── Timeout : 1=Tastatur oder PSAUX-Gerät ragiert nicht?
 +
    └──────── Paritätsfehler : 1=Beim letzten Senden/Empfangen trat ein Paritätsfehler auf
 +
</pre>
 +
<br>
  
 +
Inputport (Lesen über KBC-Befehl 0xC0)
 +
<pre>
 
Bit 76543210
 
Bit 76543210
−
     ║║║║║║║╚═ Status des Ausgabepuffers (KBC -> CPU) :  0=leer;  1=voll (es kann von Port 0x60 gelesen werden)
+
     │││││││└─ Keyboard data in pin?
−
     ║║║║║║╚══ Status des Eingabepuffers (KBC <- CPU) :  0=leer (Schreiben auf 0x60 oder 0x64 möglich);  1=voll
+
    ││││││└── PS/2 mouse in pin?
−
     ║║║║║╚═══ Systemstatus? :  0=Reset/Selbsttest wird gerade ausgeführt;  1=Selbsttest OK
+
    │││││└─── Reserviert
−
     ║║║║╚════ zuletzt benutztes Port : 0=0x60;  1=0x61 oder 0x64?
+
    ││││└──── Reserviert
−
     ║║║╚═════ Tastatursperre : 0=Tastatur gesperrt; 1=Tastatur nicht gesperrt
+
     │││└───── Reserviert
−
    ║║╚══════ PSAUX?
+
     ││└────── Reserviert
−
    ║╚═══════ Timeout : 1=Tastatur oder PSAUX-Gerät ragiert nicht?
+
     │└─────── Wether you have a color or mono screen?
−
    ╚════════ Paritätsfehler : 1=Beim letzten Senden/Empfangen trat ein Paritätsfehler auf
+
     └──────── Tastatursperre : 0=Tastatur gesperrt; 1=Tastatur nicht gesperrt
 +
</pre>
 +
<br>
  
 +
Outputport (Lesen über KBC-Befehl 0xD0, schreiben über KBC-Befehl 0xD1)
 +
<pre>
 +
Bit 76543210
 +
    │││││││└─ 1=CPU-Reset
 +
    ││││││└── 1=A20-Gate eingeschaltet
 +
    │││││└─── ? PS/2 mouse data out
 +
    ││││└──── ? PS/2 mouse clock signal
 +
    │││└───── ? 1: Output buffer full
 +
    ││└────── ? 1: Output buffer PS/2 mouse full
 +
    │└─────── ? Keyboard clock signal
 +
    └──────── ? Keyboard data out
 +
</pre>
 +
<br>
  
−
Inputport
 
  
 +
Port 0x61 (lesen und schreiben)
 +
<pre>
 
Bit 76543210
 
Bit 76543210
−
     ║║║║║║║╚═ Keyboard data in pin?
+
     │││││││└─ PPI \
−
     ║║║║║║╚══ PS/2 mouse in pin?
+
     ││││││└── PPI  \
−
     ║║║║║╚═══ Reserviert
+
     │││││└─── PPI  |Dieser Teil ist vom Programmable Peripheral Interface
−
     ║║║║╚════ Reserviert
+
     ││││└──── PPI  |nicht überschreiben!
−
     ║║║╚═════ Reserviert
+
     │││└───── PPI  /
−
     ║║╚══════ Reserviert
+
     ││└────── PPI /
−
     ║╚═══════ Wether you have a color or mono screen?
+
     │└─────── Setzt die "clock"-Leitung auf low, so dass die Tastatur keine Daten an den PC senden kann
−
     ╚════════ Tastatursperre : 0=Tastatur gesperrt;  1=Tastatur nicht gesperrt
+
     └──────── 0=Tastatur eingeschaltet;  1=Tastatur ausgeschaltet
 +
</pre>
 +
<br>
 +
 
 +
KBC-Befehle (schreiben auf Port 0x64)<br>
 +
Bevor man auf Port 0x64 schreibt, müssen Port[0x60].Bit[1]==0 und Port[0x60].Bit[2]==1 sein!
 +
<pre>
 +
0xAA  Tastatur-Selbsttest. Sollte 0x55 auf Port 0x60 zurückgeben.
 +
 
 +
0xAB  Testen des Tastaturanschlusses. Auf Port 0x60 wird ein Byte zurückgegeben:
 +
 
 +
    00h: No error
 +
    01h: Clock low
 +
    02h: Clock high
 +
    03h: Data low
 +
    04h: Data high
 +
    ffh: Total Error
 +
 
 +
0xAD  Deaktivieren der Tastatur
 +
 
 +
0xAE  Aktivieren der Tastatur
 +
 
 +
0xC0  Lesen des Inputports. Gibt den Inhalt vom Inputport auf Port 0x60 aus. (Siehe: Inputport)
 +
 
 +
0xD0  Lesen des Outputports. Gibt den Inhalt vom Outputport auf Port 0x60 aus. (Siehe: Outputport)
 +
 
 +
0xD1  Schreiben des Outputports. Den neuen Wert für das Outputport auf Port 0x60 schreiben. (Siehe: Outputport)
 +
 
 +
0xD2  ?
 +
0xD3  ?
 +
0xD4  ?
 +
 
 +
0xE0  ?
 +
 
 +
0xFx  ?
 +
 
 +
 
 +
</pre>
 +
<br>
 +
 
 +
Tastatur-Befehle (schreiben auf Port 0x60)<br>
 +
Bevor man auf Port 0x60 schreibt, müssen Port[0x60].Bit[1]==0 und Port[0x60].Bit[2]==1 sein!
 +
<pre>
 +
0xED  Setzen der LEDs auf der Tastatur. Ein zweites Byte wird über Port 0x60 gesendet:
 +
 
 +
      Bit 76543210
 +
          │││││││└─ Scroll Lock : 0=aus 1=an
 +
          ││││││└── Num Lock    : 0=aus 1=an
 +
          │││││└─── Caps Lock  : 0=aus 1=an
 +
          └┴┴┴┴──── 0
 +
 
 +
0xEE  Dieser Befehl ist zum testen der Tastatur. Die Tastatur sollte mit 0xEE antworten.
 +
 
 +
0xF0  Auswählen des Scancodes. Als Parameter den Scancode 1, 2(standard) oder 3 auf Port 0x60 senden.
 +
      (Anmerkung: Kann man mit dem Wert 0 als Parameter den aktuellen Scancode auslesen?)
 +
 
 +
0xF2  Diesen Befhel sendet man zum identifiziren der Tastatur. Es gibt folgende Rückgabewerte:
 +
 
 +
      XT Tastatur    :  Timeout (Port[0x64].Bit[6]=1)
 +
      AT Tastatur    :  Rückgabewert 0xFA
 +
      MF II Tastatur :  Rückgabewert 0xFA 0xAB 0x41
 +
 
 +
0xF3  Setzen der Wiederholrate für gedrückte Tasten. Ein zweites Byte wird über Port 0x60 gesendet:
 +
 
 +
      Bit 76543210
 +
          │││└┴┴┴┴─ Wiederholrate der Taste nach der Wartezeit
 +
          │││      Wert  : Wiederholungen pro Sekunde
 +
          │││      00000 : 30
 +
          │││      00001 : 26,7
 +
          │││      00010 : 24
 +
          │││      00100 : 20
 +
          │││      01000 : 15
 +
          │││      01010 : 10
 +
          │││      01101 :  9
 +
          │││      10000 :  7,5
 +
          │││      10100 :  5
 +
          │││      11111 :  2
 +
          │││
 +
          │└┴────── Wartezeit bevor eine gehaltene Taste wiederholt wird.
 +
          │        00 :  250 ms
 +
          │        01 :  500 ms
 +
          │        10 :  750 ms
 +
          │        11 : 1000 ms
 +
          │
 +
          └──────── 0
 +
 
 +
0xF4  ?
 +
0xF5  ?
 +
0xF6  ?
 +
 
 +
0xFE  ?
 +
 
 +
0xFF  ?
 +
 
 
</pre>
 
</pre>