Updates to VTerm to correctly handle framebuffer modes
[tpg/acess2.git] / Kernel / drv / kb.c
index 6c2bf92..5e07840 100644 (file)
@@ -2,7 +2,7 @@
  * Acess2
  * PS2 Keyboard Driver
  */
-#include <common.h>
+#include <acess.h>
 #include <modules.h>
 #include <fs_devfs.h>
 #include <tpl_drv_common.h>
@@ -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;
        }

UCC git Repository :: git.ucc.asn.au