Autor Thema: Problem mit KeyCode setzen  (Gelesen 5094 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« 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

maxinator

  • Beiträge: 21
    • Profil anzeigen
    • Maxinators HP - übers Leben und Programmieren :)
Gespeichert
« Antwort #1 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...

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 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:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 am: 21. October 2007, 12:14 »
Vielen Dank. Genau daran lags :-)

 

Einloggen