/kernel/trunk/arch/mips32/include/drivers/keyboard.h |
---|
37,6 → 37,6 |
extern void keyboard_init(void); |
extern void keyboard(void); |
extern void keyboard_poll(void); |
#endif |
/kernel/trunk/arch/mips32/include/drivers/arc.h |
---|
177,7 → 177,7 |
long (*open)(void); /* ... */ |
long (*close)(__u32 fileid); |
long (*read)(__u32 fileid,void *buf,__u32 n,__u32 *cnt); |
long (*getreadstatus)(); |
long (*getreadstatus)(__u32 fileid); |
long (*write)(__u32 fileid, void *buf,__u32 n,__u32 *cnt); |
long (*seek)(void); /* ... */ |
/* 30 */ |
212,5 → 212,5 |
extern int arc_enabled(void); |
extern void arc_putchar(char ch); |
extern void arc_print_devices(void); |
extern int arc_getchar(void); |
#endif |
/kernel/trunk/arch/mips32/src/interrupt.c |
---|
125,6 → 125,7 |
/* clear timer interrupt & set new */ |
cp0_compare_write(cp0_count_read() + cp0_compare_value); |
clock(); |
keyboard_poll(); |
break; |
} |
} |
/kernel/trunk/arch/mips32/src/drivers/keyboard.c |
---|
35,21 → 35,37 |
#include <synch/spinlock.h> |
#include <synch/waitq.h> |
#include <typedefs.h> |
#include <arch/drivers/arc.h> |
static void keyboard_enable(void); |
static void keyboard_disable(void); |
static void arc_kb_disable(void); |
static void arc_kb_enable(void); |
static chardev_t kbrd; |
static chardev_operations_t ops = { |
static chardev_operations_t arc_ops = { |
.resume = arc_kb_enable, |
.suspend = arc_kb_disable |
}; |
static chardev_operations_t msim_ops = { |
.resume = keyboard_enable, |
.suspend = keyboard_disable |
}; |
static int arc_kb_enabled; |
/** Initialize keyboard subsystem. */ |
void keyboard_init(void) |
{ |
cp0_unmask_int(KEYBOARD_IRQ); |
chardev_initialize(&kbrd, &ops); |
if (arc_enabled()) { |
chardev_initialize(&kbrd, &arc_ops); |
arc_kb_enabled = 1; |
} else { |
cp0_unmask_int(KEYBOARD_IRQ); |
chardev_initialize(&kbrd, &msim_ops); |
} |
stdin = &kbrd; |
} |
73,3 → 89,27 |
{ |
cp0_mask_int(KEYBOARD_IRQ); |
} |
/*****************************/ |
/* Arc keyboard */ |
void keyboard_poll(void) |
{ |
int ch; |
if (!arc_enabled() || !arc_kb_enabled) |
return; |
while ((ch = arc_getchar()) != -1) |
chardev_push_character(&kbrd, ch); |
} |
static void arc_kb_enable(void) |
{ |
arc_kb_enabled = 1; |
} |
/* Called from getc(). */ |
static void arc_kb_disable(void) |
{ |
arc_kb_enabled = 0; |
} |
/kernel/trunk/arch/mips32/src/drivers/arc.c |
---|
183,3 → 183,22 |
interrupts_restore(ipl); |
} |
/** Try to get character, return character or -1 if not available */ |
int arc_getchar(void) |
{ |
char ch; |
__u32 count; |
long result; |
if (arc_entry->getreadstatus(0)) |
return -1; |
result = arc_entry->read(0, &ch, 1, &count); |
if (result || count!=1) { |
cpu_halt(); |
return -1; |
} |
if (ch == '\r') |
return '\n'; |
return ch; |
} |