#include <fs_devfs.h>
#include <api_drv_common.h>
#include <api_drv_keyboard.h>
-#include "kb_kbdus.h"
+#include <Input/Keyboard/include/keyboard.h>
+#include "kb_transtab.h"
// === CONSTANTS ===
#define KB_BUFFER_SIZE 1024
#define USE_KERNEL_MAGIC 1
-// === IMPORTS ===
-extern void Threads_ToggleTrace(int TID);
-extern void Threads_Dump(void);
-extern void Heap_Stats(void);
-
// === PROTOTYPES ===
int KB_Install(char **Arguments);
void KB_HandleScancode(Uint8 scancode);
int KB_IOCtl(tVFS_Node *Node, int Id, void *Data);
// === GLOBALS ===
-tVFS_NodeType gKB_NodeType = {
- .IOCtl = KB_IOCtl
-};
-tDevFS_Driver gKB_DevInfo = {
- NULL, "PS2Keyboard",
- { .Type = &gKB_NodeType }
-};
-tKeybardCallback gKB_Callback = NULL;
-Uint32 **gpKB_Map = gpKBDUS;
-Uint8 gbaKB_States[3][256];
- int gbKB_ShiftState = 0;
- int gbKB_CapsState = 0;
- int gbKB_KeyUp = 0;
- int giKB_KeyLayer = 0;
-#if USE_KERNEL_MAGIC
- int gbKB_MagicState = 0;
- int giKB_MagicAddress = 0;
- int giKB_MagicAddressPos = 0;
-#endif
+ int giPS2Kb_Layer;
+ int gbPS2Kb_KeyUp;
+tKeyboard *gPS2Kb_Info;
// === CODE ===
/**
*/
int KB_Install(char **Arguments)
{
- DevFS_AddDevice( &gKB_DevInfo );
- //Log("KB_Install: Installed");
+ gPS2Kb_Info = Keyboard_CreateInstance(KEYSYM_RIGHTGUI, "PS2Keyboard");
return MODULE_ERR_OK;
}
*/
void KB_HandleScancode(Uint8 scancode)
{
- Uint32 ch;
- int bCaseSwitch = (gbKB_ShiftState != 0) != (gbKB_CapsState != 0);
-
- //Log_Debug("Keyboard", "scancode = %02x", scancode);
+ Uint32 hidcode;
// Ignore ACKs
- if(scancode == 0xFA) {
- // Oh man! This is anarchic (I'm leaving it here to represent
- // the mess that Acess once was)
- //kb_lastChar = KB_ACK;
- return;
- }
+ if(scancode == 0xFA) return;
- // Layer +1
+ // Layer 1
if(scancode == 0xE0) {
- giKB_KeyLayer = 1;
+ giPS2Kb_Layer = 1;
return;
}
- // Layer +2
+ // Layer 2
if(scancode == 0xE1) {
- giKB_KeyLayer = 2;
+ giPS2Kb_Layer = 2;
return;
}
#if KB_ALT_SCANCODES
if(scancode == 0xF0)
{
- gbKB_KeyUp = 1;
+ gbPS2Kb_KeyUp = 1;
return;
}
#else
if(scancode & 0x80)
{
scancode &= 0x7F;
- gbKB_KeyUp = 1;
+ gbPS2Kb_KeyUp = 1;
}
#endif
-
- if( gKB_Callback )
- gKB_Callback( (giKB_KeyLayer << 8) | scancode | KEY_ACTION_RAWSYM );
- // Translate
- ch = gpKB_Map[giKB_KeyLayer*2+bCaseSwitch][scancode];
- // - Unknown characters in the shift layer fall through to lower
- if(bCaseSwitch && ch == 0)
- ch = gpKB_Map[giKB_KeyLayer*2][scancode];
- // Check for unknown key
- if(!ch)
+ hidcode = gp101_to_HID[giPS2Kb_Layer][scancode];
+ if( hidcode == 0)
{
- if(!gbKB_KeyUp)
- Log_Warning("Keyboard", "UNK %i %x", giKB_KeyLayer, scancode);
-// return ;
- // Can pass through to ensure each raw message has a up/down with it
+ Log_Warning("PS2Kb", "Unknown scancode %i:0x%x %s", giPS2Kb_Layer, scancode,
+ gbPS2Kb_KeyUp ? "release" : "press"
+ );
}
-
- // Key Up?
- if (gbKB_KeyUp)
+ else if( hidcode == -1 )
{
- 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(gKB_Callback) gKB_Callback( ch | KEY_ACTION_RELEASE );
-
- // Reset Layer
- giKB_KeyLayer = 0;
- return;
+ // Ignored (Fake shift)
}
-
- // Refire?
- if( gbaKB_States[giKB_KeyLayer][scancode] == 1 )
+ else
{
- if(gKB_Callback) gKB_Callback(ch | KEY_ACTION_REFIRE);
- giKB_KeyLayer = 0;
- return ;
- }
-
- // Set the bit relating to the key
- gbaKB_States[giKB_KeyLayer][scancode] = 1;
- // 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();
- }
-
- // --- Check for Kernel Magic Combos
- #if USE_KERNEL_MAGIC
- if(ch == KEY_LCTRL) {
- gbKB_MagicState |= 1;
- //Log_Log("Keyboard", "Kernel Magic LCTRL Down\n");
+ if( gbPS2Kb_KeyUp )
+ Keyboard_HandleKey( gPS2Kb_Info, (1 << 31) | hidcode );
+ else
+ Keyboard_HandleKey( gPS2Kb_Info, (0 << 31) | hidcode );
}
- if(ch == KEY_LALT) {
- gbKB_MagicState |= 2;
- //Log_Log("Keyboard", "Kernel Magic LALT Down\n");
- }
- if(gbKB_MagicState == 3)
- {
- switch(ch)
- {
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- case '8': case '9': case 'a': case 'b':
- case 'c': case 'd': case 'e': case 'f':
- {
- char str[4] = {'0', 'x', ch, 0};
- if(giKB_MagicAddressPos == BITS/4) return;
- giKB_MagicAddress |= atoi(str) << giKB_MagicAddressPos;
- giKB_MagicAddressPos ++;
- }
- return;
-
- // Instruction Tracing
- case 't':
- Log("Toggle instruction tracing on %i\n", giKB_MagicAddress);
- Threads_ToggleTrace( giKB_MagicAddress );
- giKB_MagicAddress = 0; giKB_MagicAddressPos = 0;
- return;
-
- // Thread List Dump
- case 'p': Threads_Dump(); return;
- // Heap Statistics
- case 'h': Heap_Stats(); return;
- // Dump Structure
- case 's': return;
- }
- }
- #endif
-
- if(gKB_Callback)
- gKB_Callback(ch | KEY_ACTION_PRESS);
-
- // Reset Layer
- giKB_KeyLayer = 0;
+
+ giPS2Kb_Layer = 0;
+ gbPS2Kb_KeyUp = 0;
}
/**
*/
void KB_UpdateLEDs(void)
{
- Uint8 leds;
+// Uint8 leds;
- leds = (gbKB_CapsState ? 4 : 0);
+// leds = (gbKB_CapsState ? 4 : 0);
// TODO: Update LEDS
Log_Warning("Keyboard", "TODO: Update LEDs");
}
-static const char *csaIOCTL_NAMES[] = {DRV_IOCTLNAMES, DRV_KEYBAORD_IOCTLNAMES, NULL};
-
-/**
- * \fn int KB_IOCtl(tVFS_Node *Node, int Id, void *Data)
- * \brief Calls an IOCtl Command
- */
-int KB_IOCtl(tVFS_Node *Node, int Id, void *Data)
-{
- switch(Id)
- {
- BASE_IOCTLS(DRV_TYPE_KEYBOARD, "KB", 0x100, csaIOCTL_NAMES);
-
- // Sets the Keyboard Callback
- case KB_IOCTL_SETCALLBACK:
- // Sanity Check
- if((Uint)Data < KERNEL_BASE) return 0;
- // Can only be set once
- if(gKB_Callback != NULL) return 0;
- // Set Callback
- gKB_Callback = Data;
- return 1;
-
- default:
- return 0;
- }
-}