Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: RedEagle am 21. October 2007, 08:43
-
Hi
Ich möchte bei meinem Tastaturtreiber den ScanCode Set 2 Aktivieren:
int SetScanCode2()
{
WaitToWrite();
cpu::out(0x60, 0xF0); //Scancode �ndern
WaitToRead();
if(GetKeyboardBuffer() != 0xFA)return KBDERR_SETSCANCODE;
WaitToWrite();
cpu::out(0x60, 0x02); //Scancode 2
WaitToRead();
if(GetKeyboardBuffer() != 0xFA)return KBDERR_SETSCANCODE;
return KBDERR_NOERROR;
}
/////////////////////////////////////////////////////////////////////////////////////
BYTE GetKeyboardBuffer()
{
return cpu::in(0x60);
}
/////////////////////////////////////////////////////////////////////////////////////
void WaitToRead()
{
DWORD timeout = KBD_MAXTIMEOUT;
while(!(cpu::in(0x64) & 0x1) && timeout--);
return;
}
/////////////////////////////////////////////////////////////////////////////////////
void WaitToWrite()
{
DWORD timeout = KBD_MAXTIMEOUT;
while((cpu::in(0x64) & 0x2) && timeout--);
return;
}
Die Funktion gibt "KBDERR_NOERROR" zurück.
Aber bei den Interrupts bekomme ich immernoch die Set1-Codes...
Ich teste den Treiber mom unter bochs 2.2.1
leider habe ich momentan keine echten PCs zum testen...
Wo liegt der Fehler??
ps.: Zum Initialisieren:
* Keyboard deaktivieren
* Scancode setzen
* LEDs setzen/löschen
* Treiberumgebung initialisieren
* Interrupt installieren
* Keyboard aktivieren
-
Ich weiß nicht, ob dir das hilft, aber ich habe das schon in assembler realisiert und es funktioniert:
mov al,0f0h ;Befehl für Scancode-Set wählen
out 60h,al ;Befehl senden
call kb.checkcmd ;prüfe ob Befehel ordnungsgemäß verarbeitet wurde
call kb.read ;hole Bestätigung (FAh)
mov al,02h ;Scancode-Set2 (default)
out 60h,al ;Wahl senden
call kb.checkcmd ;prüfe ob Befehel ordnungsgemäß verarbeitet wurde
call kb.read ;hole Bestätigung (FAh)
mov al,0aeh ;kopiere auf al befehl zum aktivieren des Keyboards
out 64h,al ;sende den Befehl an den KC
call kb.checkcmd ;prüfe ob Befehel ordnungsgemäß verarbeitet wurde
bochs gibt dann "Switched to acancode set 2" aus
vlt. solltest du einfach das keyboard vorher nicht deaktivieren...
-
Der Tastaturcontroller übersetzt normalerweise alle Scancodes automatisch zu Scancodes des Scancodeset 1 (um kompatibel zu älteren PCs zu bleiben). Dieses musst du über das Kommando 0x60 ("Write Command Byte") ausschalten. Mehr dazu findest du hier (http://www.computer-engineering.org/ps2keyboard/).
-
@maxinator: Dann hat die Tastatur zwar das Scancodeset gewechselt, aber der Tasturcontroller wird trotzdem noch den gleichen Mist machen. :wink:
-
Vielen Dank. Genau daran lags :-)