/kernel/trunk/generic/src/console/console.c |
---|
39,6 → 39,30 |
chardev_t *stdin = NULL; |
chardev_t *stdout = NULL; |
/** Get character from character device. |
* |
* @param chardev Character device. |
* |
* @return Character read. |
*/ |
static __u8 _getc(chardev_t *chardev) |
{ |
__u8 ch; |
ipl_t ipl; |
waitq_sleep(&chardev->wq); |
ipl = interrupts_disable(); |
spinlock_lock(&chardev->lock); |
ch = chardev->buffer[(chardev->index - chardev->counter) % CHARDEV_BUFLEN]; |
chardev->counter--; |
spinlock_unlock(&chardev->lock); |
interrupts_restore(ipl); |
chardev->op->resume(chardev); |
return ch; |
} |
/** Get string from character device. |
* |
* Read characters from character device until first occurrence |
56,7 → 80,19 |
char ch; |
while (index < buflen) { |
ch = getc(chardev); |
ch = _getc(chardev); |
if (ch == '\b') { |
if (index > 0) { |
index--; |
/* Space backspace, space */ |
putchar('\b'); |
putchar(' '); |
putchar('\b'); |
} |
continue; |
} |
putchar(ch); |
if (ch == '\n') { /* end of string => write 0, return */ |
buf[index] = '\0'; |
return (count_t) index; |
66,27 → 102,13 |
return (count_t) index; |
} |
/** Get character from character device. |
* |
* @param chardev Character device. |
* |
* @return Character read. |
*/ |
/** Get character from device & echo it to screen */ |
__u8 getc(chardev_t *chardev) |
{ |
__u8 ch; |
ipl_t ipl; |
waitq_sleep(&chardev->wq); |
ipl = interrupts_disable(); |
spinlock_lock(&chardev->lock); |
ch = chardev->buffer[(chardev->index - chardev->counter) % CHARDEV_BUFLEN]; |
chardev->counter--; |
spinlock_unlock(&chardev->lock); |
interrupts_restore(ipl); |
chardev->op->resume(chardev); |
ch = _getc(chardev); |
putchar(ch); |
return ch; |
} |
/kernel/trunk/generic/src/console/chardev.c |
---|
62,7 → 62,6 |
chardev->op->suspend(chardev); |
} |
putchar(ch); |
chardev->buffer[chardev->index++] = ch; |
chardev->index = chardev->index % CHARDEV_BUFLEN; /* index modulo size of buffer */ |
waitq_wakeup(&chardev->wq, WAKEUP_FIRST); |
/kernel/trunk/arch/mips32/src/drivers/arc.c |
---|
209,7 → 209,9 |
} |
if (ch == '\r') |
ch = '\n'; |
if (ch == 0x7f) |
ch = '\b'; |
chardev_push_character(&console, ch); |
} |
/kernel/trunk/arch/mips32/src/drivers/msim.c |
---|
61,6 → 61,7 |
cp0_mask_int(MSIM_KBD_IRQ); |
} |
#include <print.h> |
/** Process keyboard interrupt. */ |
static void msim_interrupt(int n, void *stack) |
{ |
69,6 → 70,8 |
ch = *((char *) MSIM_KBD_ADDRESS); |
if (ch =='\r') |
ch = '\n'; |
if (ch == 0x7f) |
ch = '\b'; |
chardev_push_character(&console, ch); |
} |
/kernel/trunk/arch/ia32/src/drivers/i8042.c |
---|
81,7 → 81,7 |
SPECIAL, /* 0x00 */ |
SPECIAL, /* 0x01 - Esc */ |
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', |
SPECIAL, /* 0x0e - Backspace */ |
'\b', /* 0x0e - Backspace */ |
'\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', |
SPECIAL, /* 0x1d - LCtrl */ |
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', |
/kernel/trunk/arch/ia32/src/drivers/ega.c |
---|
99,13 → 99,17 |
spinlock_lock(&egalock); |
switch (ch) { |
case '\n': |
case '\n': |
ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW; |
break; |
case '\t': |
case '\t': |
ega_cursor = (ega_cursor + 8) - ega_cursor % 8; |
break; |
default: |
case '\b': |
if (ega_cursor % ROW) |
ega_cursor--; |
break; |
default: |
ega_display_char(ch); |
ega_cursor++; |
break; |