Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: RedEagle am 21. October 2007, 08:43

Titel: Problem mit KeyCode setzen
Beitrag 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
Titel: Re: Problem mit KeyCode setzen
Beitrag von: maxinator am 21. October 2007, 10:41
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...
Titel: Re: Problem mit KeyCode setzen
Beitrag von: bluecode am 21. October 2007, 10:42
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/).
Titel: Re: Problem mit KeyCode setzen
Beitrag von: bluecode am 21. October 2007, 10:43
@maxinator: Dann hat die Tastatur zwar das Scancodeset gewechselt, aber der Tasturcontroller wird trotzdem noch den gleichen Mist machen. :wink:
Titel: Re: Problem mit KeyCode setzen
Beitrag von: RedEagle am 21. October 2007, 12:14
Vielen Dank. Genau daran lags :-)