44,8 → 44,9 |
#include <proc/thread.h> |
#include <synch/spinlock.h> |
#include <arch/asm.h> |
#include <arch/drivers/kbd.h> |
|
#define SKI_KBD_INR 0 |
#define SKI_KBD_INR 0 |
|
static irq_t ski_kbd_irq; |
static devno_t ski_kbd_devno; |
55,9 → 56,6 |
|
static bool kbd_disabled; |
|
static void ski_putchar(chardev_t *d, const char ch); |
static int32_t ski_getchar(void); |
|
/** Display character on debug console |
* |
* Use SSC (Simulator System Call) to |
66,19 → 64,21 |
* @param d Character device. |
* @param ch Character to be printed. |
*/ |
void ski_putchar(chardev_t *d, const char ch) |
static void ski_putchar(chardev_t *d, const char ch, bool silent) |
{ |
asm volatile ( |
"mov r15 = %0\n" |
"mov r32 = %1\n" /* r32 is in0 */ |
"break 0x80000\n" /* modifies r8 */ |
: |
: "i" (SKI_PUTCHAR), "r" (ch) |
: "r15", "in0", "r8" |
); |
|
if (ch == '\n') |
ski_putchar(d, '\r'); |
if (!silent) { |
asm volatile ( |
"mov r15 = %0\n" |
"mov r32 = %1\n" /* r32 is in0 */ |
"break 0x80000\n" /* modifies r8 */ |
: |
: "i" (SKI_PUTCHAR), "r" (ch) |
: "r15", "in0", "r8" |
); |
|
if (ch == '\n') |
ski_putchar(d, '\r', false); |
} |
} |
|
/** Ask debug console if a key was pressed. |
90,7 → 90,7 |
* |
* @return ASCII code of pressed key or 0 if no key pressed. |
*/ |
int32_t ski_getchar(void) |
static int32_t ski_getchar(void) |
{ |
uint64_t ch; |
|
114,10 → 114,10 |
static char ski_getchar_blocking(chardev_t *d) |
{ |
int ch; |
|
while(!(ch = ski_getchar())) |
; |
if(ch == '\r') |
|
while(!(ch = ski_getchar())); |
|
if (ch == '\r') |
ch = '\n'; |
return (char) ch; |
} |
128,23 → 128,24 |
char ch; |
static char last; |
ipl_t ipl; |
|
|
ipl = interrupts_disable(); |
|
|
if (kbd_disabled) { |
interrupts_restore(ipl); |
return; |
} |
|
|
spinlock_lock(&ski_kbd_irq.lock); |
|
|
ch = ski_getchar(); |
if(ch == '\r') |
ch = '\n'; |
if (ch) { |
if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { |
if (ski_kbd_irq.notif_cfg.notify && |
ski_kbd_irq.notif_cfg.answerbox) { |
chardev_push_character(&ski_uconsole, ch); |
ipc_irq_send_notif(&ski_kbd_irq); |
/* XXX: send notification to userspace */ |
} else { |
chardev_push_character(&ski_console, ch); |
} |
155,9 → 156,10 |
} |
|
if (last) { |
if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { |
if (ski_kbd_irq.notif_cfg.notify && |
ski_kbd_irq.notif_cfg.answerbox) { |
chardev_push_character(&ski_uconsole, 0); |
ipc_irq_send_notif(&ski_kbd_irq); |
/* XXX: send notification to userspace */ |
} |
last = 0; |
} |
175,7 → 177,7 |
/* Called from getc(). */ |
static void ski_kbd_disable(chardev_t *d) |
{ |
kbd_disabled = true; |
kbd_disabled = true; |
} |
|
/** Decline to service hardware IRQ. |
184,7 → 186,7 |
* |
* @return Always IRQ_DECLINE. |
*/ |
static irq_ownership_t ski_kbd_claim(void) |
static irq_ownership_t ski_kbd_claim(irq_t *irq) |
{ |
return IRQ_DECLINE; |
} |
227,6 → 229,9 |
sysinfo_set_item_val("kbd", NULL, true); |
sysinfo_set_item_val("kbd.inr", NULL, SKI_KBD_INR); |
sysinfo_set_item_val("kbd.devno", NULL, ski_kbd_devno); |
sysinfo_set_item_val("kbd.type", NULL, KBD_SKI); |
|
sysinfo_set_item_val("fb", NULL, false); |
} |
|
void ski_kbd_grab(void) |
255,7 → 260,9 |
void kkbdpoll(void *arg) |
{ |
while (1) { |
poll_keyboard(); |
if (!silent) { |
poll_keyboard(); |
} |
thread_usleep(POLL_INTERVAL); |
} |
} |