Keyboard Controller — Änderungen 1769 → 1777

Zeile 1: Zeile 1:
−
Der Keyboard Controller (KBC) sitzt auf dem Mainboard und dient, wie der Name vermuten lässt, unter anderem der Tastaturansteuerung. Er hat jedoch noch viele weitere Funktionen.
+
Der Keyboard Controller (KBC) sitzt auf dem Mainboard und dient, wie der Name vermuten lässt, unter anderem der Tastaturansteuerung. Aus historischen Gründen und da er eng mit dem Programmable Peripheral Interface (PPI) verbunden ist hat er noch viele weitere Funktionen.
  
 
Funktionen des KBC:
 
Funktionen des KBC:
 
*Ansteuerung der Tastatur
 
*Ansteuerung der Tastatur
−
*Ansteuerung des PSAUX-Ports (z.B. PS/2-Maus)
+
*Ansteuerung des Auxiliary Port (z.B. PS/2-Maus)
−
*ein-/ausschalten der 21-Adressleitung (a20-Gate)
+
*ein-/ausschalten der 21-Adressleitung ([[A20-Gate]])
−
*CPU-Reset auslösen
+
*CPU-Reset auslösen, also neustarten des Systems
−
*ein-/ausschalten des Systemlautsprechers
 
 
*Information ob das System eine Monochrom- oder Farbgrafikkarte benutzt
 
*Information ob das System eine Monochrom- oder Farbgrafikkarte benutzt
−
 
−
Zur Komunikation mit dem KBC werden die Ports 0x60, 0x61 und 0x64 verwendet.<br>
 
−
 
−
http://img241.imageshack.us/img241/5692/kbcnr6.png
 
 
<br>
 
<br>
−
Statusregister<br>
+
== KBC-Typen ==
−
 
+
Es gibt mehrere KBC-Typen. Grob kann man alle diese Typen jedoch in zwei Arten einteilen.
−
 
+
=== XT-KBC ===
−
 
+
In alten XT-Systemen wurde nur über das Programmable Peripheral Interface (PPI) mit der Tastatur kommuniziert. Alle Scancodes der gedrückten Tasten konnten über Port 0x60 gelesen werden. Über die Bits 6-7 von Port 0x61 wird die Tastatur ein und aus geschaltete.<br>
 +
<br>
 +
http://img252.imageshack.us/img252/545/xtkbcaa3.png
 +
=== AT-KBC ===
 +
In den nachfolgenden AT-Systemen wird über Port 0x64 die direkte Kommunikation mit der Tastatur ermöglicht. Außerdem wurde mit dem Auxiliary Port die Unterstüzung für ein weiteres Gerät hinzugefürgt. <br>
 +
<br>
 +
http://img252.imageshack.us/img252/6256/atkbcml3.png
 +
<br>
 +
<br>
  
−
Statusregister (lesen von Port 0x64)
+
== Programmieren des KBC ==
 +
=== Statusregister ===
 +
lesen von Port 0x64
 
<pre>
 
<pre>
 
Bit 76543210
 
Bit 76543210
Zeile 32: Zeile 37:
 
<br>
 
<br>
  
−
Inputport (Lesen über KBC-Befehl 0xC0)
+
=== Inputport ===
 +
Lesen über KBC-Befehl 0xC0
 
<pre>
 
<pre>
 
Bit 76543210
 
Bit 76543210
Zeile 46: Zeile 52:
 
<br>
 
<br>
  
−
Outputport (Lesen über KBC-Befehl 0xD0, schreiben über KBC-Befehl 0xD1)
+
=== Outputport ===
 +
Lesen über KBC-Befehl 0xD0<br>
 +
schreiben über KBC-Befehl 0xD1
 
<pre>
 
<pre>
 
Bit 76543210
 
Bit 76543210
Zeile 61: Zeile 69:
  
  
−
Port 0x61 (lesen und schreiben)
+
=== Port 0x61 ===
 +
lesen und schreiben
 
<pre>
 
<pre>
 
Bit 76543210
 
Bit 76543210
Zeile 75: Zeile 84:
 
<br>
 
<br>
  
−
KBC-Befehle (schreiben auf Port 0x64)<br>
+
=== KBC-Befehle ===
−
Bevor man auf Port 0x64 schreibt, müssen Port[0x60].Bit[1]==0 und Port[0x60].Bit[2]==1 sein!
+
schreiben auf Port 0x64 (Bevor man auf Port 0x64 schreibt, muss der Ausgabepuffer leer sein (Port[0x64].Bit[1]==0) und die Tastatur darf sich nicht mehr im Resetmodus befinden (Port[0x64].Bit[2]==1))
 
<pre>
 
<pre>
 
0xAA  Tastatur-Selbsttest. Sollte 0x55 auf Port 0x60 zurückgeben.
 
0xAA  Tastatur-Selbsttest. Sollte 0x55 auf Port 0x60 zurückgeben.
Zeile 111: Zeile 120:
 
<br>
 
<br>
  
−
Tastatur-Befehle (schreiben auf Port 0x60)<br>
+
=== Tastatur-Befehle ===
−
Bevor man auf Port 0x60 schreibt, müssen Port[0x60].Bit[1]==0 und Port[0x60].Bit[2]==1 sein!
+
schreiben auf Port 0x60 (Bevor man auf Port 0x60 schreibt, muss der Ausgabepuffer leer sein (Port[0x64].Bit[1]==0) und die Tastatur darf sich nicht mehr im Resetmodus befinden (Port[0x64].Bit[2]==1))
 
<pre>
 
<pre>
 
0xED  Setzen der LEDs auf der Tastatur. Ein zweites Byte wird über Port 0x60 gesendet:
 
0xED  Setzen der LEDs auf der Tastatur. Ein zweites Byte wird über Port 0x60 gesendet:
Zeile 165: Zeile 174:
 
0xFF  ?
 
0xFF  ?
  
 +
</pre>
 +
 +
== Beispiele zur benutzen der KBC Funktionen ==
 +
 +
=== Ein einfacher Tastatur Handler ===
 +
 +
... kommt noch ;)
 +
 +
=== CPU-reset ===
 +
Der CPU-Reset wird ausgelöst indem der Wert 0xFE in das Outputport geschrieben wird.
 +
<pre>
 +
;Warten bis der Eingabepuffer lehr ist
 +
wait:
 +
in  al, x064
 +
test al, 00000010b
 +
jne  wait
 +
 +
;Befehl 0xD1 zum schreiben des Inputports an den KBC senden
 +
mov  al, 0xD1
 +
out  0x64, al
 +
 +
;Wieder warten bis der Eingabepuffer lehr ist
 +
wait2:
 +
in  al, x064
 +
test al, 00000010b
 +
jne  wait2
 +
 +
;Den neuen Wert für das Inputport über Port 0x60 senden
 +
mov  al, 0xFE
 +
out  0x60, al
 
</pre>
 
</pre>