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
Fixed logging to support 8-charater identifiers
[tpg/acess2.git]
/
Kernel
/
drv
/
kb.c
diff --git
a/Kernel/drv/kb.c
b/Kernel/drv/kb.c
index
6c2bf92
..
6577882
100644
(file)
--- a/
Kernel/drv/kb.c
+++ b/
Kernel/drv/kb.c
@@
-2,7
+2,7
@@
* Acess2
* PS2 Keyboard Driver
*/
* Acess2
* PS2 Keyboard Driver
*/
-#include <
common
.h>
+#include <
acess
.h>
#include <modules.h>
#include <fs_devfs.h>
#include <tpl_drv_common.h>
#include <modules.h>
#include <fs_devfs.h>
#include <tpl_drv_common.h>
@@
-11,6
+11,7
@@
// === CONSTANTS ===
#define KB_BUFFER_SIZE 1024
// === CONSTANTS ===
#define KB_BUFFER_SIZE 1024
+#define USE_KERNEL_MAGIC 1
// === IMPORTS ===
void Threads_Dump();
// === IMPORTS ===
void Threads_Dump();
@@
-56,9
+57,19
@@
Uint8 gbaKB_States[3][256];
*/
int KB_Install(char **Arguments)
{
*/
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 );
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;
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
scancode = inb(0x60); // Read from the keyboard's data buffer
+ //Log_Debug("Keyboard", "scancode = %02x", scancode);
// Ignore ACKs
if(scancode == 0xFA) {
// Ignore ACKs
if(scancode == 0xFA) {
- // Oh man! This is ana
chic (I'm leaving it here to represent the
- //
mess that acess once was
+ // Oh man! This is ana
rchic (I'm leaving it here to represent
+ //
the mess that Acess once was)
//kb_lastChar = KB_ACK;
return;
}
//kb_lastChar = KB_ACK;
return;
}
-
+
// Layer +1
if(scancode == 0xE0) {
giKB_KeyLayer = 1;
// Layer +1
if(scancode == 0xE0) {
giKB_KeyLayer = 1;
@@
-93,7
+106,7
@@
void KB_IRQHandler()
giKB_KeyLayer = 2;
return;
}
giKB_KeyLayer = 2;
return;
}
-
+
#if KB_ALT_SCANCODES
if(scancode == 0xF0)
{
#if KB_ALT_SCANCODES
if(scancode == 0xF0)
{
@@
-107,32
+120,32
@@
void KB_IRQHandler()
gbKB_KeyUp = 1;
}
#endif
gbKB_KeyUp = 1;
}
#endif
-
+
// Translate
ch = gpKB_Map[giKB_KeyLayer][scancode];
//keyNum = giKB_KeyLayer * 256 + scancode;
// Check for unknown key
if(!ch && !gbKB_KeyUp)
// 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
// 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 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;
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 );
// Call callback
if(ch != 0 && gKB_Callback)
gKB_Callback( ch & 0x80000000 );
-
+
// Reset Layer
giKB_KeyLayer = 0;
return;
// Reset Layer
giKB_KeyLayer = 0;
return;
@@
-143,23
+156,29
@@
void KB_IRQHandler()
// Set shift key bits
if(ch == KEY_LSHIFT) gbKB_ShiftState |= 1;
if(ch == KEY_RSHIFT) gbKB_ShiftState |= 2;
// 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 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;
// Reset Layer
giKB_KeyLayer = 0;
// Ignore Non-Printable Characters
if(ch == 0) return;
-
+
// --- Check for Kernel Magic Combos
#if USE_KERNEL_MAGIC
// --- 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)
if(gbKB_MagicState == 3)
{
switch(ch)
@@
-169,7
+188,7
@@
void KB_IRQHandler()
}
}
#endif
}
}
#endif
-
+
// Is shift pressed
// - Darn ugly hacks !(!x) means (bool)x
if( !(!gbKB_ShiftState) ^ gbKB_CapsState)
// Is shift pressed
// - Darn ugly hacks !(!x) means (bool)x
if( !(!gbKB_ShiftState) ^ gbKB_CapsState)
@@
-204,7
+223,7
@@
void KB_IRQHandler()
break;
}
}
break;
}
}
-
+
if(gKB_Callback && ch != 0) gKB_Callback(ch);
}
if(gKB_Callback && ch != 0) gKB_Callback(ch);
}
@@
-215,12
+234,12
@@
void KB_IRQHandler()
void KB_UpdateLEDs()
{
Uint8 leds;
void KB_UpdateLEDs()
{
Uint8 leds;
-
+
leds = (gbKB_CapsState ? 4 : 0);
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, 0xED); // Send update command
-
+
while( inb(0x64) & 2 ); // Wait for bit 2 to unset
outb(0x60, leds);
}
while( inb(0x64) & 2 ); // Wait for bit 2 to unset
outb(0x60, leds);
}
@@
-237,7
+256,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;
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
// Sets the Keyboard Callback
case KB_IOCTL_SETCALLBACK:
// Sanity Check
@@
-247,7
+266,7
@@
int KB_IOCtl(tVFS_Node *Node, int Id, void *Data)
// Set Callback
gKB_Callback = Data;
return 1;
// Set Callback
gKB_Callback = Data;
return 1;
-
+
default:
return 0;
}
default:
return 0;
}
UCC
git Repository :: git.ucc.asn.au