git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Kernel - Fixing bugs exposed with `qemu -nographic`
[tpg/acess2.git]
/
KernelLand
/
Modules
/
Input
/
Keyboard
/
main.c
diff --git
a/KernelLand/Modules/Input/Keyboard/main.c
b/KernelLand/Modules/Input/Keyboard/main.c
index
17c0f5f
..
9c2e20e
100644
(file)
--- a/
KernelLand/Modules/Input/Keyboard/main.c
+++ b/
KernelLand/Modules/Input/Keyboard/main.c
@@
-1,9
+1,9
@@
/*
/*
- * Acess2 Kernel - Keyboard
Character Mappings
+ * Acess2 Kernel - Keyboard
Driver
* - By John Hodge (thePowersGang)
*
* main.c
* - By John Hodge (thePowersGang)
*
* main.c
- * -
Core keyboard multiplexer
+ * -
Keyboard driver core
*
* TODO: Make the key transation code more general (for non-US layouts)
* TODO: Support multiple virtual keyboards
*
* TODO: Make the key transation code more general (for non-US layouts)
* TODO: Support multiple virtual keyboards
@@
-16,6
+16,7
@@
#include <Input/Keyboard/include/keyboard.h>
#include "keymap_int.h"
#include "layout_kbdus.h"
#include <Input/Keyboard/include/keyboard.h>
#include "keymap_int.h"
#include "layout_kbdus.h"
+#include <hal_proc.h>
#define USE_KERNEL_MAGIC 1
#define USE_KERNEL_MAGIC 1
@@
-28,11
+29,11
@@
extern void Heap_Stats(void);
// === PROTOTYPES ===
int Keyboard_Install(char **Arguments);
// === PROTOTYPES ===
int Keyboard_Install(char **Arguments);
-
void
Keyboard_Cleanup(void);
+
int
Keyboard_Cleanup(void);
// - Internal
tKeymap *Keyboard_LoadMap(const char *Name);
void Keyboard_FreeMap(tKeymap *Keymap);
// - Internal
tKeymap *Keyboard_LoadMap(const char *Name);
void Keyboard_FreeMap(tKeymap *Keymap);
-// -
User side
+// -
"User" side (Actually VT)
int Keyboard_IOCtl(tVFS_Node *Node, int ID, void *Data);
// - Device Side
tKeyboard *Keyboard_CreateInstance(int MaxSym, const char *Name);
int Keyboard_IOCtl(tVFS_Node *Node, int ID, void *Data);
// - Device Side
tKeyboard *Keyboard_CreateInstance(int MaxSym, const char *Name);
@@
-54,28
+55,50
@@
tDevFS_Driver gKB_DevInfo = {
#endif
// === CODE ===
#endif
// === CODE ===
+/**
+ * \brief Initialise the keyboard driver
+ */
int Keyboard_Install(char **Arguments)
{
int Keyboard_Install(char **Arguments)
{
+ /// - Register with DevFS
DevFS_AddDevice( &gKB_DevInfo );
return 0;
}
DevFS_AddDevice( &gKB_DevInfo );
return 0;
}
-void Keyboard_Cleanup(void)
+/**
+ * \brief Pre-unload cleanup function
+ */
+int Keyboard_Cleanup(void)
{
// TODO: Do I need this?
{
// TODO: Do I need this?
+ return 0;
}
}
-tKeymap *Keyboard_LoadMap(const char *Name)
+// --- Map Management ---
+/**
+ * \brief Load an arbitary keyboard map
+ * \param Name Keymap name (e.g. "en-us")
+ * \return Keymap pointer
+ */
+tKeymap *Keyboard_int_LoadMap(const char *Name)
{
{
+ Log_Warning("Keyboard", "TOD: Impliment Keyboard_int_LoadMap");
return NULL;
}
return NULL;
}
-void Keyboard_FreeMap(tKeymap *Keymap)
+/**
+ * \brief Unload a keyboard map
+ * \param Keymap Keymap to unload/free
+ */
+void Keyboard_int_FreeMap(tKeymap *Keymap)
{
}
// --- VFS Interface ---
static const char *csaIOCTL_NAMES[] = {DRV_IOCTLNAMES, DRV_KEYBAORD_IOCTLNAMES, NULL};
{
}
// --- VFS Interface ---
static const char *csaIOCTL_NAMES[] = {DRV_IOCTLNAMES, DRV_KEYBAORD_IOCTLNAMES, NULL};
+/**
+ * \brief Keyboard IOCtl
+ */
int Keyboard_IOCtl(tVFS_Node *Node, int Id, void *Data)
{
switch(Id)
int Keyboard_IOCtl(tVFS_Node *Node, int Id, void *Data)
{
switch(Id)
@@
-93,6
+116,11
@@
int Keyboard_IOCtl(tVFS_Node *Node, int Id, void *Data)
}
// --- Device Interface ---
}
// --- Device Interface ---
+/*
+ * Create a new keyboard device instance
+ * TODO: Allow linking to other VFS nodes
+ * See Input/Keyboard/include/keyboard.h
+ */
tKeyboard *Keyboard_CreateInstance(int MaxSym, const char *Name)
{
tKeyboard *ret;
tKeyboard *Keyboard_CreateInstance(int MaxSym, const char *Name)
{
tKeyboard *ret;
@@
-115,12
+143,20
@@
tKeyboard *Keyboard_CreateInstance(int MaxSym, const char *Name)
return ret;
}
return ret;
}
+/*
+ * Destroy a keyboard instance
+ * - See Input/Keyboard/include/keyboard.h
+ */
void Keyboard_RemoveInstance(tKeyboard *Instance)
{
// TODO: Implement
Log_Error("Keyboard", "TODO: Implement Keyboard_RemoveInstance");
}
void Keyboard_RemoveInstance(tKeyboard *Instance)
{
// TODO: Implement
Log_Error("Keyboard", "TODO: Implement Keyboard_RemoveInstance");
}
+/*
+ * Handle a key press/release event
+ * - See Input/Keyboard/include/keyboard.h
+ */
void Keyboard_HandleKey(tKeyboard *Source, Uint32 HIDKeySym)
{
int bPressed;
void Keyboard_HandleKey(tKeyboard *Source, Uint32 HIDKeySym)
{
int bPressed;
@@
-128,10
+164,19
@@
void Keyboard_HandleKey(tKeyboard *Source, Uint32 HIDKeySym)
Uint32 flag;
Uint8 layer;
Uint32 flag;
Uint8 layer;
+ if( !Source ) {
+ Log_Error("Keyboard", "Passed NULL handle");
+ return ;
+ }
+ if( !Source->Node ) {
+ Log_Error("Keyboard", "Passed handle with NULL node");
+ return ;
+ }
+
bPressed = !(HIDKeySym & (1 << 31));
HIDKeySym &= 0x7FFFFFFF;
bPressed = !(HIDKeySym & (1 << 31));
HIDKeySym &= 0x7FFFFFFF;
- //
Determine action
+ //
- Determine the action (Press, Release or Refire)
{
Uint8 mask = 1 << (HIDKeySym&7);
int ofs = HIDKeySym / 8;
{
Uint8 mask = 1 << (HIDKeySym&7);
int ofs = HIDKeySym / 8;
@@
-152,7
+197,7
@@
void Keyboard_HandleKey(tKeyboard *Source, Uint32 HIDKeySym)
else
Source->KeyStates[ ofs ] &= ~mask;
else
Source->KeyStates[ ofs ] &= ~mask;
- // Get the
action (Press, Refire or Release)
+ // Get the
final flag
if( bPressed )
{
if( !oldstate && !otherstate )
if( bPressed )
{
if( !oldstate && !otherstate )
@@
-165,7
+210,7
@@
void Keyboard_HandleKey(tKeyboard *Source, Uint32 HIDKeySym)
if( !otherstate )
flag = KEY_ACTION_RELEASE; // Up
else
if( !otherstate )
flag = KEY_ACTION_RELEASE; // Up
else
- flag = -1
; // Do nothing
+ flag = -1; // Do nothing
}
}
}
}
@@
-173,7
+218,7
@@
void Keyboard_HandleKey(tKeyboard *Source, Uint32 HIDKeySym)
// TODO: Support non-trivial layouts
layer = !!(Source->State & 3);
// TODO: Support non-trivial layouts
layer = !!(Source->State & 3);
- //
Send raw symbol
+ //
Do translation
if( flag == KEY_ACTION_RELEASE )
trans = 0;
else {
if( flag == KEY_ACTION_RELEASE )
trans = 0;
else {
@@
-190,6
+235,7
@@
void Keyboard_HandleKey(tKeyboard *Source, Uint32 HIDKeySym)
trans = Source->Keymap->Layers[0]->Sym[HIDKeySym];
}
trans = Source->Keymap->Layers[0]->Sym[HIDKeySym];
}
+ // Call callback (only if the action is valid)
if( flag != -1 )
{
tKeybardCallback Callback = (void*)Source->Node->ImplInt;
if( flag != -1 )
{
tKeybardCallback Callback = (void*)Source->Node->ImplInt;
@@
-212,7
+258,8
@@
void Keyboard_HandleKey(tKeyboard *Source, Uint32 HIDKeySym)
// --- Check for Kernel Magic Combos
#if USE_KERNEL_MAGIC
// --- Check for Kernel Magic Combos
#if USE_KERNEL_MAGIC
- if(Source->KeyStates[KEYSYM_LEFTCTRL/8] & (1 << (KEYSYM_LEFTCTRL&7))
+ if(bPressed
+ && Source->KeyStates[KEYSYM_LEFTCTRL/8] & (1 << (KEYSYM_LEFTCTRL&7))
&& Source->KeyStates[KEYSYM_LEFTALT/8] & (1 << (KEYSYM_LEFTALT &7)) )
{
int val;
&& Source->KeyStates[KEYSYM_LEFTALT/8] & (1 << (KEYSYM_LEFTALT &7)) )
{
int val;
@@
-243,6
+290,8
@@
void Keyboard_HandleKey(tKeyboard *Source, Uint32 HIDKeySym)
case 'p': Threads_Dump(); return;
// Heap Statistics
case 'h': Heap_Stats(); return;
case 'p': Threads_Dump(); return;
// Heap Statistics
case 'h': Heap_Stats(); return;
+ // PMem Statistics
+ case 'm': MM_DumpStatistics(); return;
// Dump Structure
case 's': return;
}
// Dump Structure
case 's': return;
}
UCC
git Repository :: git.ucc.asn.au