X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fkb.c;h=5e078406b595b0bcf0384b00ac3d8a52c1e2e023;hb=25f7f697bd6973264ecf4b9a666ffad1a49916e8;hp=aa807b53083755f6b2315ee6074ad4ce867f19cc;hpb=756b72155cbcec50d6117329cf3132168a8713b1;p=tpg%2Facess2.git diff --git a/Kernel/drv/kb.c b/Kernel/drv/kb.c index aa807b53..5e078406 100644 --- a/Kernel/drv/kb.c +++ b/Kernel/drv/kb.c @@ -11,6 +11,7 @@ // === CONSTANTS === #define KB_BUFFER_SIZE 1024 +#define USE_KERNEL_MAGIC 1 // === IMPORTS === void Threads_Dump(); @@ -56,10 +57,19 @@ Uint8 gbaKB_States[3][256]; */ int KB_Install(char **Arguments) { + Uint8 temp; + + // Attempt to get around a strange bug in Bochs/Qemu by toggling + // the controller on and off + temp = inb(0x61); + outb(0x61, temp | 0x80); + outb(0x61, temp & 0x7F); + inb(0x60); // Clear keyboard buffer + IRQ_AddHandler(1, KB_IRQHandler); DevFS_AddDevice( &gKB_DevInfo ); //Log("KB_Install: Installed"); - return 1; + return MODULE_ERR_OK; } /** @@ -72,16 +82,16 @@ void KB_IRQHandler() Uint32 ch; // int keyNum; - //if( inportb(0x64) & 0x20 ) return; + // Check port 0x64 to tell if this is from the aux port + //if( inb(0x64) & 0x20 ) return; scancode = inb(0x60); // Read from the keyboard's data buffer - - //Log("KB_IRQHandler: scancode = 0x%02x", scancode); + //Log_Debug("Keyboard", "scancode = %02x", scancode); // Ignore ACKs if(scancode == 0xFA) { - // Oh man! This is anachic (I'm leaving it here to represent the - // mess that Acess once was) + // Oh man! This is anarchic (I'm leaving it here to represent + // the mess that Acess once was) //kb_lastChar = KB_ACK; return; } @@ -116,7 +126,7 @@ void KB_IRQHandler() //keyNum = giKB_KeyLayer * 256 + scancode; // Check for unknown key if(!ch && !gbKB_KeyUp) - Warning("UNK %i %x", giKB_KeyLayer, scancode); + Log_Warning("Keyboard", "UNK %i %x", giKB_KeyLayer, scancode); // Key Up? if (gbKB_KeyUp) @@ -161,12 +171,19 @@ void KB_IRQHandler() // --- Check for Kernel Magic Combos #if USE_KERNEL_MAGIC - if(ch == KEY_LCTRL) gbKB_MagicState |= 1; - if(ch == KEY_LALT) gbKB_MagicState |= 2; + if(ch == KEY_LCTRL) { + gbKB_MagicState |= 1; + //Log_Log("Keyboard", "Kernel Magic LCTRL Down\n"); + } + if(ch == KEY_LALT) { + gbKB_MagicState |= 2; + //Log_Log("Keyboard", "Kernel Magic LALT Down\n"); + } if(gbKB_MagicState == 3) { switch(ch) { + case 'q': *((int*)1) = 0; break; case 'd': __asm__ __volatile__ ("xchg %bx, %bx"); break; case 'p': Threads_Dump(); break; }