Keyboard Controller — Änderungen 2435 → 2440

Zeile 21: Zeile 21:
 
<br>
 
<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 der erste Auxiliary Port (PSAUX0*) für eine Tastatur verwendet und an den zweiten (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>
  
 
(*Anmerkung zu PSAUX0 und PSAUX1: Diese Begriffe habe ich mir "ausgedacht", da ich keine vernünftige offizielle Bezeichnung kenne. Man wird diese Begriffe also in keiner anderen Referenz finden. Außer es wurde hier abgeschrieben.)
 
(*Anmerkung zu PSAUX0 und PSAUX1: Diese Begriffe habe ich mir "ausgedacht", da ich keine vernünftige offizielle Bezeichnung kenne. Man wird diese Begriffe also in keiner anderen Referenz finden. Außer es wurde hier abgeschrieben.)
Zeile 27: Zeile 27:
  
 
== USB Legacy Support ==
 
== USB Legacy Support ==
−
Diese von vielen Mainboards bereitgestellt Funktion simuliert angeschlossene USB-Geräte wie Maus und Tastatur als PS/2 Geräte.<br>
+
Diese von vielen Mainboards bereitgestellte Funktion simuliert angeschlossene USB-Geräte wie Maus und Tastatur als PS/2 Geräte.<br>
 
<br>
 
<br>
 
Dies hat für Programmierer Vor- und Nachteile. Einerseits muss man für die Unterstützung solcher Eingabegeräte keine eigenen USB Treiber programmieren. Andererseits ergeben sich damit einige der hier aufgelisteten Probleme:<br>
 
Dies hat für Programmierer Vor- und Nachteile. Einerseits muss man für die Unterstützung solcher Eingabegeräte keine eigenen USB Treiber programmieren. Andererseits ergeben sich damit einige der hier aufgelisteten Probleme:<br>
Zeile 43: Zeile 43:
 
Programmiert wird der KBC über die 2 Ports 0x60 und 0x64. Dabei werden auf den Ports nur Bytes gesendet und empfangen.<br>
 
Programmiert wird der KBC über die 2 Ports 0x60 und 0x64. Dabei werden auf den Ports nur Bytes gesendet und empfangen.<br>
 
<br>
 
<br>
−
Über das Port 0x64 kann man das Statusregister auslesen und KBC-Befehle senden.<br>
+
Über den Port 0x64 kann man das Statusregister auslesen und KBC-Befehle senden.<br>
 
<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>
+
Der Port 0x60 dient als Ein-/Ausgabe Puffer. Parameter oder Rückgabewerte für einen Befehl werden über diesen Port geschrieben bzw. gelesen. Wenn keine Befehlsparameter erwartet werden und man auf den 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 Schreiben auf Port 0x60 oder 0x64 muss der Eingabepuffer leer sein. (Port[0x64].Bit[1] == 0)
−
*Vor dem Lesen von Port 0x60 muss der Ausgabepuffers voll sein (Port[0x64].Bit[0] == 1)
+
*Vor dem Lesen von Port 0x60 muss der Ausgabepuffer voll sein (Port[0x64].Bit[0] == 1)
  
 
=== Statusregister ===
 
=== Statusregister ===
Zeile 57: Zeile 57:
 
     ││││││└── 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
 
     │││││└─── 1=Erfolgreicher Selbsttest (Wie Controller_Command_Byte.Bit[3]; sollte immer 1 sein)
 
     │││││└─── 1=Erfolgreicher Selbsttest (Wie Controller_Command_Byte.Bit[3]; sollte immer 1 sein)
−
     ││││└──── zuletzt benutztes Port : 0=0x60;  1=0x61 oder 0x64?
+
     ││││└──── zuletzt benutzter 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?
Zeile 318: Zeile 318:
 
jne  wait2
 
jne  wait2
  
−
;Den neuen Wert für das Inputport über Port 0x60 senden
+
;Den neuen Wert für den Inputport über Port 0x60 senden
 
mov  al, 0xFE
 
mov  al, 0xFE
 
out  0x60, al
 
out  0x60, al