Keyboard Controller — Änderungen 2220 → 2222

Zeile 12: Zeile 12:
 
*Zusammen mit dem [[Programmable Interval Timer | PIT]] den [[Systemlautsprecher]] ansteuern.
 
*Zusammen mit dem [[Programmable Interval Timer | PIT]] den [[Systemlautsprecher]] ansteuern.
  
−
*Information ob das System eine Monochrom- oder Farbgrafikkarte benutzt
+
*Information ob das System eine Monochrom- oder Farbgrafikkarte benutzt (Irrelevant: Farbgrafik wurde mit XT Systemen als Standard eingeführt!)
  
 
<br>
 
<br>
 
== Kommunikationswege ==
 
== Kommunikationswege ==
 
<br>
 
<br>
−
http://img229.imageshack.us/img229/3005/kbclogic20071103ev6.png
+
http://img441.imageshack.us/img441/636/kbclogic20071105bt5.png
 
<br>
 
<br>
 
<br>
 
<br>
−
Programmiert wird der KBC über die 3 Ports 0x60, 0x61 und 0x64.<br>
 
  
 
Normalerweise wird das erste Auxiliary Port (PSAUX0*) für eine Tastatur verwendet und an das zweite (PSAUX1*) ein Maus oder ein anderes Zeigegerät angeschlossen. Technisch unterscheiden sich die beiden Ports nicht. Daher kann man dort beliebige Gerätekombinationen anschließen, solange das BIOS nicht mit einer Fehlermeldung stoppt, weil es bestimmte Geräte an bestimmten Ports erwartet. Beliebige Gerätekombinationen werden z.B. von Linux unterstützt, nicht jedoch von Windows.<br>
 
Normalerweise wird das erste Auxiliary Port (PSAUX0*) für eine Tastatur verwendet und an das zweite (PSAUX1*) ein Maus oder ein anderes Zeigegerät angeschlossen. Technisch unterscheiden sich die beiden Ports nicht. Daher kann man dort beliebige Gerätekombinationen anschließen, solange das BIOS nicht mit einer Fehlermeldung stoppt, weil es bestimmte Geräte an bestimmten Ports erwartet. Beliebige Gerätekombinationen werden z.B. von Linux unterstützt, nicht jedoch von Windows.<br>
Zeile 41: Zeile 40:
  
 
== Programmieren des KBC ==
 
== Programmieren des KBC ==
 +
 +
Programmiert wird der KBC über die 2 Ports 0x60 und 0x64. Dabei werden auf den Ports nur Bytes gesendet und empfangen.<br>
 +
<br>
 +
Über das Port 0x64 kann man das Statusregister auslesen und KBC-Befehle senden.<br>
 +
<br>
 +
Das Port 0x60 dient als Ein-/Ausgabe Puffer. Parameter oder Rückgabewerte für einen Befehl werden über dieses Port geschrieben bzw. gelesen. Wenn keine Befehlsparameter erwartet werden und man auf das Port 0x60 schreibt, wird direkt an PSAUX0 weitergeleitet.<br>
 +
 +
*Vor dem Schreiben auf Port 0x60 oder 0x64 muss der Eingabepuffers leer sein. (Port[0x64].Bit[1] == 0)
 +
*Vor dem Lesen von Port 0x60 muss der Ausgabepuffers voll sein (Port[0x64].Bit[0] == 1)
 +
 
=== Statusregister ===
 
=== Statusregister ===
 
lesen von Port 0x64
 
lesen von Port 0x64
Zeile 47: Zeile 56:
 
     │││││││└─ Status des Ausgabepuffers (KBC -> CPU) :  0=leer;  1=voll (es kann von Port 0x60 gelesen werden)
 
     │││││││└─ 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
 
     ││││││└── 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
+
     │││││└─── 1=Erfolgreicher Selbsttest (Wie Controller_Command_Byte.Bit[3]; sollte immer 1 sein)
 
     ││││└──── zuletzt benutztes Port : 0=0x60;  1=0x61 oder 0x64?
 
     ││││└──── zuletzt benutztes Port : 0=0x60;  1=0x61 oder 0x64?
 
     │││└───── Tastatursperre : 0=Tastatur gesperrt; 1=Tastatur nicht gesperrt
 
     │││└───── Tastatursperre : 0=Tastatur gesperrt; 1=Tastatur nicht gesperrt
 
     ││└────── PSAUX?
 
     ││└────── PSAUX?
 
     │└─────── Timeout : 1=Tastatur oder PSAUX-Gerät ragiert nicht?
 
     │└─────── Timeout : 1=Tastatur oder PSAUX-Gerät ragiert nicht?
−
     └──────── Paritätsfehler : 1=Beim letzten Senden/Empfangen trat ein Paritätsfehler auf
+
     └──────── Paritätsfehler : 1=Beim letzten Byte Senden/Empfangen trat ein Paritätsfehler auf
 
</pre>
 
</pre>
 
<br>
 
<br>
  
−
=== Inputport ===
+
=== Input Port P1 ===
 +
Nur aus Vollständigkeitsgründen hier aufgeführt!!! Wie man mit einem kurzen Blick erkennen kann heute nicht mehr relevant!
 
Lesen über KBC-Befehl 0xC0
 
Lesen über KBC-Befehl 0xC0
 
<pre>
 
<pre>
Zeile 62: Zeile 72:
 
     │││││││└─ Keyboard data in pin?
 
     │││││││└─ Keyboard data in pin?
 
     ││││││└── PS/2 mouse in pin?
 
     ││││││└── PS/2 mouse in pin?
−
     │││││└─── Reserviert
+
     │││││└─── Unused in ISA, EISA, PS/2 systems, Can be configured for clock switching
−
     ││││└──── Reserviert
+
     ││││└──── Unused in ISA, EISA, PS/2 systems, Can be configured for clock switching
−
     │││└───── Reserviert
+
     │││└───── Speicher auf dem Mainboard:  0= 512 KB, 1= 256 KB
−
     ││└────── Reserviert
+
    │││     
−
     │└─────── Wether you have a color or mono screen?
+
     ││└────── Manufacturing jumper 0= installed, 1= not installed
 +
    ││        with jumper the BIOS runs an infinite diagnostic loop
 +
     │└─────── Grafikkarte: 0=Color Graphics Adapter (CGA), 1=Monochrome Display Adapter (MDA)
 +
    │        Kleiner Tip: CGA wurde mit den XT System eingeführt. ;)
 
     └──────── Tastatursperre : 0=Tastatur gesperrt;  1=Tastatur nicht gesperrt
 
     └──────── Tastatursperre : 0=Tastatur gesperrt;  1=Tastatur nicht gesperrt
 
</pre>
 
</pre>
Zeile 87: Zeile 100:
 
<br>
 
<br>
  
−
 
+
=== Controller Command Byte ===
−
=== Port 0x61 ===
+
Lesen über KBC-Befehl 0x20<br>
−
lesen und schreiben
+
Schreiben über KBC-Befehl 0x60
 
<pre>
 
<pre>
 
Bit 76543210
 
Bit 76543210
−
     │││││││└─ PPI \
+
     │││││││└─ 1=Erzeuge einen IRQ1 wenn PSAUX0 daten auf Port 0x60 ausgibt
−
     ││││││└── PPI  \
+
     ││││││└── 1=Erzeuge einen IRQ12 wenn PSAUX1 daten auf Port 0x60 ausgibt
−
     │││││└─── PPI  |Dieser Teil ist vom Programmable Peripheral Interface
+
     │││││└─── 1=Erfolgreicher Selbsttest (Wie Statusregister.Bit[3]; sollte immer 1 sein)
−
     ││││└──── PPI  |nicht überschreiben!
+
     ││││└──── AT  : 1=Tastatursperre Ignorieren (Statusregister Bit4 immer 1)
−
     │││└───── PPI  /
+
    ││││      PS/2: 0 (unbenutzt)
−
     ││└────── PPI /
+
     │││└───── 1 = Die Taktleitung zu PSAUX0 auf low halten und damit das Senden/Empfangen unterbinden
−
     │└─────── Setzt die "clock"-Leitung auf low, so dass die Tastatur keine Daten an den PC senden kann
+
     ││└────── EISA, PS/2 : 1 = Die Taktleitung zu PSAUX1 auf low halten und damit das Senden/Empfangen unterbinden
−
     └──────── 0=Tastatur eingeschaltet;  1=Tastatur ausgeschaltet
+
     ││        ISA : 0 = Benutze 11 Bit Übertragung, Paritätsüberprüfung und konvertiere PSAUX0 Bytes*
 +
    ││              1 = Benutze 8086 Übertragung, keine Paritätsüberprüfung oder Konvertierung
 +
    │└─────── ? 1=Der KBC übersetzt von PSAUX eingehenden Bytes*
 +
     └──────── 0 (reserviert)
 
</pre>
 
</pre>
 
<br>
 
<br>
 +
 +
*KBC Scancode-Übersetzung: http://www.win.tue.nl/~aeb/linux/kbd/scancodes-10.html#translationtable
 +
  
 
=== KBC-Befehle ===
 
=== KBC-Befehle ===