| Zeile 1: | Zeile 1: | ||
| − | Der Keyboard Controller (KBC) sitzt auf dem Mainboard und dient, wie der Name vermuten lässt, unter anderem der Tastaturansteuerung. | + | 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 | + | *Ansteuerung des Auxiliary Port (z.B. PS/2-Maus) |
| − | *ein-/ausschalten der 21-Adressleitung ( | + | *ein-/ausschalten der 21-Adressleitung ([[A20-Gate]]) |
| − | *CPU-Reset auslösen | + | *CPU-Reset auslösen, also neustarten des Systems |
| − | |||
*Information ob das System eine Monochrom- oder Farbgrafikkarte benutzt | *Information ob das System eine Monochrom- oder Farbgrafikkarte benutzt | ||
| − | |||
| − | |||
| − | |||
| − | |||
<br> | <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 | + | == Programmieren des KBC == |
| + | === Statusregister === | ||
| + | lesen von Port 0x64 | ||
<pre> | <pre> | ||
Bit 76543210 | Bit 76543210 | ||
| Zeile 32: | Zeile 37: | ||
<br> | <br> | ||
| − | Inputport | + | === Inputport === |
| + | Lesen über KBC-Befehl 0xC0 | ||
<pre> | <pre> | ||
Bit 76543210 | Bit 76543210 | ||
| Zeile 46: | Zeile 52: | ||
<br> | <br> | ||
| − | Outputport | + | === Outputport === |
| + | Lesen über KBC-Befehl 0xD0<br> | ||
| + | schreiben über KBC-Befehl 0xD1 | ||
<pre> | <pre> | ||
Bit 76543210 | Bit 76543210 | ||
| Zeile 61: | Zeile 69: | ||
| − | Port 0x61 | + | === Port 0x61 === |
| + | lesen und schreiben | ||
<pre> | <pre> | ||
Bit 76543210 | Bit 76543210 | ||
| Zeile 75: | Zeile 84: | ||
<br> | <br> | ||
| − | KBC-Befehle | + | === KBC-Befehle === |
| − | Bevor man auf Port 0x64 schreibt, | + | 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 | + | === Tastatur-Befehle === |
| − | Bevor man auf Port 0x60 schreibt, | + | 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> | ||