X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fkb.c;h=5e078406b595b0bcf0384b00ac3d8a52c1e2e023;hb=eecce4b7a55315f6c385ad8be35c25dbb12d43d8;hp=b5428b5b2527f6ded2efa278e0747edb227766a7;hpb=a4ce2e60f783c9e71447edc03f20f937b8abf35a;p=tpg%2Facess2.git diff --git a/Kernel/drv/kb.c b/Kernel/drv/kb.c index b5428b5b..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,9 +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 ); - return 1; + //Log("KB_Install: Installed"); + return MODULE_ERR_OK; } /** @@ -71,18 +82,20 @@ 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_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; } - + // Layer +1 if(scancode == 0xE0) { giKB_KeyLayer = 1; @@ -93,7 +106,7 @@ void KB_IRQHandler() giKB_KeyLayer = 2; return; } - + #if KB_ALT_SCANCODES if(scancode == 0xF0) { @@ -107,32 +120,32 @@ void KB_IRQHandler() gbKB_KeyUp = 1; } #endif - + // Translate ch = gpKB_Map[giKB_KeyLayer][scancode]; //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) { gbKB_KeyUp = 0; gbaKB_States[giKB_KeyLayer][scancode] = 0; // Unset key state flag - + #if USE_KERNEL_MAGIC if(ch == KEY_LCTRL) gbKB_MagicState &= ~1; if(ch == KEY_LALT) gbKB_MagicState &= ~2; #endif - + if(ch == KEY_LSHIFT) gbKB_ShiftState &= ~1; if(ch == KEY_RSHIFT) gbKB_ShiftState &= ~2; - + // Call callback if(ch != 0 && gKB_Callback) gKB_Callback( ch & 0x80000000 ); - + // Reset Layer giKB_KeyLayer = 0; return; @@ -143,33 +156,40 @@ void KB_IRQHandler() // Set shift key bits if(ch == KEY_LSHIFT) gbKB_ShiftState |= 1; if(ch == KEY_RSHIFT) gbKB_ShiftState |= 2; - + // Check for Caps Lock if(ch == KEY_CAPSLOCK) { gbKB_CapsState = !gbKB_CapsState; KB_UpdateLEDs(); } - + // Reset Layer giKB_KeyLayer = 0; // Ignore Non-Printable Characters if(ch == 0) return; - + // --- 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; } } #endif - + // Is shift pressed // - Darn ugly hacks !(!x) means (bool)x if( !(!gbKB_ShiftState) ^ gbKB_CapsState) @@ -204,7 +224,7 @@ void KB_IRQHandler() break; } } - + if(gKB_Callback && ch != 0) gKB_Callback(ch); } @@ -215,12 +235,12 @@ void KB_IRQHandler() void KB_UpdateLEDs() { Uint8 leds; - + leds = (gbKB_CapsState ? 4 : 0); - + while( inb(0x64) & 2 ); // Wait for bit 2 to unset outb(0x60, 0xED); // Send update command - + while( inb(0x64) & 2 ); // Wait for bit 2 to unset outb(0x60, leds); } @@ -237,7 +257,7 @@ int KB_IOCtl(tVFS_Node *Node, int Id, void *Data) case DRV_IOCTL_IDENT: memcpy(Data, "KB\0\0", 4); return 1; case DRV_IOCTL_VERSION: return 0x100; case DRV_IOCTL_LOOKUP: return 0; - + // Sets the Keyboard Callback case KB_IOCTL_SETCALLBACK: // Sanity Check @@ -247,7 +267,7 @@ int KB_IOCtl(tVFS_Node *Node, int Id, void *Data) // Set Callback gKB_Callback = Data; return 1; - + default: return 0; }