Cucumber/Kernel/src/Tier0_32/ps2.c

91 lines
1.7 KiB
C

// A Tier0-mode keyboard driver... this is gonna get ignored when we het (some
// day) into Tier1...
#include "types.h"
#include "Tier0/ps2.h"
#include "Tier0/kstdio.h"
#include "Tier0/interrupts.h"
#include "Tier0/kbd_layout.h"
#define PS2_KBD_IRQ
#define PS2_KBD_DATA 0x60
#define PS2_KEY_SHIFT 42
#define PS2_KEY_DEPRESSED(x) ((x >= 128) ? 1 : 0)
#define PS2_D_TO_P(x) (x - 128)
#define PS2_P_TO_D(x) (x | 128)
u8 ps2_special = 0;
u8 ps2_key_pressed = 0;
u8 ps2_key = 0;
u8 ps2_key_new = 0;
s8 ps2_getc(void)
{
while(1)
{
u8 Key = ps2_wait_key();
s8 Character = kbd_layout_translate(Key, ps2_special);
if (Character != 0)
return Character;
}
}
u8 ps2_poll_key(void)
{
if (ps2_key_pressed)
return ps2_key;
return 0;
}
u8 ps2_wait_key(void)
{
while(1)
{
if (ps2_key_pressed && ps2_key_new)
break;
}
ps2_key_new = 0;
return ps2_key;
}
void _ps2_keyboard_key_pressed(u8 Code)
{
if (Code == PS2_KEY_SHIFT)
ps2_special |= PS2_SPECIAL_SHIFT;
else// if (ps2_key_pressed == 0)
{
ps2_key_pressed = 1;
ps2_key = Code;
ps2_key_new = 1;
}
}
void _ps2_keyboard_key_depressed(u8 Code)
{
if (Code == PS2_KEY_SHIFT)
ps2_special &= ~PS2_SPECIAL_SHIFT;
else if (Code == ps2_key)
ps2_key_pressed = 0;
}
void ps2_keyboard_isr(void)
{
u8 ScanCode = kinb(PS2_KBD_DATA);
if (PS2_KEY_DEPRESSED(ScanCode))
_ps2_keyboard_key_depressed(PS2_D_TO_P(ScanCode));
else
_ps2_keyboard_key_pressed(ScanCode);
interrupts_irq_finish(0x01);
return;
}
void ps2_init_simple(void)
{
interrupts_setup_irq(0x01, ps2_keyboard_isr);
}