mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Thread secured the keyboard driver.
This commit is contained in:
parent
af015491db
commit
bf07674d7a
2 changed files with 49 additions and 11 deletions
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
/*******************************************************************************
|
||||
|
||||
COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011, 2012.
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2011, 2012.
|
||||
|
||||
This file is part of Sortix.
|
||||
|
||||
|
@ -14,13 +14,13 @@
|
|||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
Sortix. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
kb/ps2.cpp
|
||||
A driver for the PS2 Keyboard.
|
||||
|
||||
******************************************************************************/
|
||||
*******************************************************************************/
|
||||
|
||||
#include <sortix/kernel/platform.h>
|
||||
#include <libmaxsi/memory.h>
|
||||
|
@ -58,6 +58,7 @@ namespace Sortix
|
|||
this->interrupt = interrupt;
|
||||
this->leds = 0;
|
||||
this->scancodeescaped = false;
|
||||
this->kblock = KTHREAD_MUTEX_INITIALIZER;
|
||||
Interrupt::RegisterHandler(interrupt, PS2Keyboard__OnInterrupt, this);
|
||||
|
||||
// If any scancodes were already pending, our interrupt handler will
|
||||
|
@ -71,16 +72,43 @@ namespace Sortix
|
|||
delete[] queue;
|
||||
}
|
||||
|
||||
struct PS2KeyboardWork
|
||||
{
|
||||
PS2Keyboard* kb;
|
||||
uint8_t scancode;
|
||||
};
|
||||
|
||||
static void PS2Keyboard__InterruptWork(void* payload, size_t size)
|
||||
{
|
||||
ASSERT(size == sizeof(PS2KeyboardWork));
|
||||
PS2KeyboardWork* work = (PS2KeyboardWork*) payload;
|
||||
work->kb->InterruptWork(work->scancode);
|
||||
}
|
||||
|
||||
void PS2Keyboard::OnInterrupt(CPU::InterruptRegisters* /*regs*/)
|
||||
{
|
||||
uint8_t scancode = PopScancode();
|
||||
#ifdef GOT_ACTUAL_KTHREAD
|
||||
PS2KeyboardWork work;
|
||||
work.kb = this;
|
||||
work.scancode = scancode;
|
||||
Interrupt::ScheduleWork(PS2Keyboard__InterruptWork, &work, sizeof(work));
|
||||
#else
|
||||
InterruptWork(scancode);
|
||||
#endif
|
||||
}
|
||||
|
||||
void PS2Keyboard::InterruptWork(uint8_t scancode)
|
||||
{
|
||||
kthread_mutex_lock(&kblock);
|
||||
int kbkey = DecodeScancode(scancode);
|
||||
if ( !kbkey ) { return; }
|
||||
if ( !kbkey ) { kthread_mutex_unlock(&kblock); return; }
|
||||
|
||||
if ( !PushKey(kbkey) )
|
||||
{
|
||||
Log::PrintF("Warning: dropping keystroke due to insufficient "
|
||||
"storage space in PS2 keyboard driver.\n");
|
||||
kthread_mutex_unlock(&kblock);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -92,6 +120,8 @@ namespace Sortix
|
|||
|
||||
if ( newleds != leds ) { UpdateLEDs(leds = newleds); }
|
||||
|
||||
kthread_mutex_unlock(&kblock);
|
||||
|
||||
NotifyOwner();
|
||||
}
|
||||
|
||||
|
@ -137,8 +167,10 @@ namespace Sortix
|
|||
|
||||
void PS2Keyboard::SetOwner(KeyboardOwner* owner, void* user)
|
||||
{
|
||||
kthread_mutex_lock(&kblock);
|
||||
this->owner = owner;
|
||||
this->ownerptr = user;
|
||||
kthread_mutex_unlock(&kblock);
|
||||
if ( queueused ) { NotifyOwner(); }
|
||||
}
|
||||
|
||||
|
@ -177,16 +209,19 @@ namespace Sortix
|
|||
|
||||
int PS2Keyboard::Read()
|
||||
{
|
||||
ScopedLock lock(&kblock);
|
||||
return PopKey();
|
||||
}
|
||||
|
||||
size_t PS2Keyboard::GetPending() const
|
||||
{
|
||||
ScopedLock lock(&kblock);
|
||||
return queueused;
|
||||
}
|
||||
|
||||
bool PS2Keyboard::HasPending() const
|
||||
{
|
||||
ScopedLock lock(&kblock);
|
||||
return queueused;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
/*******************************************************************************
|
||||
|
||||
COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011, 2012.
|
||||
Copyright(C) Jonas 'Sortie' Termansen 2011, 2012.
|
||||
|
||||
This file is part of Sortix.
|
||||
|
||||
|
@ -14,17 +14,18 @@
|
|||
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 <http://www.gnu.org/licenses/>.
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
Sortix. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
kb/ps2.h
|
||||
A driver for the PS2 Keyboard.
|
||||
|
||||
******************************************************************************/
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef SORTIX_KB_PS2_H
|
||||
#define SORTIX_KB_PS2_H
|
||||
|
||||
#include <sortix/kernel/kthread.h>
|
||||
#include "../keyboard.h"
|
||||
|
||||
namespace Sortix
|
||||
|
@ -41,6 +42,7 @@ namespace Sortix
|
|||
|
||||
public:
|
||||
void OnInterrupt(CPU::InterruptRegisters* regs);
|
||||
void InterruptWork(uint8_t scancode);
|
||||
|
||||
private:
|
||||
uint8_t PopScancode();
|
||||
|
@ -61,6 +63,7 @@ namespace Sortix
|
|||
uint8_t interrupt;
|
||||
bool scancodeescaped;
|
||||
uint8_t leds;
|
||||
mutable kthread_mutex_t kblock;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue