Added libmaxsi keyboard API, allowing user-space to use the keyboard.
This commit is contained in:
parent
ed2b3cb5c9
commit
4db550c13b
|
@ -44,8 +44,20 @@ c/h/stdio.h
|
||||||
|
|
||||||
COMMONOBJS=c++.o thread.o io.o memory.o string.o error.o format.o
|
COMMONOBJS=c++.o thread.o io.o memory.o string.o error.o format.o
|
||||||
SORTIXOBJS:=$(addprefix sortix/,$(COMMONOBJS))
|
SORTIXOBJS:=$(addprefix sortix/,$(COMMONOBJS))
|
||||||
LIBMAXSIOBJS:=$(COMMONOBJS) sortix-vga.o
|
LIBMAXSIOBJS:=$(COMMONOBJS) sortix-vga.o sortix-keyboard.o
|
||||||
HEADERS=error.h io.h memory.h platform.h string.h syscall.h thread.h types.h format.h sortix-vga.h
|
HEADERS=\
|
||||||
|
error.h \
|
||||||
|
io.h \
|
||||||
|
memory.h \
|
||||||
|
platform.h \
|
||||||
|
string.h \
|
||||||
|
syscall.h \
|
||||||
|
thread.h \
|
||||||
|
types.h \
|
||||||
|
format.h \
|
||||||
|
keyboard.h \
|
||||||
|
sortix-vga.h \
|
||||||
|
sortix-keyboard.h
|
||||||
|
|
||||||
OBJS:=$(LIBMAXSIOBJS)
|
OBJS:=$(LIBMAXSIOBJS)
|
||||||
BINS:=libmaxsi.so
|
BINS:=libmaxsi.so
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
/******************************************************************************
|
||||||
|
|
||||||
|
COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011.
|
||||||
|
|
||||||
|
This file is part of LibMaxsi.
|
||||||
|
|
||||||
|
LibMaxsi is free software: you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU Lesser General Public License as published by the Free
|
||||||
|
Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
|
||||||
|
more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with LibMaxsi. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
keyboard.h
|
||||||
|
Provides constants for various useful keys related to keyboard input.
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef LIBMAXSI_KEYBOARD_H
|
||||||
|
#define LIBMAXSI_KEYBOARD_H
|
||||||
|
|
||||||
|
namespace Maxsi
|
||||||
|
{
|
||||||
|
namespace Keyboard
|
||||||
|
{
|
||||||
|
const uint32_t UNKNOWN = 0x40000000;
|
||||||
|
const uint32_t ESC = 0x40000000 + 1;
|
||||||
|
const uint32_t CTRL = 0x40000000 + 2;
|
||||||
|
const uint32_t LSHFT = 0x40000000 + 3;
|
||||||
|
const uint32_t RSHFT = 0x40000000 + 4;
|
||||||
|
const uint32_t ALT = 0x40000000 + 5;
|
||||||
|
const uint32_t F1 = 0x40000000 + 6;
|
||||||
|
const uint32_t F2 = 0x40000000 + 7;
|
||||||
|
const uint32_t F3 = 0x40000000 + 8;
|
||||||
|
const uint32_t F4 = 0x40000000 + 9;
|
||||||
|
const uint32_t F5 = 0x40000000 + 10;
|
||||||
|
const uint32_t F6 = 0x40000000 + 11;
|
||||||
|
const uint32_t F7 = 0x40000000 + 12;
|
||||||
|
const uint32_t F8 = 0x40000000 + 13;
|
||||||
|
const uint32_t F9 = 0x40000000 + 14;
|
||||||
|
const uint32_t F10 = 0x40000000 + 15;
|
||||||
|
const uint32_t F11 = 0x40000000 + 16;
|
||||||
|
const uint32_t F12 = 0x40000000 + 17;
|
||||||
|
const uint32_t SCRLCK = 0x40000000 + 18;
|
||||||
|
const uint32_t HOME = 0x40000000 + 19;
|
||||||
|
const uint32_t UP = 0x40000000 + 20;
|
||||||
|
const uint32_t LEFT = 0x40000000 + 21;
|
||||||
|
const uint32_t RIGHT = 0x40000000 + 22;
|
||||||
|
const uint32_t DOWN = 0x40000000 + 23;
|
||||||
|
const uint32_t PGUP = 0x40000000 + 24;
|
||||||
|
const uint32_t PGDOWN = 0x40000000 + 25;
|
||||||
|
const uint32_t END = 0x40000000 + 26;
|
||||||
|
const uint32_t INS = 0x40000000 + 27;
|
||||||
|
const uint32_t DEL = 0x40000000 + 28;
|
||||||
|
const uint32_t CAPS = 0x40000000 + 29;
|
||||||
|
const uint32_t NONE = 0x40000000 + 30;
|
||||||
|
const uint32_t ALTGR = 0x40000000 + 31;
|
||||||
|
const uint32_t NUMLCK = 0x40000000 + 32;
|
||||||
|
const uint32_t DEPRESSED = (1<<31);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,47 @@
|
||||||
|
/******************************************************************************
|
||||||
|
|
||||||
|
COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011.
|
||||||
|
|
||||||
|
This file is part of LibMaxsi.
|
||||||
|
|
||||||
|
LibMaxsi is free software: you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU Lesser General Public License as published by the Free
|
||||||
|
Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
|
||||||
|
more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with LibMaxsi. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
sortix-keyboard.h
|
||||||
|
Provides access to the keyboard input meant for this process. This is highly
|
||||||
|
unportable and is very likely to be removed or changed radically.
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef LIBMAXSI_SORTIX_KEYBOARD_H
|
||||||
|
#define LIBMAXSI_SORTIX_KEYBOARD_H
|
||||||
|
|
||||||
|
#include <libmaxsi/platform.h>
|
||||||
|
#include <libmaxsi/keyboard.h>
|
||||||
|
|
||||||
|
namespace System
|
||||||
|
{
|
||||||
|
namespace Keyboard
|
||||||
|
{
|
||||||
|
// Receives the next pending 32-bit unicode character from the user's
|
||||||
|
// input device (truncated to 30-bits). Bit (1<<31) is set if the key
|
||||||
|
// was depressed. Bit (1<<30) is used for the various constants found
|
||||||
|
// in <libmaxsi/keyboard.h>. This is just a temporary API. Returns 0 if
|
||||||
|
// no character point was available at this time.
|
||||||
|
const unsigned WAIT = 0;
|
||||||
|
const unsigned POLL = 1;
|
||||||
|
uint32_t ReceieveKeystroke(unsigned method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,41 @@
|
||||||
|
/******************************************************************************
|
||||||
|
|
||||||
|
COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011.
|
||||||
|
|
||||||
|
This file is part of LibMaxsi.
|
||||||
|
|
||||||
|
LibMaxsi is free software: you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU Lesser General Public License as published by the Free
|
||||||
|
Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
|
||||||
|
more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with LibMaxsi. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
sortix-keyboard.cpp
|
||||||
|
Provides access to the keyboard input meant for this process. This is highly
|
||||||
|
unportable and is very likely to be removed or changed radically.
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "platform.h"
|
||||||
|
#include "syscall.h"
|
||||||
|
|
||||||
|
namespace System
|
||||||
|
{
|
||||||
|
namespace Keyboard
|
||||||
|
{
|
||||||
|
DEFN_SYSCALL1(uint32_t, SysReceieveKeystroke, 8, unsigned);
|
||||||
|
|
||||||
|
uint32_t ReceieveKeystroke(unsigned method)
|
||||||
|
{
|
||||||
|
return SysReceieveKeystroke(method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -51,9 +51,9 @@ const char* exceptions[] = { "Divide by zero", "Debug", "Non maskable interrupt"
|
||||||
extern "C" void irq_handler(Sortix::CPU::InterruptRegisters* Regs)
|
extern "C" void irq_handler(Sortix::CPU::InterruptRegisters* Regs)
|
||||||
{
|
{
|
||||||
#ifdef PLATFORM_X86
|
#ifdef PLATFORM_X86
|
||||||
if ( Regs->int_no != 32 )
|
if ( Regs->int_no != 32 && Regs->int_no != 33 )
|
||||||
{
|
{
|
||||||
Sortix::Log::PrintF("IRQ eax=%u, int_no=%u, err_code=%u, eip=0x%x!\n", Regs->eax, Regs->int_no, Regs->err_code, Regs->eip);
|
//Sortix::Log::PrintF("IRQ eax=%u, int_no=%u, err_code=%u, eip=0x%x!\n", Regs->eax, Regs->int_no, Regs->err_code, Regs->eip);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( Regs->int_no < 32 || 48 < Regs->int_no ) { Sortix::PanicF("IRQ eax=%u, int_no=%u, err_code=%u, eip=%u!", Regs->eax, Regs->int_no, Regs->err_code, Regs->eip); }
|
if ( Regs->int_no < 32 || 48 < Regs->int_no ) { Sortix::PanicF("IRQ eax=%u, int_no=%u, err_code=%u, eip=%u!", Regs->eax, Regs->int_no, Regs->err_code, Regs->eip); }
|
||||||
|
|
|
@ -218,10 +218,6 @@ namespace Sortix
|
||||||
|
|
||||||
if ( BootInfo == NULL ) { Panic("kernel.cpp: The bootinfo structure was NULL. Are your bootloader multiboot compliant?"); }
|
if ( BootInfo == NULL ) { Panic("kernel.cpp: The bootinfo structure was NULL. Are your bootloader multiboot compliant?"); }
|
||||||
|
|
||||||
|
|
||||||
// Initialize the keyboard.
|
|
||||||
Keyboard::Init();
|
|
||||||
|
|
||||||
#ifdef PLATFORM_VIRTUAL_MEMORY
|
#ifdef PLATFORM_VIRTUAL_MEMORY
|
||||||
// Initialize virtual memory. TODO: This is not fully working yet.
|
// Initialize virtual memory. TODO: This is not fully working yet.
|
||||||
VirtualMemory::Init();
|
VirtualMemory::Init();
|
||||||
|
@ -232,6 +228,8 @@ namespace Sortix
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
// Initialize the keyboard.
|
||||||
|
Keyboard::Init();
|
||||||
|
|
||||||
// Initialize system calls.
|
// Initialize system calls.
|
||||||
Syscall::Init();
|
Syscall::Init();
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
#include "globals.h"
|
#include <libmaxsi/memory.h>
|
||||||
#include "iprintable.h"
|
#include <libmaxsi/keyboard.h>
|
||||||
#include "iirqhandler.h"
|
#include "iirqhandler.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
|
@ -33,46 +33,14 @@
|
||||||
|
|
||||||
#include "pong.h"
|
#include "pong.h"
|
||||||
|
|
||||||
|
using namespace Maxsi::Keyboard;
|
||||||
|
|
||||||
namespace Sortix
|
namespace Sortix
|
||||||
{
|
{
|
||||||
namespace Keyboard
|
namespace Keyboard
|
||||||
{
|
{
|
||||||
namespace Layouts
|
namespace Layouts
|
||||||
{
|
{
|
||||||
const uint32_t UNKNOWN = 0xFFFFFFFF;
|
|
||||||
const uint32_t ESC = 0xFFFFFFFF - 1;
|
|
||||||
const uint32_t CTRL = 0xFFFFFFFF - 2;
|
|
||||||
const uint32_t LSHFT = 0xFFFFFFFF - 3;
|
|
||||||
const uint32_t RSHFT = 0xFFFFFFFF - 4;
|
|
||||||
const uint32_t ALT = 0xFFFFFFFF - 5;
|
|
||||||
const uint32_t F1 = 0xFFFFFFFF - 6;
|
|
||||||
const uint32_t F2 = 0xFFFFFFFF - 7;
|
|
||||||
const uint32_t F3 = 0xFFFFFFFF - 8;
|
|
||||||
const uint32_t F4 = 0xFFFFFFFF - 9;
|
|
||||||
const uint32_t F5 = 0xFFFFFFFF - 10;
|
|
||||||
const uint32_t F6 = 0xFFFFFFFF - 11;
|
|
||||||
const uint32_t F7 = 0xFFFFFFFF - 12;
|
|
||||||
const uint32_t F8 = 0xFFFFFFFF - 13;
|
|
||||||
const uint32_t F9 = 0xFFFFFFFF - 14;
|
|
||||||
const uint32_t F10 = 0xFFFFFFFF - 15;
|
|
||||||
const uint32_t F11 = 0xFFFFFFFF - 16;
|
|
||||||
const uint32_t F12 = 0xFFFFFFFF - 17;
|
|
||||||
const uint32_t SCRLCK = 0xFFFFFFFF - 18;
|
|
||||||
const uint32_t HOME = 0xFFFFFFFF - 19;
|
|
||||||
const uint32_t UP = 0xFFFFFFFF - 20;
|
|
||||||
const uint32_t LEFT = 0xFFFFFFFF - 21;
|
|
||||||
const uint32_t RIGHT = 0xFFFFFFFF - 22;
|
|
||||||
const uint32_t DOWN = 0xFFFFFFFF - 23;
|
|
||||||
const uint32_t PGUP = 0xFFFFFFFF - 24;
|
|
||||||
const uint32_t PGDOWN = 0xFFFFFFFF - 25;
|
|
||||||
const uint32_t END = 0xFFFFFFFF - 26;
|
|
||||||
const uint32_t INS = 0xFFFFFFFF - 27;
|
|
||||||
const uint32_t DEL = 0xFFFFFFFF - 28;
|
|
||||||
const uint32_t CAPS = 0xFFFFFFFF - 29;
|
|
||||||
const uint32_t NONE = 0xFFFFFFFF - 30;
|
|
||||||
const uint32_t ALTGR = 0xFFFFFFFF - 31;
|
|
||||||
const uint32_t NUMLCK = 0xFFFFFFFF - 32;
|
|
||||||
|
|
||||||
namespace US
|
namespace US
|
||||||
{
|
{
|
||||||
uint32_t sg[128] =
|
uint32_t sg[128] =
|
||||||
|
@ -647,6 +615,11 @@ namespace Sortix
|
||||||
|
|
||||||
uint8_t LEDs;
|
uint8_t LEDs;
|
||||||
|
|
||||||
|
size_t keystrokeQueueOffset;
|
||||||
|
size_t keystrokeQueueUsed;
|
||||||
|
size_t keystrokeQueueLength;
|
||||||
|
uint32_t* keystrokeQueue;
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
// Initialize variables.
|
// Initialize variables.
|
||||||
|
@ -658,6 +631,30 @@ namespace Sortix
|
||||||
// If any scancodes were already pending, our interrupt handler
|
// If any scancodes were already pending, our interrupt handler
|
||||||
// will never be called. Let's just discard anything pending.
|
// will never be called. Let's just discard anything pending.
|
||||||
CPU::InPortB(0x60);
|
CPU::InPortB(0x60);
|
||||||
|
|
||||||
|
// Create a queue where pending keystrokes can be stored until
|
||||||
|
// user-space applications access them.
|
||||||
|
keystrokeQueueUsed = 0;
|
||||||
|
keystrokeQueueOffset = 0;
|
||||||
|
keystrokeQueueLength = 1024ULL;
|
||||||
|
keystrokeQueue = new uint32_t[keystrokeQueueLength];
|
||||||
|
if ( keystrokeQueue == NULL )
|
||||||
|
{
|
||||||
|
Panic("Could not allocate keystroke buffer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QueueKeystroke(uint32_t keystroke)
|
||||||
|
{
|
||||||
|
if ( keystrokeQueueLength <= keystrokeQueueUsed ) { return false; }
|
||||||
|
|
||||||
|
size_t position = keystrokeQueueOffset + keystrokeQueueUsed;
|
||||||
|
position %= keystrokeQueueLength;
|
||||||
|
keystrokeQueueUsed++;
|
||||||
|
|
||||||
|
keystrokeQueue[position] = keystroke;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnIRQ1(CPU::InterruptRegisters* Regs)
|
void OnIRQ1(CPU::InterruptRegisters* Regs)
|
||||||
|
@ -671,6 +668,11 @@ namespace Sortix
|
||||||
|
|
||||||
bool KeyUp = (Scancode & 0x80) > 0;
|
bool KeyUp = (Scancode & 0x80) > 0;
|
||||||
|
|
||||||
|
if ( KeyUp ) { CodePoint |= DEPRESSED; }
|
||||||
|
|
||||||
|
QueueKeystroke(CodePoint);
|
||||||
|
return;
|
||||||
|
|
||||||
#if PONG
|
#if PONG
|
||||||
Pong::OnKeystroke(CodePoint, KeyUp); return;
|
Pong::OnKeystroke(CodePoint, KeyUp); return;
|
||||||
#endif
|
#endif
|
||||||
|
@ -683,7 +685,7 @@ namespace Sortix
|
||||||
// Use this to debug the exact scancodes you receive!
|
// Use this to debug the exact scancodes you receive!
|
||||||
//Log::PrintF("[%u/U+%x]", Scancode, CodePoint);
|
//Log::PrintF("[%u/U+%x]", Scancode, CodePoint);
|
||||||
|
|
||||||
if ( CodePoint == Layouts::UNKNOWN ) { Log::PrintF("^%u", Scancode);return; }
|
if ( CodePoint == UNKNOWN ) { Log::PrintF("^%u", Scancode);return; }
|
||||||
|
|
||||||
if ( CodePoint & (1<<31) ) { return; }
|
if ( CodePoint & (1<<31) ) { return; }
|
||||||
|
|
||||||
|
@ -704,6 +706,23 @@ namespace Sortix
|
||||||
while ( (CPU::InPortB(0x64) & (1<<1)) != 0 ) { } //loop Until zero
|
while ( (CPU::InPortB(0x64) & (1<<1)) != 0 ) { } //loop Until zero
|
||||||
CPU::OutPortB(0x60, LEDs);
|
CPU::OutPortB(0x60, LEDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SysReceieveKeystroke(CPU::InterruptRegisters* R)
|
||||||
|
{
|
||||||
|
uint32_t codepoint;
|
||||||
|
if ( keystrokeQueueUsed == 0 )
|
||||||
|
{
|
||||||
|
codepoint = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
codepoint = keystrokeQueue[keystrokeQueueOffset];
|
||||||
|
keystrokeQueueOffset++;
|
||||||
|
keystrokeQueueOffset %= keystrokeQueueLength;
|
||||||
|
keystrokeQueueUsed--;
|
||||||
|
}
|
||||||
|
R->eax = codepoint;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ namespace Sortix
|
||||||
void Init();
|
void Init();
|
||||||
void SetLEDs(uint8_t Toggle);
|
void SetLEDs(uint8_t Toggle);
|
||||||
void OnIRQ1(CPU::InterruptRegisters* Regs);
|
void OnIRQ1(CPU::InterruptRegisters* Regs);
|
||||||
|
void SysReceieveKeystroke(CPU::InterruptRegisters* R);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
#include "vga.h"
|
#include "vga.h"
|
||||||
|
#include "keyboard.h"
|
||||||
|
|
||||||
namespace Sortix
|
namespace Sortix
|
||||||
{
|
{
|
||||||
|
@ -48,7 +49,7 @@ namespace Sortix
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t NumSyscalls = 8;
|
const size_t NumSyscalls = 9;
|
||||||
const Syscall Syscalls[NumSyscalls] =
|
const Syscall Syscalls[NumSyscalls] =
|
||||||
{
|
{
|
||||||
&Scheduler::SysCreateThread,
|
&Scheduler::SysCreateThread,
|
||||||
|
@ -59,6 +60,7 @@ namespace Sortix
|
||||||
&VGA::SysCreateFrame,
|
&VGA::SysCreateFrame,
|
||||||
&VGA::SysChangeFrame,
|
&VGA::SysChangeFrame,
|
||||||
&VGA::SysDeleteFrame,
|
&VGA::SysDeleteFrame,
|
||||||
|
&Keyboard::SysReceieveKeystroke,
|
||||||
};
|
};
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
|
|
Loading…
Reference in New Issue