diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index cd60537a..c688e705 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -50,6 +50,7 @@ c/h/string.h \ c/h/errno.h \ c/h/error.h \ c/h/dirent.h \ +c/h/sys/keycodes.h \ c/h/sys/readdirents.h \ c/h/sys/stat.h \ c/h/sys/types.h \ diff --git a/libmaxsi/c/hsrc/sys/keycodes.h b/libmaxsi/c/hsrc/sys/keycodes.h new file mode 100644 index 00000000..1c297e4b --- /dev/null +++ b/libmaxsi/c/hsrc/sys/keycodes.h @@ -0,0 +1,32 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2012. + + 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 . + + keycodes.h + Defines codes for every logical key on keyboards. + +******************************************************************************/ + +#ifndef _SYS_KEYCODES_H +#define _SYS_KEYCODES_H 1 + +#include +#include + +#endif + diff --git a/sortix/Makefile b/sortix/Makefile index d3da7289..3799de0a 100644 --- a/sortix/Makefile +++ b/sortix/Makefile @@ -42,7 +42,7 @@ ifdef X86FAMILY CPUFLAGS:=$(CPUFLAGS) -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow endif -DIRS=. x64 x86 x86-family fs +DIRS=. x64 x86 x86-family fs kb kb/layout DEFINES:=-DSORTIX_KERNEL $(CPUDEFINES) ifeq ($(JSSORTIX),1) @@ -69,6 +69,9 @@ log.o \ utf8.o \ panic.o \ keyboard.o \ +kbapiadapter.o \ +kb/ps2.o \ +kb/layout/us.o \ scheduler.o \ syscall.o \ sound.o \ diff --git a/sortix/kb/layout/us.cpp b/sortix/kb/layout/us.cpp new file mode 100644 index 00000000..751a475c --- /dev/null +++ b/sortix/kb/layout/us.cpp @@ -0,0 +1,153 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011, 2012. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix 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 General Public License for more + details. + + You should have received a copy of the GNU General Public License along + with Sortix. If not, see . + + ks/layout/us.cpp + The United States keyboard layout. + +******************************************************************************/ + +#include "../../platform.h" +#include "../../keyboard.h" +#include "../../keycodes.h" +#include "us.h" + +namespace Sortix +{ + const unsigned MOD_LSHIFT = (1U<<0U); + const unsigned MOD_CAPS = (1U<<1U); + + const uint32_t LAYOUT_US[4UL*128UL] = + { + 0, 0, 0, 0, /* unused: kbkey 0 is invalid */ + 0, 0, 0, 0, /* KBKEY_ESC */ + '1', '!', '1', '!', + '2', '@', '2', '@', + '3', '#', '3', '#', + '4', '$', '4', '$', + '5', '%', '5', '%', + '6', '^', '6', '^', + '7', '&', '7', '&', + '8', '*', '8', '*', + '9', '(', '9', '(', + '0', ')', '0', ')', + '-', '_', '-', '_', + '=', '+', '=', '+', + '\b', '\b', '\b', '\b', + '\t', '\t', '\t', '\t', + 'q', 'Q', 'Q', 'q', + 'w', 'W', 'W', 'w', + 'e', 'E', 'E', 'e', + 'r', 'R', 'R', 'r', + 't', 'T', 'T', 't', + 'y', 'Y', 'Y', 'y', + 'u', 'U', 'U', 'u', + 'i', 'I', 'I', 'i', + 'o', 'O', 'O', 'o', + 'p', 'P', 'P', 'p', + '[', '{', '[', '{', + ']', '}', ']', '}', + '\n', '\n', '\n', '\n', + 0, 0, 0, 0, /* KBKEY_LCTRL */ + 'a', 'A', 'A', 'a', + 's', 'S', 'S', 's', + 'd', 'D', 'D', 'd', + 'f', 'F', 'F', 'f', + 'g', 'G', 'G', 'g', + 'h', 'H', 'H', 'h', + 'j', 'J', 'J', 'j', + 'k', 'K', 'K', 'k', + 'l', 'L', 'L', 'l', + ';', ':', ';', ':', + ':', '"', ':', '"', + '`', '~', '`', '~', + 0, 0, 0, 0, /* KBKEY_LSHIFT */ + '\\', '|', '\\', '|', + 'z', 'Z', 'Z', 'z', + 'x', 'X', 'X', 'x', + 'c', 'C', 'C', 'c', + 'v', 'V', 'V', 'v', + 'b', 'B', 'B', 'b', + 'n', 'N', 'N', 'n', + 'm', 'M', 'M', 'm', + ',', '<', ',', '<', + '.', '>', '.', '>', + '/', '?', '/', '?', + 0, 0, 0, 0, /* KBKEY_RSHIFT */ + '*', '*', '*', '*', + 0, 0, 0, 0, /* KBKEY_LALT */ + ' ', ' ', ' ', ' ', + 0, 0, 0, 0, /* KBKEY_CAPSLOCK */ + 0, 0, 0, 0, /* KBKEY_F1 */ + 0, 0, 0, 0, /* KBKEY_F2 */ + 0, 0, 0, 0, /* KBKEY_F3 */ + 0, 0, 0, 0, /* KBKEY_F4 */ + 0, 0, 0, 0, /* KBKEY_F5 */ + 0, 0, 0, 0, /* KBKEY_F6 */ + 0, 0, 0, 0, /* KBKEY_F7 */ + 0, 0, 0, 0, /* KBKEY_F8 */ + 0, 0, 0, 0, /* KBKEY_F9 */ + 0, 0, 0, 0, /* KBKEY_F10 */ + 0, 0, 0, 0, /* KBKEY_NUMLOCK */ + 0, 0, 0, 0, /* KBKEY_SCROLLLOCK */ + 0, 0, 0, 0, /* KBKEY_KPAD7 */ + 0, 0, 0, 0, /* KBKEY_KPAD8 */ + 0, 0, 0, 0, /* KBKEY_KPAD9 */ + '-', '-', '-', '-', + 0, 0, 0, 0, /* KBKEY_KPAD4 */ + 0, 0, 0, 0, /* KBKEY_KPAD5 */ + 0, 0, 0, 0, /* KBKEY_KPAD6 */ + '+', '+', '+', '+', + /* Nothing printable after this point */ + }; + + KBLayoutUS::KBLayoutUS() + { + modifiers = 0; + } + + KBLayoutUS::~KBLayoutUS() + { + } + + bool KBLayoutUS::ProcessModifier(int logickey, int modkey, unsigned flag) + { + if ( logickey == modkey ) { modifiers |= flag; return true; } + if ( logickey == -modkey ) { modifiers &= ~flag; return true; } + return false; + } + + uint32_t KBLayoutUS::Translate(int kbkey) + { + if ( kbkey == KBKEY_LSHIFT ) { modifiers |= MOD_LSHIFT; return 0; } + if ( kbkey == -KBKEY_LSHIFT ) { modifiers &= ~MOD_LSHIFT; return 0; } + if ( kbkey == KBKEY_CAPSLOCK ) { modifiers ^= MOD_CAPS; return 0; } + + int abskbkey = (kbkey < 0) ? -kbkey : kbkey; + + unsigned usedmods = modifiers & (MOD_LSHIFT | MOD_CAPS); + size_t index = (abskbkey<<2) | usedmods; + + // Check if the kbkey is outside the layout structure (not printable). + size_t numchars = sizeof(LAYOUT_US) / 4UL / sizeof(uint32_t); + if ( numchars < abskbkey ) { return 0; } + + return LAYOUT_US[index]; + } +} + diff --git a/sortix/kb/layout/us.h b/sortix/kb/layout/us.h new file mode 100644 index 00000000..cd72a5ec --- /dev/null +++ b/sortix/kb/layout/us.h @@ -0,0 +1,49 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011, 2012. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix 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 General Public License for more + details. + + You should have received a copy of the GNU General Public License along + with Sortix. If not, see . + + ks/layout/us.h + The United States keyboard layout. + +******************************************************************************/ + +#ifndef SORTIX_KB_LAYOUT_US_H +#define SORTIX_KB_LAYOUT_US_H + +#include "../../keyboard.h" + +namespace Sortix +{ + class KBLayoutUS : public KeyboardLayout + { + public: + KBLayoutUS(); + virtual ~KBLayoutUS(); + virtual uint32_t Translate(int kbkey); + + public: + bool ProcessModifier(int kbkey, int modkey, unsigned flag); + + private: + unsigned modifiers; + + }; +} + +#endif + diff --git a/sortix/kb/ps2.cpp b/sortix/kb/ps2.cpp new file mode 100644 index 00000000..a6db9ce0 --- /dev/null +++ b/sortix/kb/ps2.cpp @@ -0,0 +1,193 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011, 2012. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix 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 General Public License for more + details. + + You should have received a copy of the GNU General Public License along + with Sortix. If not, see . + + kb/ps2.cpp + A driver for the PS2 Keyboard. + +******************************************************************************/ + +#include "../platform.h" +#include +#include "../interrupt.h" +#include "../keyboard.h" +#include "../keycodes.h" +#include "ps2.h" + +using namespace Maxsi; + +namespace Sortix +{ + const uint16_t DATA = 0x0; + const uint16_t COMMAND = 0x0; + const uint16_t STATUS = 0x4; + const uint8_t CMD_SETLED = 0xED; + const uint8_t LED_SCRLCK = (1<<0); + const uint8_t LED_NUMLCK = (1<<1); + const uint8_t LED_CAPSLCK = (1<<2); + + void PS2Keyboard__OnInterrupt(CPU::InterruptRegisters* regs, void* user) + { + ((PS2Keyboard*) user)->OnInterrupt(regs); + } + + PS2Keyboard::PS2Keyboard(uint16_t iobase, uint8_t interrupt) + { + this->queue = NULL; + this->queuelength = 0; + this->queueoffset = 0; + this->queueused = 0; + this->owner = NULL; + this->ownerptr = NULL; + this->iobase = iobase; + this->interrupt = interrupt; + this->leds = 0; + this->scancodeescaped = false; + Interrupt::RegisterHandler(interrupt, PS2Keyboard__OnInterrupt, this); + + // If any scancodes were already pending, our interrupt handler will + // never be called. Let's just discard anything pending. + PopScancode(); + } + + PS2Keyboard::~PS2Keyboard() + { + Interrupt::RegisterHandler(interrupt, NULL, NULL); + delete[] queue; + } + + void PS2Keyboard::OnInterrupt(CPU::InterruptRegisters* /*regs*/) + { + uint8_t scancode = PopScancode(); + int kbkey = DecodeScancode(scancode); + if ( !kbkey ) { return; } + + if ( !PushKey(kbkey) ) + { + Log::PrintF("Warning: dropping keystroke due to insufficient " + "storage space in PS2 keyboard driver.\n"); + return; + } + + uint8_t newleds = leds; + + if ( kbkey == KBKEY_CAPSLOCK ) { newleds ^= LED_CAPSLCK; } + if ( kbkey == KBKEY_SCROLLLOCK ) { newleds ^= LED_SCRLCK; } + if ( kbkey == KBKEY_NUMLOCK ) { newleds ^= LED_NUMLCK; } + + if ( newleds != leds ) { UpdateLEDs(leds = newleds); } + + NotifyOwner(); + } + + void PS2Keyboard::NotifyOwner() + { + if ( !owner) { return; } + owner->OnKeystroke(this, ownerptr); + } + + int PS2Keyboard::DecodeScancode(uint8_t scancode) + { + const uint8_t SCANCODE_ESCAPE = 0xE0; + if ( scancode == SCANCODE_ESCAPE ) + { + scancodeescaped = true; + return 0; + } + + int offset = (scancodeescaped) ? 0x80 : 0; + int kbkey = scancode & 0x7F; + if ( scancode & 0x80 ) { kbkey = -kbkey - offset; } + else { kbkey = kbkey + offset; } + + scancodeescaped = false; + + // kbkey is now in the format specified in . + + return kbkey; + } + + uint8_t PS2Keyboard::PopScancode() + { + return CPU::InPortB(iobase + DATA); + } + + void PS2Keyboard::UpdateLEDs(int ledval) + { + while ( (CPU::InPortB(iobase + STATUS) & (1<<1)) != 0 ) { } + CPU::OutPortB(iobase + COMMAND, CMD_SETLED); + while ( (CPU::InPortB(iobase + STATUS) & (1<<1)) != 0 ) { } + CPU::OutPortB(iobase + COMMAND, ledval); + } + + void PS2Keyboard::SetOwner(KeyboardOwner* owner, void* user) + { + this->owner = owner; + this->ownerptr = user; + if ( queueused ) { NotifyOwner(); } + } + + bool PS2Keyboard::PushKey(int key) + { + // Check if we need to allocate or resize the circular queue. + if ( queueused == queuelength ) + { + size_t newqueuelength = (queuelength) ? queuelength * 2 : 32UL; + int* newqueue = new int[newqueuelength]; + if ( !newqueue ) { return false; } + size_t elemsize = sizeof(*queue); + size_t leadingavai = queuelength-queueoffset; + size_t leading = (leadingavai < queueused) ? leadingavai : queueused; + size_t trailing = queueused - leading; + Memory::Copy(newqueue, queue + queueoffset, leading * elemsize); + Memory::Copy(newqueue + leading, queue, trailing * elemsize); + delete[] queue; + queue = newqueue; + queuelength = newqueuelength; + queueoffset = 0; + } + + queue[(queueoffset + queueused++) % queuelength] = key; + return true; + } + + int PS2Keyboard::PopKey() + { + if ( !queueused ) { return 0; } + int kbkey = queue[queueoffset]; + queueoffset = (queueoffset + 1) % queuelength; + queueused--; + return kbkey; + } + + int PS2Keyboard::Read() + { + return PopKey(); + } + + size_t PS2Keyboard::GetPending() const + { + return queueused; + } + + bool PS2Keyboard::HasPending() const + { + return queueused; + } +} + diff --git a/sortix/kb/ps2.h b/sortix/kb/ps2.h new file mode 100644 index 00000000..feccb8f2 --- /dev/null +++ b/sortix/kb/ps2.h @@ -0,0 +1,69 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011, 2012. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix 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 General Public License for more + details. + + You should have received a copy of the GNU General Public License along + with Sortix. If not, see . + + kb/ps2.h + A driver for the PS2 Keyboard. + +******************************************************************************/ + +#ifndef SORTIX_KB_PS2_H +#define SORTIX_KB_PS2_H + +#include "../keyboard.h" + +namespace Sortix +{ + class PS2Keyboard : public Keyboard + { + public: + PS2Keyboard(uint16_t iobase, uint8_t interrupt); + virtual ~PS2Keyboard(); + virtual int Read(); + virtual size_t GetPending() const; + virtual bool HasPending() const; + virtual void SetOwner(KeyboardOwner* owner, void* user); + + public: + void OnInterrupt(CPU::InterruptRegisters* regs); + + private: + uint8_t PopScancode(); + int DecodeScancode(uint8_t scancode); + void UpdateLEDs(int ledval); + bool PushKey(int key); + int PopKey(); + void NotifyOwner(); + + private: + int* queue; + size_t queuelength; + size_t queueoffset; + size_t queueused; + KeyboardOwner* owner; + void* ownerptr; + uint16_t iobase; + uint8_t interrupt; + bool scancodeescaped; + uint8_t leds; + + }; +} + +#endif + diff --git a/sortix/kbapiadapter.cpp b/sortix/kbapiadapter.cpp new file mode 100644 index 00000000..3669c188 --- /dev/null +++ b/sortix/kbapiadapter.cpp @@ -0,0 +1,142 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2012. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix 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 General Public License for more + details. + + You should have received a copy of the GNU General Public License along + with Sortix. If not, see . + + kbapidapter.cpp + This class is a hack connecting the Keyboard and Keyboard layout classes + with the older and really bad Keyboard API. This class is intended to be + replaced by a real terminal driver working over /dev/tty descriptors. + +******************************************************************************/ + +#include "platform.h" +#include +#include "scheduler.h" // SIGINT +#include "keyboard.h" +#include "keycodes.h" +#include "kbapiadapter.h" + +namespace Sortix +{ + KBAPIAdapter::KBAPIAdapter(Keyboard* keyboard, KeyboardLayout* kblayout) + { + this->keyboard = keyboard; + this->kblayout = kblayout; + this->control = false; + this->queuelength = QUEUELENGTH; + this->queueused = 0; + this->queueoffset = 0; + keyboard->SetOwner(this, NULL); + } + + KBAPIAdapter::~KBAPIAdapter() + { + delete keyboard; + delete kblayout; + } + + void KBAPIAdapter::OnKeystroke(Keyboard* kb, void* /*user*/) + { + while ( kb->HasPending() ) + { + ProcessKeystroke(kb->Read()); + } + } + + void KBAPIAdapter::ProcessKeystroke(int kbkey) + { + if ( !kbkey ) { return; } + int abskbkey = (kbkey < 0) ? -kbkey : kbkey; + + uint32_t unicode = kblayout->Translate(kbkey); + + // Now translate the keystroke into the older API's charset.. + uint32_t maxsicode = (unicode) ? unicode : ToMaxsiCode(abskbkey); + + if ( kbkey < 0 ) { maxsicode |= Maxsi::Keyboard::DEPRESSED; } + + if ( kbkey == KBKEY_LCTRL ) { control = true; } + if ( kbkey == -KBKEY_LCTRL ) { control = false; } + if ( control && kbkey == KBKEY_C ) + { + Scheduler::SigIntHack(); + return; + } + + if ( !QueueKeystroke(maxsicode) ) + { + Log::PrintF("Warning: KBAPIAdapter driver dropping keystroke due " + "to insufficient buffer space\n"); + } + } + + uint32_t KBAPIAdapter::ToMaxsiCode(int abskbkey) + { + switch ( abskbkey ) + { + case KBKEY_ESC: return Maxsi::Keyboard::ESC; + case KBKEY_LCTRL: return Maxsi::Keyboard::CTRL; + case KBKEY_LSHIFT: return Maxsi::Keyboard::LSHFT; + case KBKEY_RSHIFT: return Maxsi::Keyboard::RSHFT; + case KBKEY_LALT: return Maxsi::Keyboard::ALT; + case KBKEY_F1: return Maxsi::Keyboard::F1; + case KBKEY_F2: return Maxsi::Keyboard::F2; + case KBKEY_F3: return Maxsi::Keyboard::F3; + case KBKEY_F4: return Maxsi::Keyboard::F4; + case KBKEY_F5: return Maxsi::Keyboard::F5; + case KBKEY_F6: return Maxsi::Keyboard::F6; + case KBKEY_F7: return Maxsi::Keyboard::F7; + case KBKEY_F8: return Maxsi::Keyboard::F8; + case KBKEY_F9: return Maxsi::Keyboard::F9; + case KBKEY_F10: return Maxsi::Keyboard::F10; + case KBKEY_F11: return Maxsi::Keyboard::F11; + case KBKEY_F12: return Maxsi::Keyboard::F12; + case KBKEY_SCROLLLOCK: return Maxsi::Keyboard::SCRLCK; + case KBKEY_HOME: return Maxsi::Keyboard::HOME; + case KBKEY_UP: return Maxsi::Keyboard::UP; + case KBKEY_LEFT: return Maxsi::Keyboard::LEFT; + case KBKEY_RIGHT: return Maxsi::Keyboard::RIGHT; + case KBKEY_DOWN: return Maxsi::Keyboard::DOWN; + case KBKEY_PGUP: return Maxsi::Keyboard::PGUP; + case KBKEY_PGDOWN: return Maxsi::Keyboard::PGDOWN; + case KBKEY_END: return Maxsi::Keyboard::END; + case KBKEY_INSERT: return Maxsi::Keyboard::INS; + case KBKEY_DELETE: return Maxsi::Keyboard::DEL; + case KBKEY_CAPSLOCK: return Maxsi::Keyboard::CAPS; + case KBKEY_RALT: return Maxsi::Keyboard::ALTGR; + case KBKEY_NUMLOCK: return Maxsi::Keyboard::NUMLCK; + default: return Maxsi::Keyboard::UNKNOWN; + } + } + + bool KBAPIAdapter::QueueKeystroke(uint32_t keystroke) + { + if ( queuelength <= queueused ) { return false; } + queue[(queueoffset + queueused++) % queuelength] = keystroke; + return true; + } + + uint32_t KBAPIAdapter::DequeueKeystroke() + { + if ( !queueused ) { return 0; } + uint32_t codepoint = queue[queueoffset++]; + queueoffset %= queuelength; + queueused--; + return codepoint; + } +} diff --git a/sortix/kbapiadapter.h b/sortix/kbapiadapter.h new file mode 100644 index 00000000..99f89bd7 --- /dev/null +++ b/sortix/kbapiadapter.h @@ -0,0 +1,63 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2012. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix 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 General Public License for more + details. + + You should have received a copy of the GNU General Public License along + with Sortix. If not, see . + + kbapidapter.h + This class is a hack connecting the Keyboard and Keyboard layout classes + with the older and really bad Keyboard API. This class is intended to be + replaced by a real terminal driver working over /dev/tty descriptors. + +******************************************************************************/ + +#ifndef SORTIX_KBAPIADAPTER_H +#define SORTIX_KBAPIADAPTER_H + +#include "keyboard.h" + +namespace Sortix +{ + class KBAPIAdapter : public KeyboardOwner + { + public: + KBAPIAdapter(Keyboard* keyboard, KeyboardLayout* kblayout); + virtual ~KBAPIAdapter(); + virtual void OnKeystroke(Keyboard* keyboard, void* user); + + public: + uint32_t DequeueKeystroke(); + + private: + void ProcessKeystroke(int kbkey); + bool QueueKeystroke(uint32_t keystroke); + static uint32_t ToMaxsiCode(int abskbkey); + + private: + Keyboard* keyboard; + KeyboardLayout* kblayout; + bool control; + static const size_t QUEUELENGTH = 1024UL; + size_t queuelength; + size_t queueused; + size_t queueoffset; + uint32_t queue[QUEUELENGTH]; + + }; +} + +#endif + diff --git a/sortix/keyboard.cpp b/sortix/keyboard.cpp index d49da226..f109d45b 100644 --- a/sortix/keyboard.cpp +++ b/sortix/keyboard.cpp @@ -1,6 +1,6 @@ /****************************************************************************** - COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011. + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2012. This file is part of Sortix. @@ -18,721 +18,39 @@ with Sortix. If not, see . keyboard.cpp - A driver for the PS2 Keyboard. + An interface to keyboards. ******************************************************************************/ #include "platform.h" -#include -#include -#include "log.h" -#include "panic.h" -#include "keyboard.h" #include "interrupt.h" -#include "scheduler.h" #include "syscall.h" - -using namespace Maxsi::Keyboard; +#include "keyboard.h" +#include "kb/ps2.h" +#include "kb/layout/us.h" +#include "kbapiadapter.h" namespace Sortix { - namespace Keyboard + KBAPIAdapter* tty; + + uint32_t SysReceiveKeystroke() { - namespace Layouts - { - namespace US - { - uint32_t sg[128] = - { - UNKNOWN, - ESC, - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - '0', - '-', - '=', - '\b', - '\t', - 'q', - 'w', - 'e', - 'r', - 't', - 'y', - 'u', - 'i', - 'o', - 'p', - '[', - ']', - '\n', - CTRL, - 'a', - 's', - 'd', - 'f', - 'g', - 'h', - 'j', - 'k', - 'l', - ';', - '\'', - '`', - LSHFT, - '\\', - 'z', - 'x', - 'c', - 'v', - 'b', - 'n', - 'm', - ',', - '.', - '/', - RSHFT, - '*', - ALT, - ' ', - CAPS, - F1, - F2, - F3, - F4, - F5, - F6, - F7, - F8, - F9, - F10, - NUMLCK, - SCRLCK, - HOME, - UP, - PGUP, - '-', - LEFT, - UNKNOWN, - RIGHT, - '+', - END, - DOWN, - PGDOWN, - INS, - DEL, - UNKNOWN, - UNKNOWN, - UNKNOWN, - F11, - F12, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - }; + return tty->DequeueKeystroke(); + } - uint32_t Sg[128] = - { - UNKNOWN, - ESC, - '!', - '@', - '#', - '$', - '%', - '^', - '&', - '*', - '(', - ')', - '_', - '+', - '\b', - '\t', // TODO: Make it de-tab! - 'Q', - 'W', - 'E', - 'R', - 'T', - 'Y', - 'U', - 'I', - 'O', - 'P', - '{', - '}', - '\n', - CTRL, - 'A', - 'S', - 'D', - 'F', - 'G', - 'H', - 'J', - 'K', - 'L', - ':', - '"', - '~', - LSHFT, - '|', - 'Z', - 'X', - 'C', - 'V', - 'B', - 'N', - 'M', - '<', - '>', - '?', - RSHFT, - '*', - ALT, - ' ', - CAPS, - F1, - F2, - F3, - F4, - F5, - F6, - F7, - F8, - F9, - F10, - NUMLCK, - SCRLCK, - HOME, - UP, - PGUP, - '-', - LEFT, - UNKNOWN, - RIGHT, - '+', - END, - DOWN, - PGDOWN, - INS, - DEL, - UNKNOWN, - UNKNOWN, - UNKNOWN, - F11, - F12, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - }; + void Keyboard::Init() + { + Keyboard* keyboard = new PS2Keyboard(0x60, Interrupt::IRQ1); + if ( !keyboard ) { Panic("Could not allocate PS2 Keyboard driver"); } - uint32_t sG[128] = - { - UNKNOWN, - ESC, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - '\b', - '\t', - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - '\n', - CTRL, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - LSHFT, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - RSHFT, - UNKNOWN, - ALT, - ' ', - CAPS, - F1, - F2, - F3, - F4, - F5, - F6, - F7, - F8, - F9, - F10, - NUMLCK, - SCRLCK, - HOME, - UP, - PGUP, - '-', - LEFT, - UNKNOWN, - RIGHT, - '+', - END, - DOWN, - PGDOWN, - INS, - DEL, - UNKNOWN, - UNKNOWN, - UNKNOWN, - F11, - F12, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - }; + KeyboardLayout* kblayout = new KBLayoutUS; + if ( !kblayout ) { Panic("Could not allocate keyboard layout driver"); } - uint32_t SG[128] = - { - UNKNOWN, - ESC, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - '\b', - '\t', - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - '\n', - CTRL, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - LSHFT, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - RSHFT, - UNKNOWN, - ALT, - ' ', - CAPS, - F1, - F2, - F3, - F4, - F5, - F6, - F7, - F8, - F9, - F10, - NUMLCK, - SCRLCK, - HOME, - UP, - PGUP, - '-', - LEFT, - UNKNOWN, - RIGHT, - '+', - END, - DOWN, - PGDOWN, - INS, - DEL, - UNKNOWN, - UNKNOWN, - UNKNOWN, - F11, - F12, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - UNKNOWN, - }; + tty = new KBAPIAdapter(keyboard, kblayout); + if ( !tty ) { Panic("Could not allocate a simple terminal"); } - uint32_t* Layout[4] = { sg, Sg, sG, SG }; - } - - uint32_t** Layout = US::Layout; - - nat Mask; - nat LockMask; - bool control; - - void Init() - { - Mask = 0; - LockMask = 0; - control = false; - } - - const nat Shift = (1<<0); - const nat AltGr = (1<<1); - const nat ScrLck = (1<<2); - const nat LEDScrLck = (1<<0); - const nat LEDNumLck = (1<<1); - const nat LEDCapsLck = (1<<2); - - uint32_t GetCodePoint(uint8_t Scancode) - { - nat TableIndex = 0x3 & (Mask ^ LockMask); - - //Log::PrintF("[m=%x,lm=%x,ti=%x]", Mask, LockMask, TableIndex); - - uint32_t CodePoint = Layout[TableIndex][Scancode & 0x7F]; - - if ( CodePoint == UNKNOWN ) { return UNKNOWN; } - if ( Scancode & 0x80 ) - { - if ( CodePoint == LSHFT ) { Mask &= ~Shift; } - if ( CodePoint == ALTGR ) { Mask &= ~AltGr; } - if ( CodePoint == SCRLCK ) { Mask &= ~ScrLck; } - if ( CodePoint == CTRL ) { control = false; } - } - else - { - if ( CodePoint == LSHFT ) { Mask |= Shift; } - if ( CodePoint == ALTGR ) { Mask |= AltGr; } - if ( CodePoint == SCRLCK ) { Mask |= ScrLck; } - if ( CodePoint == CAPS ) { LockMask ^= Shift; SetLEDs(LEDCapsLck); } - if ( CodePoint == CTRL ) { control = true; } - } - - if ( control && ( CodePoint == 'c' || CodePoint == 'C' ) ) - { - CodePoint = SIGINT; - } - - return CodePoint; - } - } - - uint8_t LEDs; - - size_t keystrokeQueueOffset; - size_t keystrokeQueueUsed; - size_t keystrokeQueueLength; - uint32_t* keystrokeQueue; - - uint32_t SysReceiveKeystroke() - { - if ( keystrokeQueueUsed == 0 ) { return 0; } - - uint32_t codepoint = keystrokeQueue[keystrokeQueueOffset++]; - keystrokeQueueOffset %= keystrokeQueueLength; - keystrokeQueueUsed--; - return codepoint; - } - - void Init() - { - // Initialize variables. - LEDs = 0; - - Layouts::Init(); - - // Register our keystroke callback. - Interrupt::RegisterHandler(Interrupt::IRQ1, OnIRQ1, NULL); - - // If any scancodes were already pending, our interrupt handler - // will never be called. Let's just discard anything pending. - 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"); - } - - Syscall::Register(SYSCALL_RECEIVE_KEYSTROKE, (void*) SysReceiveKeystroke); - } - - 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* user) - { - // Read the scancode from the data register. - uint8_t Scancode = CPU::InPortB(0x60); - - //Log::PrintF("[%u]", Scancode); - - uint32_t CodePoint = Layouts::GetCodePoint(Scancode); - - if ( CodePoint == SIGINT ) - { - Scheduler::SigIntHack(); - return; - } - - bool KeyUp = (Scancode & 0x80); - - if ( KeyUp ) { CodePoint |= DEPRESSED; } - - QueueKeystroke(CodePoint); - return; - - //if ( Reader != NULL ) { Reader->OnKeystroke(CodePoint, KeyUp); return; } - - // Use this to debug the exact scancodes you receive! - //Log::PrintF("[%u/U+%x]", Scancode, CodePoint); - - if ( CodePoint == UNKNOWN ) { Log::PrintF("^%u", Scancode);return; } - - if ( CodePoint & (1<<31) ) { return; } - - // The high bit of the scancode is set if the key is released. - if ( Scancode & 0x80 ) { return; } - - if ( CodePoint & 0xFFFFFF80 ) { Log::PrintF("U+%x", CodePoint); return; } - - Log::PrintF("%s", &CodePoint); // Little endian hack! - } - - void SetLEDs(uint8_t Toggle) - { - LEDs ^= Toggle; - - while ( (CPU::InPortB(0x64) & (1<<1)) != 0 ) { } //loop Until zero - CPU::OutPortB(0x60, 0xED); - while ( (CPU::InPortB(0x64) & (1<<1)) != 0 ) { } //loop Until zero - CPU::OutPortB(0x60, LEDs); - } + Syscall::Register(SYSCALL_RECEIVE_KEYSTROKE, (void*) SysReceiveKeystroke); } } diff --git a/sortix/keyboard.h b/sortix/keyboard.h index 37937d2a..1feb2b66 100644 --- a/sortix/keyboard.h +++ b/sortix/keyboard.h @@ -1,6 +1,6 @@ /****************************************************************************** - COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011. + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011, 2012. This file is part of Sortix. @@ -18,7 +18,7 @@ with Sortix. If not, see . keyboard.h - A driver for the PS2 Keyboard. + An interface to keyboards. ******************************************************************************/ @@ -27,13 +27,35 @@ namespace Sortix { - namespace Keyboard + class Keyboard; + class KeyboardOwner; + + class Keyboard { - void Init(); - void SetLEDs(uint8_t Toggle); - void OnIRQ1(CPU::InterruptRegisters* Regs, void* user); - bool QueueKeystroke(uint32_t keystroke); - } + public: + static void Init(); + + public: + virtual ~Keyboard() { } + virtual int Read() = 0; + virtual size_t GetPending() const = 0; + virtual bool HasPending() const = 0; + virtual void SetOwner(KeyboardOwner* owner, void* user) = 0; + }; + + class KeyboardOwner + { + public: + virtual ~KeyboardOwner() { } + virtual void OnKeystroke(Keyboard* keyboard, void* user) = 0; + }; + + class KeyboardLayout + { + public: + virtual ~KeyboardLayout() { } + virtual uint32_t Translate(int kbkey) = 0; + }; } #endif diff --git a/sortix/keycodes.h b/sortix/keycodes.h new file mode 100644 index 00000000..ab1e19ec --- /dev/null +++ b/sortix/keycodes.h @@ -0,0 +1,145 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2012. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix 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 General Public License for more + details. + + You should have received a copy of the GNU General Public License along + with Sortix. If not, see . + + keycodes.h + Defines codes for every logical key on keyboards. + +******************************************************************************/ + +#ifndef SORTIX_KEYCODES_H +#define SORTIX_KEYCODES_H + +/* Each of these keycodes corrospond to a logical key on a keyboard. Code + reading logical keystrokes from the keyboard will receive a code from this + list when the key is pressed, and a negative version of the same key when it + is released by the user. */ + +#define KBKEY_ESC 0x01 +#define KBKEY_NUM1 0x02 +#define KBKEY_NUM2 0x03 +#define KBKEY_NUM3 0x04 +#define KBKEY_NUM4 0x05 +#define KBKEY_NUM5 0x06 +#define KBKEY_NUM6 0x07 +#define KBKEY_NUM7 0x08 +#define KBKEY_NUM8 0x09 +#define KBKEY_NUM9 0x0A +#define KBKEY_NUM0 0x0B +#define KBKEY_SYM1 0x0C +#define KBKEY_SYM2 0x0D +#define KBKEY_BKSPC 0x0E +#define KBKEY_TAB 0x0F +#define KBKEY_Q 0x10 +#define KBKEY_W 0x11 +#define KBKEY_E 0x12 +#define KBKEY_R 0x13 +#define KBKEY_T 0x14 +#define KBKEY_Y 0x15 +#define KBKEY_U 0x16 +#define KBKEY_I 0x17 +#define KBKEY_O 0x18 +#define KBKEY_P 0x19 +#define KBKEY_SYM3 0x1A +#define KBKEY_SYM4 0x1B +#define KBKEY_ENTER 0x1C +#define KBKEY_LCTRL 0x1D +#define KBKEY_A 0x1E +#define KBKEY_S 0x1F +#define KBKEY_D 0x20 +#define KBKEY_F 0x21 +#define KBKEY_G 0x22 +#define KBKEY_H 0x23 +#define KBKEY_J 0x24 +#define KBKEY_K 0x25 +#define KBKEY_L 0x26 +#define KBKEY_SYM5 0x27 +#define KBKEY_SYM6 0x28 +#define KBKEY_SYM7 0x29 +#define KBKEY_LSHIFT 0x2A +#define KBKEY_SYM8 0x2B +#define KBKEY_Z 0x2C +#define KBKEY_X 0x2D +#define KBKEY_C 0x2E +#define KBKEY_V 0x2F +#define KBKEY_B 0x30 +#define KBKEY_N 0x31 +#define KBKEY_M 0x32 +#define KBKEY_SYM9 0x33 +#define KBKEY_SYM10 0x34 +#define KBKEY_SYM11 0x35 +#define KBKEY_RSHIFT 0x36 +#define KBKEY_SYM12 0x37 +#define KBKEY_LALT 0x38 +#define KBKEY_SPACE 0x39 +#define KBKEY_CAPSLOCK 0x3A +#define KBKEY_F1 0x3B +#define KBKEY_F2 0x3C +#define KBKEY_F3 0x3D +#define KBKEY_F4 0x3E +#define KBKEY_F5 0x3F +#define KBKEY_F6 0x40 +#define KBKEY_F7 0x41 +#define KBKEY_F8 0x42 +#define KBKEY_F9 0x43 +#define KBKEY_F10 0x44 +#define KBKEY_NUMLOCK 0x45 +#define KBKEY_SCROLLLOCK 0x46 +#define KBKEY_KPAD7 0x47 +#define KBKEY_KPAD8 0x48 +#define KBKEY_KPAD9 0x49 +#define KBKEY_SYM13 0x4A +#define KBKEY_KPAD4 0x4B +#define KBKEY_KPAD5 0x4C +#define KBKEY_KPAD6 0x4D +#define KBKEY_SYM14 0x4E +#define KBKEY_KPAD1 0x4F +#define KBKEY_KPAD2 0x50 +#define KBKEY_KPAD3 0x51 +#define KBKEY_KPAD0 0x52 +#define KBKEY_SYM15 0x53 +#define KBKEY_ALTSYSRQ 0x54 +#define KBKEY_NO_STANDARD_MEANING_1 0x55 /* Sometimes F11, F12, or even FN */ +#define KBKEY_NO_STANDARD_MEANING_2 0x56 /* Possibly Windows key? */ +#define KBKEY_F11 0x57 +#define KBKEY_F12 0x58 +/* [0x59, 0x7F] are not really standard. */ +#define KBKEY_KPADENTER (0x80 + 0x1C) +#define KBKEY_RCTRL (0x80 + 0x1D) +#define KBKEY_FAKELSHIFT (0x80 + 0x2A) +#define KBKEY_SYM16 (0x80 + 0x35) +#define KBKEY_FAKERSHIFT (0x80 + 0x36) +#define KBKEY_CTRLPRINTSCRN (0x80 + 0x37) +#define KBKEY_RALT (0x80 + 0x38) +#define KBKEY_CTRLBREAK (0x80 + 0x46) +#define KBKEY_HOME (0x80 + 0x47) +#define KBKEY_UP (0x80 + 0x48) +#define KBKEY_PGUP (0x80 + 0x49) +#define KBKEY_LEFT (0x80 + 0x4B) +#define KBKEY_RIGHT (0x80 + 0x4D) +#define KBKEY_END (0x80 + 0x4F) +#define KBKEY_DOWN (0x80 + 0x50) +#define KBKEY_PGDOWN (0x80 + 0x51) +#define KBKEY_INSERT (0x80 + 0x52) +#define KBKEY_DELETE (0x80 + 0x53) +#define KBKEY_LSUPER (0x80 + 0x5B) +#define KBKEY_RSUPER (0x80 + 0x5C) +#define KBKEY_MENU (0x80 + 0x5D) + +#endif + diff --git a/sortix/serialterminal.cpp b/sortix/serialterminal.cpp index 87b3ab6f..6e05008e 100644 --- a/sortix/serialterminal.cpp +++ b/sortix/serialterminal.cpp @@ -69,6 +69,13 @@ namespace Sortix int c; while ( (c=UART::TryPopChar()) != -1 ) { + #warning Support for hooking the serial input up against the keyboard API have broken + #if 0 + // TODO: This is no longer compatible with the keyboard API, so + // it has been commented out. Besides, JSSortix isn't really + // supported anyway. It'd be nice to refactor this into a + // SerialKeyboard class or something. + using namespace Maxsi::Keyboard; if ( !isEsc && c == '\e' ) { isEsc = true; continue; } @@ -121,6 +128,7 @@ namespace Sortix c &= ~(1<<7); c |= DEPRESSED; } Keyboard::QueueKeystroke(c); + #endif } }