Subversion Repositories HelenOS-historic

Rev

Rev 510 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 510 Rev 511
Line 34... Line 34...
34
#include <putchar.h>
34
#include <putchar.h>
35
#include <synch/spinlock.h>
35
#include <synch/spinlock.h>
36
#include <synch/waitq.h>
36
#include <synch/waitq.h>
37
#include <typedefs.h>
37
#include <typedefs.h>
38
 
38
 
39
static chardev_t kbrd;
-
 
40
 
-
 
41
static void keyboard_enable(void);
39
static void keyboard_enable(void);
-
 
40
static void keyboard_disable(void);
-
 
41
 
-
 
42
static chardev_t kbrd;
-
 
43
static chardev_operations_t ops = {
-
 
44
    .resume = keyboard_enable,
-
 
45
    .suspend = keyboard_disable
-
 
46
};
42
 
47
 
43
/** Initialize keyboard subsystem. */
48
/** Initialize keyboard subsystem. */
44
void keyboard_init(void)
49
void keyboard_init(void)
45
{
50
{
46
    cp0_unmask_int(KEYBOARD_IRQ);
51
    cp0_unmask_int(KEYBOARD_IRQ);
47
    chardev_initialize(&kbrd, keyboard_enable);
52
    chardev_initialize(&kbrd, &ops);
48
    stdin = &kbrd;
53
    stdin = &kbrd;
49
}
54
}
50
 
55
 
51
/** Process keyboard interrupt.
56
/** Process keyboard interrupt. */
52
 *
-
 
53
 * This function is called directly from the interrupt handler.
-
 
54
 * It feeds the keyboard buffer with characters read. When the buffer
-
 
55
 * is full, it simply masks the keyboard interrupt signal.
-
 
56
 */
-
 
57
void keyboard(void)
57
void keyboard(void)
58
{
58
{
59
    char ch;
59
    char ch;
60
 
60
 
61
    spinlock_lock(&kbrd.lock);
-
 
62
    kbrd.counter++;
-
 
63
    if (kbrd.counter == CHARDEV_BUFLEN - 1) {
-
 
64
            /* buffer full => disable keyboard interrupt */
-
 
65
        cp0_mask_int(KEYBOARD_IRQ);
-
 
66
    }
-
 
67
 
-
 
68
    ch = *((char *) KEYBOARD_ADDRESS);
61
    ch = *((char *) KEYBOARD_ADDRESS);
69
    putchar(ch);
-
 
70
    kbrd.buffer[kbrd.index++] = ch;
-
 
71
    kbrd.index = kbrd.index % CHARDEV_BUFLEN; /* index modulo size of buffer */
-
 
72
    waitq_wakeup(&kbrd.wq, WAKEUP_FIRST);
-
 
73
    spinlock_unlock(&kbrd.lock);
62
    chardev_push_character(&kbrd, ch);
74
}
63
}
75
 
64
 
76
/* Called from getc(). */
65
/* Called from getc(). */
77
void keyboard_enable(void)
66
void keyboard_enable(void)
78
{
67
{
79
    cp0_unmask_int(KEYBOARD_IRQ);
68
    cp0_unmask_int(KEYBOARD_IRQ);
80
}
69
}
-
 
70
 
-
 
71
/* Called from getc(). */
-
 
72
void keyboard_disable(void)
-
 
73
{
-
 
74
    cp0_mask_int(KEYBOARD_IRQ);
-
 
75
}